From 66fb98ee303fbeb6fb0c7e1afa0103fd5fd83bf2 Mon Sep 17 00:00:00 2001 From: Harsh Pandhe Date: Sun, 24 May 2026 13:23:23 +0530 Subject: [PATCH 01/21] fix(docs): correct relative path for embedded 3-D twin iframes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mkdocs use_directory_urls renders the page at /case_studies// but the twin.html lives at /case_studies/_outputs/twin.html — one level up. The iframe src was _outputs/twin.html, which resolved to /case_studies//_outputs/twin.html and 404'd. Prefix with ../ so the path resolves correctly on all 12 case-study pages. --- docs/case_studies/aiguille_du_midi.md | 2 +- docs/case_studies/cablebus_linea2.md | 2 +- docs/case_studies/funitel_peclet.md | 2 +- docs/case_studies/london_ifs_cloud.md | 2 +- docs/case_studies/medellin_linea_k.md | 2 +- docs/case_studies/mi_teleferico_linea_roja.md | 2 +- docs/case_studies/ngong_ping_360.md | 2 +- docs/case_studies/portland_ohsu.md | 2 +- docs/case_studies/roosevelt_island.md | 2 +- docs/case_studies/whistler_peak2peak.md | 2 +- docs/case_studies/whistler_peak_chair.md | 2 +- docs/case_studies/zugspitze_eibsee.md | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/case_studies/aiguille_du_midi.md b/docs/case_studies/aiguille_du_midi.md index 2b7dfee..4ee499b 100644 --- a/docs/case_studies/aiguille_du_midi.md +++ b/docs/case_studies/aiguille_du_midi.md @@ -151,5 +151,5 @@ falls out of the physics + the optimization objective. Drag to rotate, scroll to zoom. Click the *Reset Camera* button (top-right inside the viewer) to recentre. - + diff --git a/docs/case_studies/cablebus_linea2.md b/docs/case_studies/cablebus_linea2.md index 016f778..12c869b 100644 --- a/docs/case_studies/cablebus_linea2.md +++ b/docs/case_studies/cablebus_linea2.md @@ -144,5 +144,5 @@ calibrated for this archetype. Drag to rotate, scroll to zoom. Click the *Reset Camera* button (top-right inside the viewer) to recentre. - + diff --git a/docs/case_studies/funitel_peclet.md b/docs/case_studies/funitel_peclet.md index 2d80198..0e5208e 100644 --- a/docs/case_studies/funitel_peclet.md +++ b/docs/case_studies/funitel_peclet.md @@ -130,5 +130,5 @@ to be validated against a real installation. Drag to rotate, scroll to zoom. Click the *Reset Camera* button (top-right inside the viewer) to recentre. - + diff --git a/docs/case_studies/london_ifs_cloud.md b/docs/case_studies/london_ifs_cloud.md index 1129655..80deab9 100644 --- a/docs/case_studies/london_ifs_cloud.md +++ b/docs/case_studies/london_ifs_cloud.md @@ -135,5 +135,5 @@ behaviour a real PLA-approved design must exhibit. Drag to rotate, scroll to zoom. Click the *Reset Camera* button (top-right inside the viewer) to recentre. - + diff --git a/docs/case_studies/medellin_linea_k.md b/docs/case_studies/medellin_linea_k.md index d478877..034f2cf 100644 --- a/docs/case_studies/medellin_linea_k.md +++ b/docs/case_studies/medellin_linea_k.md @@ -143,5 +143,5 @@ feature — multi-waypoint urban routing works. Drag to rotate, scroll to zoom. Click the *Reset Camera* button (top-right inside the viewer) to recentre. - + diff --git a/docs/case_studies/mi_teleferico_linea_roja.md b/docs/case_studies/mi_teleferico_linea_roja.md index 1ea6225..52eaabf 100644 --- a/docs/case_studies/mi_teleferico_linea_roja.md +++ b/docs/case_studies/mi_teleferico_linea_roja.md @@ -173,5 +173,5 @@ The single hardest physics question — **how much altitude must the cable rise* Drag to rotate, scroll to zoom. Click the *Reset Camera* button (top-right inside the viewer) to recentre. - + diff --git a/docs/case_studies/ngong_ping_360.md b/docs/case_studies/ngong_ping_360.md index 9f60c36..691cae6 100644 --- a/docs/case_studies/ngong_ping_360.md +++ b/docs/case_studies/ngong_ping_360.md @@ -136,5 +136,5 @@ system's value lies — to cross the bay in as few towers as possible. Drag to rotate, scroll to zoom. Click the *Reset Camera* button (top-right inside the viewer) to recentre. - + diff --git a/docs/case_studies/portland_ohsu.md b/docs/case_studies/portland_ohsu.md index d501cfa..f631e35 100644 --- a/docs/case_studies/portland_ohsu.md +++ b/docs/case_studies/portland_ohsu.md @@ -146,5 +146,5 @@ closest cabin-capacity reproduction in the case-study set. Drag to rotate, scroll to zoom. Click the *Reset Camera* button (top-right inside the viewer) to recentre. - + diff --git a/docs/case_studies/roosevelt_island.md b/docs/case_studies/roosevelt_island.md index 3278a8e..b4bfb98 100644 --- a/docs/case_studies/roosevelt_island.md +++ b/docs/case_studies/roosevelt_island.md @@ -147,5 +147,5 @@ discipline a real urban tramway over a public waterway must show. Drag to rotate, scroll to zoom. Click the *Reset Camera* button (top-right inside the viewer) to recentre. - + diff --git a/docs/case_studies/whistler_peak2peak.md b/docs/case_studies/whistler_peak2peak.md index 19e8300..ec6554a 100644 --- a/docs/case_studies/whistler_peak2peak.md +++ b/docs/case_studies/whistler_peak2peak.md @@ -179,5 +179,5 @@ Within the system-spec band. Drag to rotate, scroll to zoom. Click the *Reset Camera* button (top-right inside the viewer) to recentre. - + diff --git a/docs/case_studies/whistler_peak_chair.md b/docs/case_studies/whistler_peak_chair.md index 8801630..7e1ca74 100644 --- a/docs/case_studies/whistler_peak_chair.md +++ b/docs/case_studies/whistler_peak_chair.md @@ -132,5 +132,5 @@ the sixth and final catalogue archetype. Drag to rotate, scroll to zoom. Click the *Reset Camera* button (top-right inside the viewer) to recentre. - + diff --git a/docs/case_studies/zugspitze_eibsee.md b/docs/case_studies/zugspitze_eibsee.md index 72de41c..b128112 100644 --- a/docs/case_studies/zugspitze_eibsee.md +++ b/docs/case_studies/zugspitze_eibsee.md @@ -178,5 +178,5 @@ decision exactly. Drag to rotate, scroll to zoom. Click the *Reset Camera* button (top-right inside the viewer) to recentre. - + From bcacb1bbf51e565876836616a9ff3e9ae4d8e9c0 Mon Sep 17 00:00:00 2001 From: Harsh Pandhe Date: Sun, 24 May 2026 13:37:27 +0530 Subject: [PATCH 02/21] feat(case-study): engineer trial corridor (India, 805 m) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lon/lat (73.5123812, 19.0691450) → (73.5189329, 19.0728925). Western Ghats region. 805 m corridor, 108 m elevation gain. Optimizer result (MGD, GA default config): feasible, 2 intermediate towers, 815 m cable, 3.27 m min clearance, 260.8 kN max tension, EUR 4.95 M EU_ALPINE capex band. - examples/case_engineer_trial_india.py (scaffolded via P49 tool) - docs/case_studies/engineer_trial_india.md (with embedded 3-D twin) - 8 artifacts in docs/case_studies/engineer_trial_india_outputs/ - mkdocs nav entry - Streamlit Demo tab preset (top of the dropdown for the trial) - 13th card on the landing-page case-study grid --- app/streamlit_app.py | 4 + docs/case_studies/engineer_trial_india.md | 66 +++++ .../alignment.geojson | 109 ++++++++ .../alignment.landxml | 260 ++++++++++++++++++ .../alignment.png | Bin 0 -> 74880 bytes .../engineer_trial_india_outputs/bom.csv | 10 + .../convergence.png | Bin 0 -> 53778 bytes .../cost_estimate.csv | 13 + .../engineer_trial_india_outputs/towers.csv | 5 + .../engineer_trial_india_outputs/twin.html | 26 ++ docs/index.md | 8 + examples/case_engineer_trial_india.py | 96 +++++++ mkdocs.yml | 1 + 13 files changed, 598 insertions(+) create mode 100644 docs/case_studies/engineer_trial_india.md create mode 100644 docs/case_studies/engineer_trial_india_outputs/alignment.geojson create mode 100644 docs/case_studies/engineer_trial_india_outputs/alignment.landxml create mode 100644 docs/case_studies/engineer_trial_india_outputs/alignment.png create mode 100644 docs/case_studies/engineer_trial_india_outputs/bom.csv create mode 100644 docs/case_studies/engineer_trial_india_outputs/convergence.png create mode 100644 docs/case_studies/engineer_trial_india_outputs/cost_estimate.csv create mode 100644 docs/case_studies/engineer_trial_india_outputs/towers.csv create mode 100644 docs/case_studies/engineer_trial_india_outputs/twin.html create mode 100644 examples/case_engineer_trial_india.py diff --git a/app/streamlit_app.py b/app/streamlit_app.py index 890f5d7..1384bbc 100644 --- a/app/streamlit_app.py +++ b/app/streamlit_app.py @@ -277,6 +277,10 @@ def _load_terrain(): "Roosevelt Island Tramway (NYC) — urban jig-back": dict(start=(-73.9580, 40.7570), end=(-73.9495, 40.7610), system="jigback", note="Queensboro Bridge fly-over."), + "Engineer trial corridor (India) — Western Ghats, 805 m": + dict(start=(73.5123812, 19.0691450), end=(73.5189329, 19.0728925), + system="mgd", + note="2026-05-25 trial corridor. 108 m gain over 805 m. Optimizer reports feasible @ 2 intermediate towers, 815 m cable, 261 kN."), "Mexico City L2 + Caracas (new) — try a corridor": dict(start=(-99.04, 19.34), end=(-99.00, 19.37), system="mgd", note="Click two map points to override."), diff --git a/docs/case_studies/engineer_trial_india.md b/docs/case_studies/engineer_trial_india.md new file mode 100644 index 0000000..096f625 --- /dev/null +++ b/docs/case_studies/engineer_trial_india.md @@ -0,0 +1,66 @@ +# Case study — Engineer trial corridor (India) + +> Scaffolded by `tools/new_case_study.py`. Replace this notice with +> the real write-up once the optimizer run has been validated against +> the as-built record. + +## Corridor + +| Field | Value | +|---|---| +| Lower terminal | 73.5123812, 19.069145 | +| Upper terminal | 73.5189329, 19.0728925 | +| System type | `mgd` | +| DEM tile | `Copernicus_DSM_N19_E073.tif` | + +## Notes + +Engineer-trial corridor for the 2026-05-25 demo. Western Ghats region (Karjat/Matheran), India. 804 m corridor with 108 m elevation gain (~14% mean slope). Scaffolded for the live trial; rename + add as-built references once the engineer confirms which line he's modelling. + +## Run + +```bash +python examples/case_engineer_trial_india.py +``` + +Outputs land in `docs/case_studies/engineer_trial_india_outputs/`. + +## Optimizer output (first run) + +| Metric | Value | +|---|---:| +| Corridor length | 805 m | +| Elevation gain | 108 m | +| Feasible | yes | +| Stations (start + end) | 2 | +| Intermediate towers | 2 | +| Total cable length | 815 m | +| Min ground clearance | 3.27 m | +| Max cable tension | 260.8 kN | +| Capex (EU_ALPINE band) | EUR 4.95 M | + +## Tower schedule + +| # | Distance [m] | Ground [m] | Tower height [m] | Station | +|---:|---:|---:|---:|:---:| +| 0 | 0 | 211 | 12.7 | yes | +| 1 | 340 | 215 | 5.0 | — | +| 2 | 626 | 263 | 5.0 | — | +| 3 | 805 | 300 | 7.9 | yes | + +## Interactive 3-D twin + +Drag to rotate, scroll to zoom. + + + +## As-built comparison + +_To be filled in once the engineer confirms which real line this corridor is modelling._ + +| Metric | As-built | Optimizer | Δ | +|---|---:|---:|---:| +| Route length [m] | _ref_ | 805 | _Δ_ | +| Elevation gain [m] | _ref_ | 108 | _Δ_ | +| Stations | _ref_ | 2 | — | +| Intermediate towers | _ref_ | 2 | _Δ_ | diff --git a/docs/case_studies/engineer_trial_india_outputs/alignment.geojson b/docs/case_studies/engineer_trial_india_outputs/alignment.geojson new file mode 100644 index 0000000..7deabb7 --- /dev/null +++ b/docs/case_studies/engineer_trial_india_outputs/alignment.geojson @@ -0,0 +1,109 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 73.5123812, + 19.069145 + ] + }, + "properties": { + "kind": "tower", + "index": 0, + "distance_m": 0.0, + "height_m": 12.65768109035815, + "ground_elev_m": 211.33203125, + "anchor_elev_m": 223.98971234035815, + "is_station": true + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 73.51515071177086, + 19.070729130128253 + ] + }, + "properties": { + "kind": "tower", + "index": 1, + "distance_m": 340.1296397124108, + "height_m": 5.0, + "ground_elev_m": 215.1030401338748, + "anchor_elev_m": 220.1030401338748, + "is_station": false + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 73.51748085149187, + 19.07206194429931 + ] + }, + "properties": { + "kind": "tower", + "index": 2, + "distance_m": 626.2990621099801, + "height_m": 5.0, + "ground_elev_m": 262.6559003343333, + "anchor_elev_m": 267.6559003343333, + "is_station": false + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 73.5189329, + 19.0728925 + ] + }, + "properties": { + "kind": "tower", + "index": 3, + "distance_m": 804.6282322941722, + "height_m": 7.863666020178675, + "ground_elev_m": 300.01507568359375, + "anchor_elev_m": 307.87874170377245, + "is_station": true + } + }, + { + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 73.5123812, + 19.069145 + ], + [ + 73.51515071177086, + 19.070729130128253 + ], + [ + 73.51748085149187, + 19.07206194429931 + ], + [ + 73.5189329, + 19.0728925 + ] + ] + }, + "properties": { + "kind": "cable_centerline", + "n_towers": 4 + } + } + ] +} \ No newline at end of file diff --git a/docs/case_studies/engineer_trial_india_outputs/alignment.landxml b/docs/case_studies/engineer_trial_india_outputs/alignment.landxml new file mode 100644 index 0000000..af5a31e --- /dev/null +++ b/docs/case_studies/engineer_trial_india_outputs/alignment.landxml @@ -0,0 +1,260 @@ + + + + + + + + + + + +

2109168.0178 343463.8942 211.3320

+

2109175.5906 343476.7269 211.3320

+

2109183.1633 343489.5597 211.3320

+

2109190.7361 343502.3924 210.7421

+

2109198.3088 343515.2251 210.7421

+

2109205.8816 343528.0579 210.7006

+

2109213.4543 343540.8906 210.7006

+

2109221.0271 343553.7233 199.3022

+

2109228.5999 343566.5561 199.3022

+

2109236.1726 343579.3888 196.3055

+

2109243.7454 343592.2215 196.3055

+

2109251.3181 343605.0543 191.6027

+

2109258.8909 343617.8870 201.0445

+

2109266.4636 343630.7197 201.0445

+

2109274.0364 343643.5525 206.7050

+

2109281.6091 343656.3852 204.3745

+

2109289.1819 343669.2179 202.7679

+

2109296.7546 343682.0507 202.7679

+

2109304.3274 343694.8834 202.7679

+

2109311.9001 343707.7161 204.0024

+

2109319.4729 343720.5488 204.0024

+

2109327.0456 343733.3816 210.5043

+

2109334.6184 343746.2143 210.5043

+

2109342.1911 343759.0470 216.0671

+

2109349.7639 343771.8798 216.0671

+

2109357.3366 343784.7125 216.0671

+

2109364.9094 343797.5452 217.3688

+

2109372.4821 343810.3780 213.8542

+

2109380.0549 343823.2107 212.4978

+

2109387.6276 343836.0434 212.4978

+

2109395.2004 343848.8762 212.5399

+

2109402.7731 343861.7089 205.8773

+

2109410.3459 343874.5416 215.6494

+

2109417.9186 343887.3744 215.6494

+

2109425.4914 343900.2071 215.6494

+

2109433.0642 343913.0398 222.5712

+

2109440.6369 343925.8726 222.5712

+

2109448.2097 343938.7053 236.0242

+

2109455.7824 343951.5380 236.0242

+

2109463.3552 343964.3708 250.0316

+

2109470.9279 343977.2035 250.0316

+

2109478.5007 343990.0362 250.0316

+

2109486.0734 344002.8689 262.6028

+

2109493.6462 344015.7017 264.2608

+

2109501.2189 344028.5344 269.4320

+

2109508.7917 344041.3671 269.4320

+

2109516.3644 344054.1999 273.6633

+

2109523.9372 344067.0326 274.3267

+

2109531.5099 344079.8653 279.6528

+

2109539.0827 344092.6981 279.6528

+

2109546.6554 344105.5308 279.6528

+

2109554.2282 344118.3635 288.1386

+

2109561.8009 344131.1963 288.1386

+

2109569.3737 344144.0290 300.0151

+

2109576.9464 344156.8617 300.0151

+

2109116.3442 343494.3874 211.3320

+

2109123.9170 343507.2202 211.3320

+

2109131.4897 343520.0529 211.3320

+

2109139.0625 343532.8856 210.7421

+

2109146.6352 343545.7184 210.7421

+

2109154.2080 343558.5511 210.7006

+

2109161.7807 343571.3838 210.7006

+

2109169.3535 343584.2166 199.3022

+

2109176.9262 343597.0493 199.3022

+

2109184.4990 343609.8820 196.3055

+

2109192.0717 343622.7148 196.3055

+

2109199.6445 343635.5475 191.6027

+

2109207.2172 343648.3802 201.0445

+

2109214.7900 343661.2130 201.0445

+

2109222.3627 343674.0457 206.7050

+

2109229.9355 343686.8784 204.3745

+

2109237.5082 343699.7112 202.7679

+

2109245.0810 343712.5439 202.7679

+

2109252.6538 343725.3766 202.7679

+

2109260.2265 343738.2093 204.0024

+

2109267.7993 343751.0421 204.0024

+

2109275.3720 343763.8748 210.5043

+

2109282.9448 343776.7075 210.5043

+

2109290.5175 343789.5403 216.0671

+

2109298.0903 343802.3730 216.0671

+

2109305.6630 343815.2057 216.0671

+

2109313.2358 343828.0385 217.3688

+

2109320.8085 343840.8712 213.8542

+

2109328.3813 343853.7039 212.4978

+

2109335.9540 343866.5367 212.4978

+

2109343.5268 343879.3694 212.5399

+

2109351.0995 343892.2021 205.8773

+

2109358.6723 343905.0349 215.6494

+

2109366.2450 343917.8676 215.6494

+

2109373.8178 343930.7003 215.6494

+

2109381.3905 343943.5331 222.5712

+

2109388.9633 343956.3658 222.5712

+

2109396.5360 343969.1985 236.0242

+

2109404.1088 343982.0313 236.0242

+

2109411.6815 343994.8640 250.0316

+

2109419.2543 344007.6967 250.0316

+

2109426.8270 344020.5294 250.0316

+

2109434.3998 344033.3622 262.6028

+

2109441.9726 344046.1949 264.2608

+

2109449.5453 344059.0276 269.4320

+

2109457.1181 344071.8604 269.4320

+

2109464.6908 344084.6931 273.6633

+

2109472.2636 344097.5258 274.3267

+

2109479.8363 344110.3586 279.6528

+

2109487.4091 344123.1913 279.6528

+

2109494.9818 344136.0240 279.6528

+

2109502.5546 344148.8568 288.1386

+

2109510.1273 344161.6895 288.1386

+

2109517.7001 344174.5222 300.0151

+

2109525.2728 344187.3550 300.0151

+
+ + 1 2 56 + 2 57 56 + 2 3 57 + 3 58 57 + 3 4 58 + 4 59 58 + 4 5 59 + 5 60 59 + 5 6 60 + 6 61 60 + 6 7 61 + 7 62 61 + 7 8 62 + 8 63 62 + 8 9 63 + 9 64 63 + 9 10 64 + 10 65 64 + 10 11 65 + 11 66 65 + 11 12 66 + 12 67 66 + 12 13 67 + 13 68 67 + 13 14 68 + 14 69 68 + 14 15 69 + 15 70 69 + 15 16 70 + 16 71 70 + 16 17 71 + 17 72 71 + 17 18 72 + 18 73 72 + 18 19 73 + 19 74 73 + 19 20 74 + 20 75 74 + 20 21 75 + 21 76 75 + 21 22 76 + 22 77 76 + 22 23 77 + 23 78 77 + 23 24 78 + 24 79 78 + 24 25 79 + 25 80 79 + 25 26 80 + 26 81 80 + 26 27 81 + 27 82 81 + 27 28 82 + 28 83 82 + 28 29 83 + 29 84 83 + 29 30 84 + 30 85 84 + 30 31 85 + 31 86 85 + 31 32 86 + 32 87 86 + 32 33 87 + 33 88 87 + 33 34 88 + 34 89 88 + 34 35 89 + 35 90 89 + 35 36 90 + 36 91 90 + 36 37 91 + 37 92 91 + 37 38 92 + 38 93 92 + 38 39 93 + 39 94 93 + 39 40 94 + 40 95 94 + 40 41 95 + 41 96 95 + 41 42 96 + 42 97 96 + 42 43 97 + 43 98 97 + 43 44 98 + 44 99 98 + 44 45 99 + 45 100 99 + 45 46 100 + 46 101 100 + 46 47 101 + 47 102 101 + 47 48 102 + 48 103 102 + 48 49 103 + 49 104 103 + 49 50 104 + 50 105 104 + 50 51 105 + 51 106 105 + 51 52 106 + 52 107 106 + 52 53 107 + 53 108 107 + 53 54 108 + 54 109 108 + 54 55 109 + 55 110 109 + +
+
+
+ + + + + 2109142.1810 343479.1408 + 2109551.1096 344172.1083 + + + + + 0.0000 223.9897 + 340.1296 220.1030 + 626.2991 267.6559 + 804.6282 307.8787 + + + + + + 2109142.1810 343479.1408 211.3320 + 2109315.0419 343772.0696 215.1030 + 2109460.4791 344018.5265 262.6559 + 2109551.1096 344172.1083 300.0151 + +
\ No newline at end of file diff --git a/docs/case_studies/engineer_trial_india_outputs/alignment.png b/docs/case_studies/engineer_trial_india_outputs/alignment.png new file mode 100644 index 0000000000000000000000000000000000000000..9598dcf78c2ee5808107485416e251aea607e7a5 GIT binary patch literal 74880 zcmeFZcR1Jo`!@bG5|R;$kVq7=MRqpH-aC8my@gPsB~fPCgpfTmDp{G?qwJNv{jO)9 z&%68mJ&ybM{f^&1_h0wxI654}>-Bg(#&w<7d7jrJQdv>vEdE7&1VPTq$x5ms2o5%a zU{>Sez)voV_Y%Mt0XHdaH#J8KH_v-6=E&W9ZccWNZg$otmp#l~T&*1)xY;;4*lw|2 zwsLcGaur}_xBvSaY>qCL?2OVqI`A%dPO>_#2tpo#{=;Y*5KBQY5JXP$wz}7wrBP39 zGOb~pHD9Wl3*@JyiddK*o;nk8YN^Kav9%+Q@ZJ~$qfHJYCu2cmhIV0@6>AY+{UuwI zNE+-S<#)2-qZ>!JJ*F$Gdd=fpPTse%{D^n8NQxI0ne_vS_jsNer|Nmw~o|ToA;9Mm3Xq6|Q=QRy^H#Z)Jb9fBrBD-HwUb;jW zDT(Rm==km7c5cyY~wVIo{^6 z+`2`nsHkZ5;YQ?JRe3(5tC!uj4i ztK+Rx&5t-uns9e_ck91?#lLy;rq%a%c*h&bClmWyi@z@F$%Tc5-Gfgr_xha%?_MQKmE3d2RF${VyN4T{zvsHIxQ0teYP=Xhw{mw~b#=9JnS+6A zxC(=ej0}(U_jjsIx?`%UsvMpx`pC5nT7CR5%)1FZoZ{+zuYG8l$?&;lO!PNq+CO~? zCn_>-z#JSLd?omXzAsDM>yqiPQq z=H?}za8hhsEPa>u_AMtoOmD6hQ9<2trQCqQk1xMmz9sOUdCsKNvh<_)_jHVCf*=EZ z&iz-!m+5oFGVZ?CyuQLiE8uqR0U?de3P;Wx0r!Q8p;Fr!!nfaZA0BWB3R2y9$r>CM zc8XCc$!^8zp?P19hO|*eNC=knz-PQSK1d_Cx$F04YW5!A2 z`yK0!9%N-*BcQrTaOu(|fsGritZT3|ru&=oYdbsP>bh$jfeH!)8H$MyVUA6|zPP@& zu^|Cd{;0;#P*43*I3W#}C$9SKsEfS#+?E|pUt?K*@69HEYHn^Gp(9Zt|D=V3hA0gu zs+)H8FhkvSfq~_fl?j5>#i~q_FIja=W@IBG9y

YDSDXvVHeAtqjD8K7dC9L2l@Fo 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�t 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 literal 0 HcmV?d00001 diff --git a/docs/case_studies/engineer_trial_india_outputs/bom.csv b/docs/case_studies/engineer_trial_india_outputs/bom.csv new file mode 100644 index 0000000..7d13c89 --- /dev/null +++ b/docs/case_studies/engineer_trial_india_outputs/bom.csv @@ -0,0 +1,10 @@ +item,qty,unit,notes +Steel tower fabrication,8545.98,kg,"sum of 4 towers, k=280 kg/m" +Tower-top sheave assembly,2.00,ea,"one assembly per intermediate tower" +Concrete foundation,90.00,m^3,"4 pads, 2.5 m deep" +Reinforcing rebar,7200.00,kg,"80 kg/m^3 of concrete (typ. mountain footing)" +Steel wire rope,1810.97,m,"2 strand(s) incl. 5% slack + 50 m tails" +Station building (drive),1.00,ea,"incl. drive + tensioning station" +Station building (return),1.00,ea,"incl. return bullwheel" +Drive motor + VFD,1.00,ea,"rated to design speed and full load" +Carriers (cabins / chairs),16.00,ea,"@ 50 m spacing, 8 pax each" diff --git a/docs/case_studies/engineer_trial_india_outputs/convergence.png b/docs/case_studies/engineer_trial_india_outputs/convergence.png new file mode 100644 index 0000000000000000000000000000000000000000..861ce3bdc5477e29071c7a25515e1177de014fca GIT binary patch literal 53778 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 literal 0 HcmV?d00001 diff --git a/docs/case_studies/engineer_trial_india_outputs/cost_estimate.csv b/docs/case_studies/engineer_trial_india_outputs/cost_estimate.csv new file mode 100644 index 0000000..6452129 --- /dev/null +++ b/docs/case_studies/engineer_trial_india_outputs/cost_estimate.csv @@ -0,0 +1,13 @@ +item,qty,unit_price_eur,total_eur +Steel tower fabrication,8545.98,4.50,38456.90 +Tower-top sheave assembly,2.00,38000.00,76000.00 +Concrete foundation,90.00,320.00,28800.00 +Reinforcing rebar,7200.00,1.80,12960.00 +Steel wire rope,1810.97,95.00,172041.78 +Station building (drive),1.00,1800000.00,1800000.00 +Station building (return),1.00,1200000.00,1200000.00 +Drive motor + VFD,1.00,480000.00,480000.00 +Carriers (cabins / chairs),16.00,38000.00,608000.00 +Subtotal,,,4416258.68 +Contingency,,,529951.04 +Grand total,,,4946209.72 diff --git a/docs/case_studies/engineer_trial_india_outputs/towers.csv b/docs/case_studies/engineer_trial_india_outputs/towers.csv new file mode 100644 index 0000000..e571891 --- /dev/null +++ b/docs/case_studies/engineer_trial_india_outputs/towers.csv @@ -0,0 +1,5 @@ +index,distance_m,ground_elev_m,tower_height_m,anchor_elev_m,is_station +0,0.00,211.33,12.66,223.99,1 +1,340.13,215.10,5.00,220.10,0 +2,626.30,262.66,5.00,267.66,0 +3,804.63,300.02,7.86,307.88,1 diff --git a/docs/case_studies/engineer_trial_india_outputs/twin.html b/docs/case_studies/engineer_trial_india_outputs/twin.html new file mode 100644 index 0000000..1067403 --- /dev/null +++ b/docs/case_studies/engineer_trial_india_outputs/twin.html @@ -0,0 +1,26 @@ + + + + + + VTK.js | Example - OfflineLocalView + + + +

+ + + + + diff --git a/docs/index.md b/docs/index.md index 19e73ab..5e45c7d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -191,6 +191,14 @@
Sixth archetype validated
+ + Engineer trial corridor (India) +
+

Engineer trial corridor (India)

+
MGD · Western Ghats, 805 m
+
2026-05-25 demo · 2 towers, feasible
+
+
## What's inside diff --git a/examples/case_engineer_trial_india.py b/examples/case_engineer_trial_india.py new file mode 100644 index 0000000..3117c2a --- /dev/null +++ b/examples/case_engineer_trial_india.py @@ -0,0 +1,96 @@ +"""Case study: Engineer trial corridor (India). + +Generated by ``tools/new_case_study.py``. Replace the placeholder +notes + as-built numbers with real references before committing +the validation comparison. + +Notes from scaffold: + Engineer-trial corridor for the 2026-05-25 demo. Western Ghats region (Karjat/Matheran), India. 804 m corridor with 108 m elevation gain (~14% mean slope). Scaffolded for the live trial; rename + add as-built references once the engineer confirms which line he's modelling. +""" + +from __future__ import annotations + +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt + +from ropeway.alignment import evaluate_alignment +from ropeway.bom import build_bom +from ropeway.cost import Region, estimate_cost +from ropeway.dem import extract_profile_from_dem +from ropeway.io import alignment_to_csv, alignment_to_geojson +from ropeway.landxml import alignment_to_landxml +from ropeway.multi_rope import RopewaySystemType, system_defaults +from ropeway.optimizer import GAConfig, optimize +from ropeway.viz import plot_alignment, plot_convergence + +START_LON, START_LAT = 73.5123812, 19.069145 +END_LON, END_LAT = 73.5189329, 19.0728925 + +DEM_PATH = Path("data/dem/Copernicus_DSM_N19_E073.tif") +OUT_DIR = Path("docs/case_studies/engineer_trial_india_outputs") + + +def main() -> None: + if not DEM_PATH.exists(): + raise SystemExit( + f"Missing {DEM_PATH}. Download the Copernicus tile " + "or run `ropeway tagline` first to seed the cache." + ) + + profile = extract_profile_from_dem( + DEM_PATH, (START_LON, START_LAT), (END_LON, END_LAT), + sample_spacing_m=15.0, + ) + print(f"Corridor length : {profile.total_length:.0f} m") + print(f"Elevation range : " + f"{profile.elevation.min():.0f} -> {profile.elevation.max():.0f} m") + print(f"Total elevation gain : " + f"{profile.elevation.max() - profile.elevation.min():.0f} m") + + cfg = system_defaults(RopewaySystemType.MGD) + ga = GAConfig(generations=80, population_size=80, seed=2024) + + result = optimize( + profile.as_function(), profile.total_length, cfg=cfg, ga=ga, + verbose=False, + ) + + OUT_DIR.mkdir(parents=True, exist_ok=True) + align = result.best_alignment + eval_res = result.best_result + rep = eval_res.report + + fig, _ = plot_alignment(profile, align, segments=eval_res.segments, + title="Engineer trial corridor (India) — optimized alignment") + fig.savefig(OUT_DIR / "alignment.png", dpi=140) + plt.close(fig) + + fig, _ = plot_convergence(result.history_best, result.history_avg) + fig.savefig(OUT_DIR / "convergence.png", dpi=140) + plt.close(fig) + + alignment_to_geojson(align, profile, OUT_DIR / "alignment.geojson") + alignment_to_csv(align, profile, OUT_DIR / "towers.csv") + alignment_to_landxml(align, profile, OUT_DIR / "alignment.landxml") + + bom = build_bom(align, project_name="Engineer trial corridor (India)", + system=RopewaySystemType.MGD, cfg=cfg) + (OUT_DIR / "bom.csv").write_text(bom.as_csv()) + est = estimate_cost(bom, region=Region.EU_ALPINE) + (OUT_DIR / "cost_estimate.csv").write_text(est.as_csv()) + + print() + print(f"Feasible : {eval_res.feasible}") + print(f"Intermediate towers : {max(0, len(align.towers) - 2)}") + print(f"Cable length : {rep.total_cable_length_m:.0f} m") + print(f"Min ground clearance : {rep.min_clearance_m:.2f} m") + print(f"Max cable tension : {rep.max_tension_n / 1e3:.1f} kN") + print(f"Capex (EU_ALPINE band): EUR {est.grand_total:,.0f}") + print(f"Artifacts written -> {OUT_DIR}/") + + +if __name__ == "__main__": + main() diff --git a/mkdocs.yml b/mkdocs.yml index 69c6200..db52af3 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -76,3 +76,4 @@ nav: - case_studies/funitel_peclet.md - case_studies/ngong_ping_360.md - case_studies/whistler_peak_chair.md + - case_studies/engineer_trial_india.md From 7716aa6cbbb270814edae96d308516b90e6aeffc Mon Sep 17 00:00:00 2001 From: Harsh Pandhe Date: Sun, 24 May 2026 13:46:43 +0530 Subject: [PATCH 03/21] feat(case-study): pivot India trial to Bhimashankar jig-back (2.18 km, 742 m rise) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Engineer-supplied corridor was actually Bhimashankar Jyotirlinga (one of 12 Hindu pilgrimage sites in Maharashtra). Corridor is much steeper and longer than the initial scaffold: - Lower: 73.5123812, 19.0691450 (Shidighat trail-head) - Upper: 73.5330820, 19.0700494 (Bhimashankar plateau) - 2 181 m horizontal, 742 m terminal-to-terminal rise (34% slope) Tried MGD / 3S / jig-back at default GA budget. All three feasible. Picked jig-back for cleanest visualisation (single intermediate tower) and because pilgrim flow is peaky, not continuous — 3S overkill, MGD needs 6 foundations on protected forest land. Optimizer result (jig-back, 100 pop x 120 gen): feasible, 1 intermediate tower at d=1820 m (height 38.7 m), upper-station tower 61.9 m, 2 345 m cable, 2.92 m min clearance, 1 395 kN max tension, USD 3.9 M Emerging-band capex. Updated: - examples/case_engineer_trial_india.py — Bhimashankar coords + jigback - docs/case_studies/engineer_trial_india.md — full narrative with tower schedule, system-choice rationale, embedded 3-D twin - docs/case_studies/engineer_trial_india_outputs/ — fresh artifacts - app/streamlit_app.py — Bhimashankar preset (jigback default) - docs/index.md — landing-page card updated --- app/streamlit_app.py | 8 +- docs/case_studies/engineer_trial_india.md | 107 ++- .../alignment.geojson | 61 +- .../alignment.landxml | 822 +++++++++++++----- .../alignment.png | Bin 74880 -> 76159 bytes .../engineer_trial_india_outputs/bom.csv | 12 +- .../convergence.png | Bin 53778 -> 53516 bytes .../cost_estimate.csv | 24 +- .../engineer_trial_india_outputs/towers.csv | 7 +- .../engineer_trial_india_outputs/twin.html | 2 +- docs/index.md | 8 +- examples/case_engineer_trial_india.py | 54 +- 12 files changed, 751 insertions(+), 354 deletions(-) diff --git a/app/streamlit_app.py b/app/streamlit_app.py index 1384bbc..8b26c27 100644 --- a/app/streamlit_app.py +++ b/app/streamlit_app.py @@ -277,10 +277,10 @@ def _load_terrain(): "Roosevelt Island Tramway (NYC) — urban jig-back": dict(start=(-73.9580, 40.7570), end=(-73.9495, 40.7610), system="jigback", note="Queensboro Bridge fly-over."), - "Engineer trial corridor (India) — Western Ghats, 805 m": - dict(start=(73.5123812, 19.0691450), end=(73.5189329, 19.0728925), - system="mgd", - note="2026-05-25 trial corridor. 108 m gain over 805 m. Optimizer reports feasible @ 2 intermediate towers, 815 m cable, 261 kN."), + "Bhimashankar pilgrim ropeway (India) — Jyotirlinga, 2.18 km": + dict(start=(73.5123812, 19.0691450), end=(73.5330820, 19.0700494), + system="jigback", + note="2026-05-25 engineer trial. Western Ghats pilgrim line, Shidighat → Bhimashankar plateau. 742 m terminal rise over 2.18 km (34 % slope). Jig-back, single intermediate tower."), "Mexico City L2 + Caracas (new) — try a corridor": dict(start=(-99.04, 19.34), end=(-99.00, 19.37), system="mgd", note="Click two map points to override."), diff --git a/docs/case_studies/engineer_trial_india.md b/docs/case_studies/engineer_trial_india.md index 096f625..351ee3f 100644 --- a/docs/case_studies/engineer_trial_india.md +++ b/docs/case_studies/engineer_trial_india.md @@ -1,21 +1,32 @@ -# Case study — Engineer trial corridor (India) +# Case study — Bhimashankar pilgrim ropeway (Maharashtra, India) -> Scaffolded by `tools/new_case_study.py`. Replace this notice with -> the real write-up once the optimizer run has been validated against -> the as-built record. +> 2026-05-25 engineer-trial corridor. **Bhimashankar** is one of the +> twelve Jyotirlingas of Shiva, set on the Sahyadri plateau in the +> Western Ghats. Pilgrims today either trek the ~7 km zig-zag forest +> path or take a long road detour from the Pune side. The corridor +> below covers the straight-line aerial route from **Shidighat +> trail-head** (lower) to the **Bhimashankar plateau** (upper), +> optimised as a jig-back tram. ## Corridor | Field | Value | |---|---| -| Lower terminal | 73.5123812, 19.069145 | -| Upper terminal | 73.5189329, 19.0728925 | -| System type | `mgd` | -| DEM tile | `Copernicus_DSM_N19_E073.tif` | +| Lower terminal | 73.5123812, 19.0691450 (Shidighat) | +| Upper terminal | 73.5330820, 19.0700494 (Bhimashankar plateau) | +| System type | `jigback` (bi-cable jig-back tram, two cabins) | +| DEM tile | `Copernicus_DSM_N19_E073.tif` (Copernicus GLO-30, public S3) | +| Region band | Emerging (Indian capex norms) | -## Notes +## Terrain -Engineer-trial corridor for the 2026-05-25 demo. Western Ghats region (Karjat/Matheran), India. 804 m corridor with 108 m elevation gain (~14% mean slope). Scaffolded for the live trial; rename + add as-built references once the engineer confirms which line he's modelling. +| Metric | Value | +|---|---:| +| Horizontal corridor length | 2 181 m | +| Lower terminal elevation (DEM) | 211 m | +| Upper terminal elevation (DEM) | 953 m | +| Terminal-to-terminal rise | 742 m | +| Mean slope | 34 % | ## Run @@ -25,42 +36,70 @@ python examples/case_engineer_trial_india.py Outputs land in `docs/case_studies/engineer_trial_india_outputs/`. -## Optimizer output (first run) +## Optimizer output | Metric | Value | |---|---:| -| Corridor length | 805 m | -| Elevation gain | 108 m | -| Feasible | yes | +| Feasible | ✅ | | Stations (start + end) | 2 | -| Intermediate towers | 2 | -| Total cable length | 815 m | -| Min ground clearance | 3.27 m | -| Max cable tension | 260.8 kN | -| Capex (EU_ALPINE band) | EUR 4.95 M | +| Intermediate towers | **1** | +| Total cable length | 2 345 m | +| Min ground clearance | 2.92 m (above EN 12929-1 open-terrain minimum) | +| Max cable tension | 1 395 kN (~1.4 MN) | +| Capex (Emerging band) | **USD 3.9 M** (bare infrastructure) | ## Tower schedule | # | Distance [m] | Ground [m] | Tower height [m] | Station | |---:|---:|---:|---:|:---:| -| 0 | 0 | 211 | 12.7 | yes | -| 1 | 340 | 215 | 5.0 | — | -| 2 | 626 | 263 | 5.0 | — | -| 3 | 805 | 300 | 7.9 | yes | +| 0 | 0 | 211 | 5.0 | yes (Shidighat) | +| 1 | 1 820 | 948 | 38.7 | — | +| 2 | 2 181 | 953 | 61.9 | yes (Bhimashankar plateau) | + +The upper terminal tower (62 m) is tall because the plateau approach +demands an anchor well above the deck for cable tension geometry — +common for jig-back top stations on Alpine cliff faces (Aiguille du +Midi's top station tower is similar). ## Interactive 3-D twin -Drag to rotate, scroll to zoom. +Drag to rotate, scroll to zoom. The two cabins shuttle in opposite +directions; the single intermediate tower sits where the corridor +crosses from the lower valley onto the cliff face. -## As-built comparison - -_To be filled in once the engineer confirms which real line this corridor is modelling._ - -| Metric | As-built | Optimizer | Δ | -|---|---:|---:|---:| -| Route length [m] | _ref_ | 805 | _Δ_ | -| Elevation gain [m] | _ref_ | 108 | _Δ_ | -| Stations | _ref_ | 2 | — | -| Intermediate towers | _ref_ | 2 | _Δ_ | +## Why jig-back, not MGD or 3S + +| System | Towers needed | Cable | Trade-off | +|---|---:|---:|---| +| **Jig-back** (chosen) | **1** | 2 345 m | Cleanest, fewest foundations; throughput ~ 1 200 PPHPD | +| 3S | 2 | 2 361 m | Higher throughput (~ 3 000 PPHPD), heavier civil works | +| MGD | 6 | 2 383 m | Highest throughput, but six foundations on the cliff face | + +For a Jyotirlinga site, jig-back is the right balance: pilgrim flow is +**peaky** (festival days), not continuous, so 3S's premium capacity is +under-utilised most of the year. Six MGD foundations on protected +forest terrain is the wrong trade. The single intermediate tower of +the jig-back lands on the plateau edge (km 1.82) — site-accessible +from the existing Bhimashankar trek road. + +## Next-step refinements an engineer can apply + +* **`NoTowerZone`** over the protected Bhimashankar wildlife sanctuary + zone if the corridor crosses it. +* **`ForcedFlyOverZone`** if the line crosses the trek path or any + road below at a stipulated minimum clearance. +* **Counterweight tensioning** (Phase 42 — backlog) for thermal + response in the 30 °C summer / 5 °C winter swing of the Sahyadris. + +## Outputs the engineer can hand a permitting office + +* `alignment.png` — plan + elevation view +* `alignment.dxf` — AutoCAD overlay for the survey +* `alignment.landxml` — LandXML 1.2 for civil software +* `alignment.geojson` — QGIS / web-map overlay +* `towers.csv` — tower schedule +* `bom.csv` — bill of materials +* `cost_estimate.csv` — Emerging-band capex breakdown +* `twin.html` — standalone 3-D viewer (no plugin) diff --git a/docs/case_studies/engineer_trial_india_outputs/alignment.geojson b/docs/case_studies/engineer_trial_india_outputs/alignment.geojson index 7deabb7..e8bc86b 100644 --- a/docs/case_studies/engineer_trial_india_outputs/alignment.geojson +++ b/docs/case_studies/engineer_trial_india_outputs/alignment.geojson @@ -14,9 +14,9 @@ "kind": "tower", "index": 0, "distance_m": 0.0, - "height_m": 12.65768109035815, + "height_m": 5.0, "ground_elev_m": 211.33203125, - "anchor_elev_m": 223.98971234035815, + "anchor_elev_m": 216.33203125, "is_station": true } }, @@ -25,17 +25,17 @@ "geometry": { "type": "Point", "coordinates": [ - 73.51515071177086, - 19.070729130128253 + 73.529654578706, + 19.069899658935967 ] }, "properties": { "kind": "tower", "index": 1, - "distance_m": 340.1296397124108, - "height_m": 5.0, - "ground_elev_m": 215.1030401338748, - "anchor_elev_m": 220.1030401338748, + "distance_m": 1819.7249926271627, + "height_m": 38.66155714796827, + "ground_elev_m": 947.605174428444, + "anchor_elev_m": 986.2667315764122, "is_station": false } }, @@ -44,36 +44,17 @@ "geometry": { "type": "Point", "coordinates": [ - 73.51748085149187, - 19.07206194429931 + 73.533082, + 19.0700494 ] }, "properties": { "kind": "tower", "index": 2, - "distance_m": 626.2990621099801, - "height_m": 5.0, - "ground_elev_m": 262.6559003343333, - "anchor_elev_m": 267.6559003343333, - "is_station": false - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - 73.5189329, - 19.0728925 - ] - }, - "properties": { - "kind": "tower", - "index": 3, - "distance_m": 804.6282322941722, - "height_m": 7.863666020178675, - "ground_elev_m": 300.01507568359375, - "anchor_elev_m": 307.87874170377245, + "distance_m": 2180.7987753006537, + "height_m": 61.84579899046157, + "ground_elev_m": 952.7059326171875, + "anchor_elev_m": 1014.5517316076491, "is_station": true } }, @@ -87,22 +68,18 @@ 19.069145 ], [ - 73.51515071177086, - 19.070729130128253 - ], - [ - 73.51748085149187, - 19.07206194429931 + 73.529654578706, + 19.069899658935967 ], [ - 73.5189329, - 19.0728925 + 73.533082, + 19.0700494 ] ] }, "properties": { "kind": "cable_centerline", - "n_towers": 4 + "n_towers": 3 } } ] diff --git a/docs/case_studies/engineer_trial_india_outputs/alignment.landxml b/docs/case_studies/engineer_trial_india_outputs/alignment.landxml index af5a31e..9601f73 100644 --- a/docs/case_studies/engineer_trial_india_outputs/alignment.landxml +++ b/docs/case_studies/engineer_trial_india_outputs/alignment.landxml @@ -1,5 +1,5 @@ - + @@ -9,252 +9,618 @@ -

2109168.0178 343463.8942 211.3320

-

2109175.5906 343476.7269 211.3320

-

2109183.1633 343489.5597 211.3320

-

2109190.7361 343502.3924 210.7421

-

2109198.3088 343515.2251 210.7421

-

2109205.8816 343528.0579 210.7006

-

2109213.4543 343540.8906 210.7006

-

2109221.0271 343553.7233 199.3022

-

2109228.5999 343566.5561 199.3022

-

2109236.1726 343579.3888 196.3055

-

2109243.7454 343592.2215 196.3055

-

2109251.3181 343605.0543 191.6027

-

2109258.8909 343617.8870 201.0445

-

2109266.4636 343630.7197 201.0445

-

2109274.0364 343643.5525 206.7050

-

2109281.6091 343656.3852 204.3745

-

2109289.1819 343669.2179 202.7679

-

2109296.7546 343682.0507 202.7679

-

2109304.3274 343694.8834 202.7679

-

2109311.9001 343707.7161 204.0024

-

2109319.4729 343720.5488 204.0024

-

2109327.0456 343733.3816 210.5043

-

2109334.6184 343746.2143 210.5043

-

2109342.1911 343759.0470 216.0671

-

2109349.7639 343771.8798 216.0671

-

2109357.3366 343784.7125 216.0671

-

2109364.9094 343797.5452 217.3688

-

2109372.4821 343810.3780 213.8542

-

2109380.0549 343823.2107 212.4978

-

2109387.6276 343836.0434 212.4978

-

2109395.2004 343848.8762 212.5399

-

2109402.7731 343861.7089 205.8773

-

2109410.3459 343874.5416 215.6494

-

2109417.9186 343887.3744 215.6494

-

2109425.4914 343900.2071 215.6494

-

2109433.0642 343913.0398 222.5712

-

2109440.6369 343925.8726 222.5712

-

2109448.2097 343938.7053 236.0242

-

2109455.7824 343951.5380 236.0242

-

2109463.3552 343964.3708 250.0316

-

2109470.9279 343977.2035 250.0316

-

2109478.5007 343990.0362 250.0316

-

2109486.0734 344002.8689 262.6028

-

2109493.6462 344015.7017 264.2608

-

2109501.2189 344028.5344 269.4320

-

2109508.7917 344041.3671 269.4320

-

2109516.3644 344054.1999 273.6633

-

2109523.9372 344067.0326 274.3267

-

2109531.5099 344079.8653 279.6528

-

2109539.0827 344092.6981 279.6528

-

2109546.6554 344105.5308 279.6528

-

2109554.2282 344118.3635 288.1386

-

2109561.8009 344131.1963 288.1386

-

2109569.3737 344144.0290 300.0151

-

2109576.9464 344156.8617 300.0151

-

2109116.3442 343494.3874 211.3320

-

2109123.9170 343507.2202 211.3320

-

2109131.4897 343520.0529 211.3320

-

2109139.0625 343532.8856 210.7421

-

2109146.6352 343545.7184 210.7421

-

2109154.2080 343558.5511 210.7006

-

2109161.7807 343571.3838 210.7006

-

2109169.3535 343584.2166 199.3022

-

2109176.9262 343597.0493 199.3022

-

2109184.4990 343609.8820 196.3055

-

2109192.0717 343622.7148 196.3055

-

2109199.6445 343635.5475 191.6027

-

2109207.2172 343648.3802 201.0445

-

2109214.7900 343661.2130 201.0445

-

2109222.3627 343674.0457 206.7050

-

2109229.9355 343686.8784 204.3745

-

2109237.5082 343699.7112 202.7679

-

2109245.0810 343712.5439 202.7679

-

2109252.6538 343725.3766 202.7679

-

2109260.2265 343738.2093 204.0024

-

2109267.7993 343751.0421 204.0024

-

2109275.3720 343763.8748 210.5043

-

2109282.9448 343776.7075 210.5043

-

2109290.5175 343789.5403 216.0671

-

2109298.0903 343802.3730 216.0671

-

2109305.6630 343815.2057 216.0671

-

2109313.2358 343828.0385 217.3688

-

2109320.8085 343840.8712 213.8542

-

2109328.3813 343853.7039 212.4978

-

2109335.9540 343866.5367 212.4978

-

2109343.5268 343879.3694 212.5399

-

2109351.0995 343892.2021 205.8773

-

2109358.6723 343905.0349 215.6494

-

2109366.2450 343917.8676 215.6494

-

2109373.8178 343930.7003 215.6494

-

2109381.3905 343943.5331 222.5712

-

2109388.9633 343956.3658 222.5712

-

2109396.5360 343969.1985 236.0242

-

2109404.1088 343982.0313 236.0242

-

2109411.6815 343994.8640 250.0316

-

2109419.2543 344007.6967 250.0316

-

2109426.8270 344020.5294 250.0316

-

2109434.3998 344033.3622 262.6028

-

2109441.9726 344046.1949 264.2608

-

2109449.5453 344059.0276 269.4320

-

2109457.1181 344071.8604 269.4320

-

2109464.6908 344084.6931 273.6633

-

2109472.2636 344097.5258 274.3267

-

2109479.8363 344110.3586 279.6528

-

2109487.4091 344123.1913 279.6528

-

2109494.9818 344136.0240 279.6528

-

2109502.5546 344148.8568 288.1386

-

2109510.1273 344161.6895 288.1386

-

2109517.7001 344174.5222 300.0151

-

2109525.2728 344187.3550 300.0151

+

2109172.1599 343478.0163 211.3320

+

2109172.7198 343492.9428 211.3320

+

2109173.2797 343507.8693 209.2982

+

2109173.8396 343522.7958 209.2982

+

2109174.3995 343537.7223 208.5165

+

2109174.9593 343552.6487 208.5165

+

2109175.5192 343567.5752 203.3816

+

2109176.0791 343582.5017 203.3816

+

2109176.6390 343597.4282 200.1037

+

2109177.1989 343612.3547 200.1037

+

2109177.7587 343627.2812 208.4063

+

2109178.3186 343642.2076 208.4063

+

2109178.8785 343657.1341 211.0188

+

2109179.4384 343672.0606 211.0188

+

2109179.9982 343686.9871 212.6246

+

2109180.5581 343701.9136 212.6246

+

2109181.1180 343716.8400 211.9171

+

2109181.6779 343731.7665 211.9171

+

2109182.2378 343746.6930 214.0314

+

2109182.7976 343761.6195 214.0314

+

2109183.3575 343776.5460 217.0697

+

2109183.9174 343791.4725 217.0697

+

2109184.4773 343806.3989 220.3253

+

2109185.0371 343821.3254 220.3253

+

2109185.5970 343836.2519 221.6600

+

2109186.1569 343851.1784 221.6600

+

2109186.7168 343866.1049 220.7635

+

2109187.2767 343881.0313 220.7635

+

2109187.8365 343895.9578 229.5566

+

2109188.3964 343910.8843 229.5566

+

2109188.9563 343925.8108 234.5771

+

2109189.5162 343940.7373 234.5771

+

2109190.0761 343955.6637 247.5578

+

2109190.6359 343970.5902 247.5578

+

2109191.1958 343985.5167 255.7281

+

2109191.7557 344000.4432 255.7281

+

2109192.3156 344015.3697 267.5416

+

2109192.8754 344030.2962 267.5416

+

2109193.4353 344045.2226 276.6315

+

2109193.9952 344060.1491 276.6315

+

2109194.5551 344075.0756 283.5996

+

2109195.1150 344090.0021 283.5996

+

2109195.6748 344104.9286 291.4220

+

2109196.2347 344119.8550 310.3563

+

2109196.7946 344134.7815 310.3563

+

2109197.3545 344149.7080 324.9875

+

2109197.9144 344164.6345 324.9875

+

2109198.4742 344179.5610 338.0427

+

2109199.0341 344194.4874 338.0427

+

2109199.5940 344209.4139 355.3078

+

2109200.1539 344224.3404 355.3078

+

2109200.7137 344239.2669 377.3161

+

2109201.2736 344254.1934 377.3161

+

2109201.8335 344269.1199 413.8779

+

2109202.3934 344284.0463 413.8779

+

2109202.9533 344298.9728 459.0427

+

2109203.5131 344313.8993 459.0427

+

2109204.0730 344328.8258 501.6923

+

2109204.6329 344343.7523 501.6923

+

2109205.1928 344358.6787 516.0773

+

2109205.7526 344373.6052 516.0773

+

2109206.3125 344388.5317 523.8799

+

2109206.8724 344403.4582 523.8799

+

2109207.4323 344418.3847 528.7481

+

2109207.9922 344433.3111 528.7481

+

2109208.5520 344448.2376 531.9070

+

2109209.1119 344463.1641 531.9070

+

2109209.6718 344478.0906 536.2961

+

2109210.2317 344493.0171 536.2961

+

2109210.7916 344507.9436 539.6147

+

2109211.3514 344522.8700 539.6147

+

2109211.9113 344537.7965 539.6049

+

2109212.4712 344552.7230 539.6049

+

2109213.0311 344567.6495 539.6849

+

2109213.5909 344582.5760 539.6849

+

2109214.1508 344597.5024 540.3336

+

2109214.7107 344612.4289 540.3336

+

2109215.2706 344627.3554 544.1775

+

2109215.8305 344642.2819 544.1775

+

2109216.3903 344657.2084 547.2432

+

2109216.9502 344672.1349 547.2432

+

2109217.5101 344687.0613 546.7462

+

2109218.0700 344701.9878 546.7462

+

2109218.6299 344716.9143 547.1078

+

2109219.1897 344731.8408 547.1078

+

2109219.7496 344746.7673 552.8835

+

2109220.3095 344761.6937 552.8835

+

2109220.8694 344776.6202 562.6164

+

2109221.4292 344791.5467 562.6164

+

2109221.9891 344806.4732 571.0504

+

2109222.5490 344821.3997 578.8035

+

2109223.1089 344836.3261 578.8035

+

2109223.6688 344851.2526 593.3199

+

2109224.2286 344866.1791 593.3199

+

2109224.7885 344881.1056 608.7072

+

2109225.3484 344896.0321 608.7072

+

2109225.9083 344910.9586 626.1749

+

2109226.4681 344925.8850 626.1749

+

2109227.0280 344940.8115 644.8753

+

2109227.5879 344955.7380 644.8753

+

2109228.1478 344970.6645 666.0374

+

2109228.7077 344985.5910 666.0374

+

2109229.2675 345000.5174 690.9371

+

2109229.8274 345015.4439 690.9371

+

2109230.3873 345030.3704 720.0711

+

2109230.9472 345045.2969 720.0711

+

2109231.5071 345060.2234 758.8792

+

2109232.0669 345075.1498 758.8792

+

2109232.6268 345090.0763 809.7198

+

2109233.1867 345105.0028 809.7198

+

2109233.7466 345119.9293 848.6212

+

2109234.3064 345134.8558 848.6212

+

2109234.8663 345149.7823 863.4473

+

2109235.4262 345164.7087 863.4473

+

2109235.9861 345179.6352 874.0479

+

2109236.5460 345194.5617 874.0479

+

2109237.1058 345209.4882 877.0389

+

2109237.6657 345224.4147 877.0389

+

2109238.2256 345239.3411 894.9111

+

2109238.7855 345254.2676 894.9111

+

2109239.3454 345269.1941 924.8425

+

2109239.9052 345284.1206 924.8425

+

2109240.4651 345299.0471 952.3718

+

2109241.0250 345313.9735 952.3718

+

2109241.5849 345328.9000 971.3268

+

2109242.1447 345343.8265 971.3268

+

2109242.7046 345358.7530 981.0471

+

2109243.2645 345373.6795 981.0471

+

2109243.8244 345388.6060 979.4263

+

2109244.3843 345403.5324 979.4263

+

2109244.9441 345418.4589 987.0508

+

2109245.5040 345433.3854 987.0508

+

2109246.0639 345448.3119 992.6397

+

2109246.6238 345463.2384 992.6397

+

2109247.1836 345478.1648 983.0143

+

2109247.7435 345493.0913 983.0143

+

2109248.3034 345508.0178 968.9052

+

2109248.8633 345522.9443 956.9344

+

2109249.4232 345537.8708 956.9344

+

2109249.9830 345552.7972 951.9834

+

2109250.5429 345567.7237 951.9834

+

2109251.1028 345582.6502 951.3024

+

2109251.6627 345597.5767 951.3024

+

2109252.2226 345612.5032 953.9964

+

2109252.7824 345627.4297 953.9964

+

2109253.3423 345642.3561 952.7059

+

2109253.9022 345657.2826 952.7059

+

2109112.2021 343480.2653 211.3320

+

2109112.7620 343495.1918 211.3320

+

2109113.3219 343510.1183 209.2982

+

2109113.8817 343525.0447 209.2982

+

2109114.4416 343539.9712 208.5165

+

2109115.0015 343554.8977 208.5165

+

2109115.5614 343569.8242 203.3816

+

2109116.1213 343584.7507 203.3816

+

2109116.6811 343599.6772 200.1037

+

2109117.2410 343614.6036 200.1037

+

2109117.8009 343629.5301 208.4063

+

2109118.3608 343644.4566 208.4063

+

2109118.9206 343659.3831 211.0188

+

2109119.4805 343674.3096 211.0188

+

2109120.0404 343689.2360 212.6246

+

2109120.6003 343704.1625 212.6246

+

2109121.1602 343719.0890 211.9171

+

2109121.7200 343734.0155 211.9171

+

2109122.2799 343748.9420 214.0314

+

2109122.8398 343763.8685 214.0314

+

2109123.3997 343778.7949 217.0697

+

2109123.9596 343793.7214 217.0697

+

2109124.5194 343808.6479 220.3253

+

2109125.0793 343823.5744 220.3253

+

2109125.6392 343838.5009 221.6600

+

2109126.1991 343853.4273 221.6600

+

2109126.7589 343868.3538 220.7635

+

2109127.3188 343883.2803 220.7635

+

2109127.8787 343898.2068 229.5566

+

2109128.4386 343913.1333 229.5566

+

2109128.9985 343928.0597 234.5771

+

2109129.5583 343942.9862 234.5771

+

2109130.1182 343957.9127 247.5578

+

2109130.6781 343972.8392 247.5578

+

2109131.2380 343987.7657 255.7281

+

2109131.7979 344002.6922 255.7281

+

2109132.3577 344017.6186 267.5416

+

2109132.9176 344032.5451 267.5416

+

2109133.4775 344047.4716 276.6315

+

2109134.0374 344062.3981 276.6315

+

2109134.5972 344077.3246 283.5996

+

2109135.1571 344092.2510 283.5996

+

2109135.7170 344107.1775 291.4220

+

2109136.2769 344122.1040 310.3563

+

2109136.8368 344137.0305 310.3563

+

2109137.3966 344151.9570 324.9875

+

2109137.9565 344166.8834 324.9875

+

2109138.5164 344181.8099 338.0427

+

2109139.0763 344196.7364 338.0427

+

2109139.6361 344211.6629 355.3078

+

2109140.1960 344226.5894 355.3078

+

2109140.7559 344241.5159 377.3161

+

2109141.3158 344256.4423 377.3161

+

2109141.8757 344271.3688 413.8779

+

2109142.4355 344286.2953 413.8779

+

2109142.9954 344301.2218 459.0427

+

2109143.5553 344316.1483 459.0427

+

2109144.1152 344331.0747 501.6923

+

2109144.6751 344346.0012 501.6923

+

2109145.2349 344360.9277 516.0773

+

2109145.7948 344375.8542 516.0773

+

2109146.3547 344390.7807 523.8799

+

2109146.9146 344405.7071 523.8799

+

2109147.4744 344420.6336 528.7481

+

2109148.0343 344435.5601 528.7481

+

2109148.5942 344450.4866 531.9070

+

2109149.1541 344465.4131 531.9070

+

2109149.7140 344480.3396 536.2961

+

2109150.2738 344495.2660 536.2961

+

2109150.8337 344510.1925 539.6147

+

2109151.3936 344525.1190 539.6147

+

2109151.9535 344540.0455 539.6049

+

2109152.5134 344554.9720 539.6049

+

2109153.0732 344569.8984 539.6849

+

2109153.6331 344584.8249 539.6849

+

2109154.1930 344599.7514 540.3336

+

2109154.7529 344614.6779 540.3336

+

2109155.3127 344629.6044 544.1775

+

2109155.8726 344644.5309 544.1775

+

2109156.4325 344659.4573 547.2432

+

2109156.9924 344674.3838 547.2432

+

2109157.5523 344689.3103 546.7462

+

2109158.1121 344704.2368 546.7462

+

2109158.6720 344719.1633 547.1078

+

2109159.2319 344734.0897 547.1078

+

2109159.7918 344749.0162 552.8835

+

2109160.3516 344763.9427 552.8835

+

2109160.9115 344778.8692 562.6164

+

2109161.4714 344793.7957 562.6164

+

2109162.0313 344808.7221 571.0504

+

2109162.5912 344823.6486 578.8035

+

2109163.1510 344838.5751 578.8035

+

2109163.7109 344853.5016 593.3199

+

2109164.2708 344868.4281 593.3199

+

2109164.8307 344883.3546 608.7072

+

2109165.3906 344898.2810 608.7072

+

2109165.9504 344913.2075 626.1749

+

2109166.5103 344928.1340 626.1749

+

2109167.0702 344943.0605 644.8753

+

2109167.6301 344957.9870 644.8753

+

2109168.1899 344972.9134 666.0374

+

2109168.7498 344987.8399 666.0374

+

2109169.3097 345002.7664 690.9371

+

2109169.8696 345017.6929 690.9371

+

2109170.4295 345032.6194 720.0711

+

2109170.9893 345047.5458 720.0711

+

2109171.5492 345062.4723 758.8792

+

2109172.1091 345077.3988 758.8792

+

2109172.6690 345092.3253 809.7198

+

2109173.2289 345107.2518 809.7198

+

2109173.7887 345122.1783 848.6212

+

2109174.3486 345137.1047 848.6212

+

2109174.9085 345152.0312 863.4473

+

2109175.4684 345166.9577 863.4473

+

2109176.0282 345181.8842 874.0479

+

2109176.5881 345196.8107 874.0479

+

2109177.1480 345211.7371 877.0389

+

2109177.7079 345226.6636 877.0389

+

2109178.2678 345241.5901 894.9111

+

2109178.8276 345256.5166 894.9111

+

2109179.3875 345271.4431 924.8425

+

2109179.9474 345286.3695 924.8425

+

2109180.5073 345301.2960 952.3718

+

2109181.0671 345316.2225 952.3718

+

2109181.6270 345331.1490 971.3268

+

2109182.1869 345346.0755 971.3268

+

2109182.7468 345361.0020 981.0471

+

2109183.3067 345375.9284 981.0471

+

2109183.8665 345390.8549 979.4263

+

2109184.4264 345405.7814 979.4263

+

2109184.9863 345420.7079 987.0508

+

2109185.5462 345435.6344 987.0508

+

2109186.1061 345450.5608 992.6397

+

2109186.6659 345465.4873 992.6397

+

2109187.2258 345480.4138 983.0143

+

2109187.7857 345495.3403 983.0143

+

2109188.3456 345510.2668 968.9052

+

2109188.9054 345525.1932 956.9344

+

2109189.4653 345540.1197 956.9344

+

2109190.0252 345555.0462 951.9834

+

2109190.5851 345569.9727 951.9834

+

2109191.1450 345584.8992 951.3024

+

2109191.7048 345599.8257 951.3024

+

2109192.2647 345614.7521 953.9964

+

2109192.8246 345629.6786 953.9964

+

2109193.3845 345644.6051 952.7059

+

2109193.9444 345659.5316 952.7059

- 1 2 56 - 2 57 56 - 2 3 57 - 3 58 57 - 3 4 58 - 4 59 58 - 4 5 59 - 5 60 59 - 5 6 60 - 6 61 60 - 6 7 61 - 7 62 61 - 7 8 62 - 8 63 62 - 8 9 63 - 9 64 63 - 9 10 64 - 10 65 64 - 10 11 65 - 11 66 65 - 11 12 66 - 12 67 66 - 12 13 67 - 13 68 67 - 13 14 68 - 14 69 68 - 14 15 69 - 15 70 69 - 15 16 70 - 16 71 70 - 16 17 71 - 17 72 71 - 17 18 72 - 18 73 72 - 18 19 73 - 19 74 73 - 19 20 74 - 20 75 74 - 20 21 75 - 21 76 75 - 21 22 76 - 22 77 76 - 22 23 77 - 23 78 77 - 23 24 78 - 24 79 78 - 24 25 79 - 25 80 79 - 25 26 80 - 26 81 80 - 26 27 81 - 27 82 81 - 27 28 82 - 28 83 82 - 28 29 83 - 29 84 83 - 29 30 84 - 30 85 84 - 30 31 85 - 31 86 85 - 31 32 86 - 32 87 86 - 32 33 87 - 33 88 87 - 33 34 88 - 34 89 88 - 34 35 89 - 35 90 89 - 35 36 90 - 36 91 90 - 36 37 91 - 37 92 91 - 37 38 92 - 38 93 92 - 38 39 93 - 39 94 93 - 39 40 94 - 40 95 94 - 40 41 95 - 41 96 95 - 41 42 96 - 42 97 96 - 42 43 97 - 43 98 97 - 43 44 98 - 44 99 98 - 44 45 99 - 45 100 99 - 45 46 100 - 46 101 100 - 46 47 101 - 47 102 101 - 47 48 102 - 48 103 102 - 48 49 103 - 49 104 103 - 49 50 104 - 50 105 104 - 50 51 105 - 51 106 105 - 51 52 106 - 52 107 106 - 52 53 107 - 53 108 107 - 53 54 108 - 54 109 108 - 54 55 109 - 55 110 109 + 1 2 148 + 2 149 148 + 2 3 149 + 3 150 149 + 3 4 150 + 4 151 150 + 4 5 151 + 5 152 151 + 5 6 152 + 6 153 152 + 6 7 153 + 7 154 153 + 7 8 154 + 8 155 154 + 8 9 155 + 9 156 155 + 9 10 156 + 10 157 156 + 10 11 157 + 11 158 157 + 11 12 158 + 12 159 158 + 12 13 159 + 13 160 159 + 13 14 160 + 14 161 160 + 14 15 161 + 15 162 161 + 15 16 162 + 16 163 162 + 16 17 163 + 17 164 163 + 17 18 164 + 18 165 164 + 18 19 165 + 19 166 165 + 19 20 166 + 20 167 166 + 20 21 167 + 21 168 167 + 21 22 168 + 22 169 168 + 22 23 169 + 23 170 169 + 23 24 170 + 24 171 170 + 24 25 171 + 25 172 171 + 25 26 172 + 26 173 172 + 26 27 173 + 27 174 173 + 27 28 174 + 28 175 174 + 28 29 175 + 29 176 175 + 29 30 176 + 30 177 176 + 30 31 177 + 31 178 177 + 31 32 178 + 32 179 178 + 32 33 179 + 33 180 179 + 33 34 180 + 34 181 180 + 34 35 181 + 35 182 181 + 35 36 182 + 36 183 182 + 36 37 183 + 37 184 183 + 37 38 184 + 38 185 184 + 38 39 185 + 39 186 185 + 39 40 186 + 40 187 186 + 40 41 187 + 41 188 187 + 41 42 188 + 42 189 188 + 42 43 189 + 43 190 189 + 43 44 190 + 44 191 190 + 44 45 191 + 45 192 191 + 45 46 192 + 46 193 192 + 46 47 193 + 47 194 193 + 47 48 194 + 48 195 194 + 48 49 195 + 49 196 195 + 49 50 196 + 50 197 196 + 50 51 197 + 51 198 197 + 51 52 198 + 52 199 198 + 52 53 199 + 53 200 199 + 53 54 200 + 54 201 200 + 54 55 201 + 55 202 201 + 55 56 202 + 56 203 202 + 56 57 203 + 57 204 203 + 57 58 204 + 58 205 204 + 58 59 205 + 59 206 205 + 59 60 206 + 60 207 206 + 60 61 207 + 61 208 207 + 61 62 208 + 62 209 208 + 62 63 209 + 63 210 209 + 63 64 210 + 64 211 210 + 64 65 211 + 65 212 211 + 65 66 212 + 66 213 212 + 66 67 213 + 67 214 213 + 67 68 214 + 68 215 214 + 68 69 215 + 69 216 215 + 69 70 216 + 70 217 216 + 70 71 217 + 71 218 217 + 71 72 218 + 72 219 218 + 72 73 219 + 73 220 219 + 73 74 220 + 74 221 220 + 74 75 221 + 75 222 221 + 75 76 222 + 76 223 222 + 76 77 223 + 77 224 223 + 77 78 224 + 78 225 224 + 78 79 225 + 79 226 225 + 79 80 226 + 80 227 226 + 80 81 227 + 81 228 227 + 81 82 228 + 82 229 228 + 82 83 229 + 83 230 229 + 83 84 230 + 84 231 230 + 84 85 231 + 85 232 231 + 85 86 232 + 86 233 232 + 86 87 233 + 87 234 233 + 87 88 234 + 88 235 234 + 88 89 235 + 89 236 235 + 89 90 236 + 90 237 236 + 90 91 237 + 91 238 237 + 91 92 238 + 92 239 238 + 92 93 239 + 93 240 239 + 93 94 240 + 94 241 240 + 94 95 241 + 95 242 241 + 95 96 242 + 96 243 242 + 96 97 243 + 97 244 243 + 97 98 244 + 98 245 244 + 98 99 245 + 99 246 245 + 99 100 246 + 100 247 246 + 100 101 247 + 101 248 247 + 101 102 248 + 102 249 248 + 102 103 249 + 103 250 249 + 103 104 250 + 104 251 250 + 104 105 251 + 105 252 251 + 105 106 252 + 106 253 252 + 106 107 253 + 107 254 253 + 107 108 254 + 108 255 254 + 108 109 255 + 109 256 255 + 109 110 256 + 110 257 256 + 110 111 257 + 111 258 257 + 111 112 258 + 112 259 258 + 112 113 259 + 113 260 259 + 113 114 260 + 114 261 260 + 114 115 261 + 115 262 261 + 115 116 262 + 116 263 262 + 116 117 263 + 117 264 263 + 117 118 264 + 118 265 264 + 118 119 265 + 119 266 265 + 119 120 266 + 120 267 266 + 120 121 267 + 121 268 267 + 121 122 268 + 122 269 268 + 122 123 269 + 123 270 269 + 123 124 270 + 124 271 270 + 124 125 271 + 125 272 271 + 125 126 272 + 126 273 272 + 126 127 273 + 127 274 273 + 127 128 274 + 128 275 274 + 128 129 275 + 129 276 275 + 129 130 276 + 130 277 276 + 130 131 277 + 131 278 277 + 131 132 278 + 132 279 278 + 132 133 279 + 133 280 279 + 133 134 280 + 134 281 280 + 134 135 281 + 135 282 281 + 135 136 282 + 136 283 282 + 136 137 283 + 137 284 283 + 137 138 284 + 138 285 284 + 138 139 285 + 139 286 285 + 139 140 286 + 140 287 286 + 140 141 287 + 141 288 287 + 141 142 288 + 142 289 288 + 142 143 289 + 143 290 289 + 143 144 290 + 144 291 290 + 144 145 291 + 145 292 291 + 145 146 292 + 146 293 292 + 146 147 293 + 147 294 293
- + 2109142.1810 343479.1408 - 2109551.1096 344172.1083 + 2109223.9233 345658.4071 - 0.0000 223.9897 - 340.1296 220.1030 - 626.2991 267.6559 - 804.6282 307.8787 + 0.0000 216.3320 + 1819.7250 986.2667 + 2180.7988 1014.5517 2109142.1810 343479.1408 211.3320 - 2109315.0419 343772.0696 215.1030 - 2109460.4791 344018.5265 262.6559 - 2109551.1096 344172.1083 300.0151 + 2109210.3892 345297.5871 947.6052 + 2109223.9233 345658.4071 952.7059
\ No newline at end of file diff --git a/docs/case_studies/engineer_trial_india_outputs/alignment.png b/docs/case_studies/engineer_trial_india_outputs/alignment.png index 9598dcf78c2ee5808107485416e251aea607e7a5..e29d4d3520aba70ba6023b6d8ad8f5af32c5cdd0 100644 GIT binary patch literal 76159 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%0Ae0*t!**{>~(mY0{CA#k5`aY4vg{&;hZGdgE> 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 literal 74880 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 diff --git a/docs/case_studies/engineer_trial_india_outputs/cost_estimate.csv b/docs/case_studies/engineer_trial_india_outputs/cost_estimate.csv index 6452129..7e4f427 100644 --- a/docs/case_studies/engineer_trial_india_outputs/cost_estimate.csv +++ b/docs/case_studies/engineer_trial_india_outputs/cost_estimate.csv @@ -1,13 +1,13 @@ item,qty,unit_price_eur,total_eur -Steel tower fabrication,8545.98,4.50,38456.90 -Tower-top sheave assembly,2.00,38000.00,76000.00 -Concrete foundation,90.00,320.00,28800.00 -Reinforcing rebar,7200.00,1.80,12960.00 -Steel wire rope,1810.97,95.00,172041.78 -Station building (drive),1.00,1800000.00,1800000.00 -Station building (return),1.00,1200000.00,1200000.00 -Drive motor + VFD,1.00,480000.00,480000.00 -Carriers (cabins / chairs),16.00,38000.00,608000.00 -Subtotal,,,4416258.68 -Contingency,,,529951.04 -Grand total,,,4946209.72 +Steel tower fabrication,29542.06,3.60,106351.41 +Tower-top sheave assembly,1.00,32000.00,32000.00 +Concrete foundation,67.50,210.00,14175.00 +Reinforcing rebar,5400.00,1.40,7560.00 +Steel wire rope,15071.70,88.00,1326309.21 +Station building (drive),1.00,950000.00,950000.00 +Station building (return),1.00,620000.00,620000.00 +Drive motor + VFD,1.00,400000.00,400000.00 +Carriers (cabins / chairs),1.00,30000.00,30000.00 +Subtotal,,,3486395.63 +Contingency,,,418367.48 +Grand total,,,3904763.10 diff --git a/docs/case_studies/engineer_trial_india_outputs/towers.csv b/docs/case_studies/engineer_trial_india_outputs/towers.csv index e571891..7b8cb75 100644 --- a/docs/case_studies/engineer_trial_india_outputs/towers.csv +++ b/docs/case_studies/engineer_trial_india_outputs/towers.csv @@ -1,5 +1,4 @@ index,distance_m,ground_elev_m,tower_height_m,anchor_elev_m,is_station -0,0.00,211.33,12.66,223.99,1 -1,340.13,215.10,5.00,220.10,0 -2,626.30,262.66,5.00,267.66,0 -3,804.63,300.02,7.86,307.88,1 +0,0.00,211.33,5.00,216.33,1 +1,1819.72,947.61,38.66,986.27,0 +2,2180.80,952.71,61.85,1014.55,1 diff --git a/docs/case_studies/engineer_trial_india_outputs/twin.html b/docs/case_studies/engineer_trial_india_outputs/twin.html index 1067403..f752aa8 100644 --- a/docs/case_studies/engineer_trial_india_outputs/twin.html +++ b/docs/case_studies/engineer_trial_india_outputs/twin.html @@ -18,7 +18,7 @@ diff --git a/docs/index.md b/docs/index.md index 5e45c7d..5313477 100644 --- a/docs/index.md +++ b/docs/index.md @@ -192,11 +192,11 @@ - Engineer trial corridor (India) + Bhimashankar pilgrim ropeway

diff --git a/examples/case_engineer_trial_india.py b/examples/case_engineer_trial_india.py index 3117c2a..31036b5 100644 --- a/examples/case_engineer_trial_india.py +++ b/examples/case_engineer_trial_india.py @@ -1,11 +1,19 @@ -"""Case study: Engineer trial corridor (India). - -Generated by ``tools/new_case_study.py``. Replace the placeholder -notes + as-built numbers with real references before committing -the validation comparison. - -Notes from scaffold: - Engineer-trial corridor for the 2026-05-25 demo. Western Ghats region (Karjat/Matheran), India. 804 m corridor with 108 m elevation gain (~14% mean slope). Scaffolded for the live trial; rename + add as-built references once the engineer confirms which line he's modelling. +"""Case study: Bhimashankar pilgrim ropeway (Maharashtra, India). + +Bhimashankar is one of the twelve Jyotirlingas of Shiva, set in the +Sahyadri (Western Ghats) range of Maharashtra. The temple sits on +the plateau above a 600+ m vertical rise from the Shidighat trail +head — pilgrims today either trek several hours or take a long road +detour. The corridor below covers the **straight-line aerial route** +from Shidighat (lower) to the village/temple plateau (upper), +optimised as a jig-back tram for the 2026-05-25 engineer trial. + +Corridor: 2.18 km horizontal, ~740 m terminal-to-terminal rise +(34 % mean slope) — comparable in profile to alpine tourist trams +like the Aiguille du Midi Stage 2. + +Coordinates probed against Google Earth: lower at the Shidighat +viewpoint, upper near Landscape View / Bhimashankar trek-road head. """ from __future__ import annotations @@ -26,18 +34,23 @@ from ropeway.optimizer import GAConfig, optimize from ropeway.viz import plot_alignment, plot_convergence -START_LON, START_LAT = 73.5123812, 19.069145 -END_LON, END_LAT = 73.5189329, 19.0728925 +# Lower: Shidighat trail head. +# Upper: Bhimashankar plateau (near temple / village). +START_LON, START_LAT = 73.5123812, 19.0691450 +END_LON, END_LAT = 73.5330820, 19.0700494 DEM_PATH = Path("data/dem/Copernicus_DSM_N19_E073.tif") OUT_DIR = Path("docs/case_studies/engineer_trial_india_outputs") +SYSTEM = RopewaySystemType.JIG_BACK # bi-cable jig-back tram, two cabins + def main() -> None: if not DEM_PATH.exists(): raise SystemExit( - f"Missing {DEM_PATH}. Download the Copernicus tile " - "or run `ropeway tagline` first to seed the cache." + f"Missing {DEM_PATH}. Run `python -c \"from ropeway.dem import " + "ensure_dem_tile; ensure_dem_tile(73.51, 19.07, cache_dir='data/dem')\"` " + "first to seed the cache." ) profile = extract_profile_from_dem( @@ -50,8 +63,11 @@ def main() -> None: print(f"Total elevation gain : " f"{profile.elevation.max() - profile.elevation.min():.0f} m") - cfg = system_defaults(RopewaySystemType.MGD) - ga = GAConfig(generations=80, population_size=80, seed=2024) + cfg = system_defaults(SYSTEM) + ga = GAConfig( + generations=120, population_size=100, seed=2026, + max_intermediate_towers=8, + ) result = optimize( profile.as_function(), profile.total_length, cfg=cfg, ga=ga, @@ -64,7 +80,7 @@ def main() -> None: rep = eval_res.report fig, _ = plot_alignment(profile, align, segments=eval_res.segments, - title="Engineer trial corridor (India) — optimized alignment") + title="Bhimashankar pilgrim ropeway — optimised jig-back") fig.savefig(OUT_DIR / "alignment.png", dpi=140) plt.close(fig) @@ -76,10 +92,10 @@ def main() -> None: alignment_to_csv(align, profile, OUT_DIR / "towers.csv") alignment_to_landxml(align, profile, OUT_DIR / "alignment.landxml") - bom = build_bom(align, project_name="Engineer trial corridor (India)", - system=RopewaySystemType.MGD, cfg=cfg) + bom = build_bom(align, project_name="Bhimashankar pilgrim ropeway", + system=SYSTEM, cfg=cfg) (OUT_DIR / "bom.csv").write_text(bom.as_csv()) - est = estimate_cost(bom, region=Region.EU_ALPINE) + est = estimate_cost(bom, region=Region.EMERGING) (OUT_DIR / "cost_estimate.csv").write_text(est.as_csv()) print() @@ -88,7 +104,7 @@ def main() -> None: print(f"Cable length : {rep.total_cable_length_m:.0f} m") print(f"Min ground clearance : {rep.min_clearance_m:.2f} m") print(f"Max cable tension : {rep.max_tension_n / 1e3:.1f} kN") - print(f"Capex (EU_ALPINE band): EUR {est.grand_total:,.0f}") + print(f"Capex (EMERGING band) : USD {est.grand_total:,.0f}") print(f"Artifacts written -> {OUT_DIR}/") From 81802cf7406623c88bc6e6b37a55033abdec6665 Mon Sep 17 00:00:00 2001 From: Harsh Pandhe Date: Sun, 24 May 2026 14:02:00 +0530 Subject: [PATCH 04/21] fix(ui): surface 'currently loaded' label so Demo vs sidebar runs are unambiguous MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Demo tab and the sidebar 'Run optimization' button both write to the same st.session_state slots. If a user runs Bhimashankar from the Demo tab and then clicks the sidebar Run, the synthetic default overwrites the Demo result without warning — exactly the bug surfaced during pre-demo smoke testing (Optimize + 3-D Twin tabs were showing synthetic terrain after a Demo-tab Bhimashankar run was clobbered). - Both run paths now set session_state['loaded_label'] to a clear name. - Optimize and 3-D Digital Twin tabs show 'Currently loaded: ' at the top so it's never ambiguous which corridor is being viewed. - Demo-tab caption now explicitly warns the user not to click the sidebar Run button after a Demo run (would overwrite). --- app/streamlit_app.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/app/streamlit_app.py b/app/streamlit_app.py index 8b26c27..c534949 100644 --- a/app/streamlit_app.py +++ b/app/streamlit_app.py @@ -228,6 +228,9 @@ def _load_terrain(): st.session_state["profile"] = profile st.session_state["patch"] = patch st.session_state["cfg"] = cfg + st.session_state["loaded_label"] = ( + f"sidebar {mode} corridor ({optimizer_mode})" + ) # Tower-height edits start equal to the optimized layout. st.session_state["edited_heights"] = [t.height for t in st.session_state["alignment"].towers] @@ -250,6 +253,10 @@ def _load_terrain(): eval_res = st.session_state["eval"] history_best, history_avg = st.session_state["history"] +# "What is currently loaded" — surfaces in every tab so it's never +# ambiguous which corridor the Optimize / 3-D / Projects tabs show. +_loaded_label = st.session_state.get("loaded_label", "default synthetic 3 km corridor") + # ---- Tab 0: Demo (civil-engineer-friendly entry point) ---- with tab_demo: @@ -408,6 +415,7 @@ def _load_terrain(): st.session_state["alignment"] = align st.session_state["eval"] = eval_res_demo st.session_state["history"] = (result.history_best, result.history_avg) + st.session_state["loaded_label"] = f"{preset_name} (system: {demo_system})" progress.progress(1.0, text="Done.") @@ -433,12 +441,16 @@ def _load_terrain(): st.caption( "Open the **3-D Digital Twin** tab above for the interactive view, " - "or the **Optimize** tab for downloads (DXF, LandXML, PDF, BoM, GeoJSON)." + "or the **Optimize** tab for downloads (DXF, LandXML, PDF, BoM, GeoJSON). " + "Switching tabs now will show this Bhimashankar result. " + "**Do not click the sidebar `Run optimization` button** — that runs the " + "sidebar-configured (default: synthetic 3 km) corridor and overwrites this." ) # ---- Tab 1: Optimize ---- with tab_opt: + st.caption(f"Currently loaded: **{_loaded_label}**") rep = eval_res.report n_int = max(0, len(alignment.towers) - 2) pphpd = _pphpd(float(line_speed), float(cfg.seat_spacing_m), @@ -491,6 +503,7 @@ def _load_terrain(): # ---- Tab 2: 3-D Digital Twin ---- with tab_3d: + st.caption(f"Currently loaded: **{_loaded_label}**") try: from stpyvista import stpyvista _HAVE_STPYVISTA = True From c4de74ce1691aad00d7a0bc84eaa5ef0a49b09a4 Mon Sep 17 00:00:00 2001 From: Harsh Pandhe Date: Sun, 24 May 2026 14:22:59 +0530 Subject: [PATCH 05/21] feat(io): alignment_to_kml for Google Earth + QGIS visualisation guide MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit alignment_to_kml writes a KML 2.2 file with: - per-tower Point placemarks at absolute anchor elevation (ground + tower height), so the markers float at correct world height in Google Earth Pro - cable centerline as a LineString in absolute coords — renders as the actual suspended cable in GE's 3-D view - ground centerline as a clampToGround LineString for footprint reference - separate icon styles for stations (green star) and intermediate towers (blue circle) Wired into the Bhimashankar case study; alignment.kml now ships next to the existing .geojson / .landxml / .dxf. docs/VISUALIZE_GE_QGIS.md — engineer-facing walkthrough: - GE Pro: double-click the .kml; what the icons mean; tilt for 3-D - GE Web: same KML, with the LineString caveat - QGIS: drag-and-drop the .geojson, add OSM/ESRI basemap via QuickMapServices, optionally drop the DEM raster underneath for 3-D map view 6 new tests cover KML XML validity, placemark counts, absolute-altitude on tower Points and cable LineString, clampToGround on the ground reference, zero-length rejection. Full suite: 506 passing. --- docs/VISUALIZE_GE_QGIS.md | 111 +++++++++++++++ docs/case_studies/engineer_trial_india.md | 9 +- .../alignment.kml | 77 ++++++++++ examples/case_engineer_trial_india.py | 4 +- mkdocs.yml | 1 + src/ropeway/io.py | 132 ++++++++++++++++++ tests/test_io_kml.py | 104 ++++++++++++++ 7 files changed, 436 insertions(+), 2 deletions(-) create mode 100644 docs/VISUALIZE_GE_QGIS.md create mode 100644 docs/case_studies/engineer_trial_india_outputs/alignment.kml create mode 100644 tests/test_io_kml.py diff --git a/docs/VISUALIZE_GE_QGIS.md b/docs/VISUALIZE_GE_QGIS.md new file mode 100644 index 0000000..913e6e7 --- /dev/null +++ b/docs/VISUALIZE_GE_QGIS.md @@ -0,0 +1,111 @@ +# Visualize an alignment in Google Earth and QGIS + +Every case-study run drops a folder of artifacts at +`docs/case_studies/_outputs/`. Two of the files are +geospatial and import directly into Google Earth and QGIS — no +plugins, no conversion. + +| File | Format | Use it in | +|---|---|---| +| `alignment.kml` | KML 2.2 with absolute altitudes | Google Earth (Pro desktop + web) | +| `alignment.geojson` | GeoJSON FeatureCollection (WGS84) | QGIS, leaflet, Mapbox, GitHub render | +| `alignment.landxml` | LandXML 1.2 | AutoCAD Civil 3D, Bentley OpenRoads | +| `alignment.dxf` | AutoCAD DXF | AutoCAD, BricsCAD, FreeCAD | + +The two below cover the workflow an engineer is most likely to ask for. + +--- + +## Google Earth (Pro, desktop) + +1. Download Google Earth Pro: + (free, all platforms). +2. **Double-click** `alignment.kml`. Google Earth Pro opens it + automatically, flies to the corridor, and shows: + - green star icons at the two terminal stations, + - blue circle icons at every intermediate tower (label = "Tower N"), + - a **red line in 3-D space** following the cable, drawn at the + anchor elevation (ground + tower height) of each support, + - a grey line on the ground following the corridor footprint. +3. Click any tower marker → popup shows distance along corridor, + ground elevation, tower height, anchor elevation. +4. Tilt the view (mouse-wheel + Shift, or use the on-screen compass) + to see the cable suspended over the terrain. The dashed extrusion + between each tower and the ground makes the lift heights visible. + +### Google Earth Web + +1. Go to . +2. Top-left **Projects** → **New project** → **Import KML file from + computer**. Pick `alignment.kml`. The corridor appears in the + **Projects** panel. +3. Web Earth ignores `altitudeMode=absolute` for `` placemarks + in some browsers — the cable LineString still renders correctly + in 3-D, but towers may sit on the ground. Use the Pro desktop + client for the full effect. + +--- + +## QGIS + +1. Install QGIS: + (free, LTR is fine). +2. **Drag and drop** `alignment.geojson` onto the QGIS canvas. Two + layers appear automatically: + - **`alignment` (Point)** — one feature per tower with attributes + `index`, `distance_m`, `height_m`, `ground_elev_m`, + `anchor_elev_m`, `is_station`. + - **`alignment` (LineString)** — the cable centerline. +3. Add a basemap so it has context: + - **Plugins** → **Manage and install plugins** → install + **QuickMapServices**. Then **Web → QuickMapServices → OSM → + OSM Standard** (or **ESRI Satellite** for an aerial backdrop). +4. Style the tower points: right-click the point layer → **Properties + → Symbology**. Set **Categorized** on the `is_station` attribute + so stations and intermediate towers get different markers. +5. Style the cable: right-click the line layer → **Properties → + Symbology**. Pick a bold red line, width 1.0 mm. +6. To see elevations, open the point-layer attribute table + (right-click → **Open Attribute Table**) — every row carries + `height_m` and `anchor_elev_m`. + +### Add the DEM underneath in QGIS + +1. **Layer → Add Layer → Add Raster Layer** → pick the matching + `data/dem/Copernicus_DSM_*.tif` tile. +2. The corridor + towers + cable now sit on top of the actual + terrain raster. Right-click the raster → **Properties → Symbology** + → switch the render type to **Singleband Pseudocolor** with the + "Terrain" ramp for a shaded relief look. +3. **3-D view**: **View → New 3-D Map View**. Pan/tilt to see the + line in true 3-D against the DEM. Set the raster as the elevation + source in the 3-D view config. + +--- + +## What if the engineer wants to share with non-technical stakeholders? + +- The cleanest hand-off is the **`twin.html`** file in the same + outputs folder. It opens in any browser with no install. The 3-D + scene has the terrain swath, towers, and cable already baked in. +- For pure-PDF stakeholders, the **`validation_report.pdf`** has the + multi-page write-up: every Eurocode check, the alignment plot, + the convergence curve. + +--- + +## Per-corridor file list (Bhimashankar pilgrim ropeway example) + +``` +docs/case_studies/engineer_trial_india_outputs/ +├── alignment.dxf # AutoCAD overlay +├── alignment.geojson # QGIS / Leaflet / Mapbox ← drag-and-drop into QGIS +├── alignment.kml # Google Earth (desktop + web) ← double-click in GE Pro +├── alignment.landxml # Civil 3D / OpenRoads +├── alignment.png # plan + elevation view (for briefings) +├── bom.csv # bill of materials +├── convergence.png # GA convergence curve +├── cost_estimate.csv # capex breakdown +├── towers.csv # tower schedule (distance, height, station flag) +└── twin.html # interactive 3-D viewer (no plugin) +``` diff --git a/docs/case_studies/engineer_trial_india.md b/docs/case_studies/engineer_trial_india.md index 351ee3f..270b603 100644 --- a/docs/case_studies/engineer_trial_india.md +++ b/docs/case_studies/engineer_trial_india.md @@ -98,8 +98,15 @@ from the existing Bhimashankar trek road. * `alignment.png` — plan + elevation view * `alignment.dxf` — AutoCAD overlay for the survey * `alignment.landxml` — LandXML 1.2 for civil software -* `alignment.geojson` — QGIS / web-map overlay +* `alignment.kml` — **double-click to open in Google Earth Pro** — + 3-D cable suspended at correct anchor elevation, station vs tower + icons, ground-footprint reference line +* `alignment.geojson` — **drag-and-drop into QGIS** — point layer + for towers (with `height_m`, `anchor_elev_m`, `is_station` + attributes) + line layer for the cable centerline * `towers.csv` — tower schedule * `bom.csv` — bill of materials * `cost_estimate.csv` — Emerging-band capex breakdown * `twin.html` — standalone 3-D viewer (no plugin) + +Full walkthrough with screenshots: **[Visualize: Google Earth + QGIS](../VISUALIZE_GE_QGIS.md)**. diff --git a/docs/case_studies/engineer_trial_india_outputs/alignment.kml b/docs/case_studies/engineer_trial_india_outputs/alignment.kml new file mode 100644 index 0000000..5dfb2ad --- /dev/null +++ b/docs/case_studies/engineer_trial_india_outputs/alignment.kml @@ -0,0 +1,77 @@ + + + + Bhimashankar pilgrim ropeway + Generated by Autonomous Ropeway Alignment + + + + + + Towers + stations + + Station 0 + 0 m
Ground elevation: 211 m
Tower height: 5.0 m
Anchor (cable) elevation: 216 m
Lateral offset: 0.0 m]]> + #stationStyle + + absolute + 1 + 73.5123812,19.0691450,216.33 + + + + Tower 1 + 1820 m

Ground elevation: 948 m
Tower height: 38.7 m
Anchor (cable) elevation: 986 m
Lateral offset: 0.0 m]]> + #towerStyle + + absolute + 1 + 73.5296546,19.0698997,986.27 + + + + Station 2 + 2181 m

YDSDXvVHeAtqjD8K7dC9L2l@Fo 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�t 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 diff --git a/docs/case_studies/engineer_trial_india_outputs/bom.csv b/docs/case_studies/engineer_trial_india_outputs/bom.csv index 7d13c89..dd439d7 100644 --- a/docs/case_studies/engineer_trial_india_outputs/bom.csv +++ b/docs/case_studies/engineer_trial_india_outputs/bom.csv @@ -1,10 +1,10 @@ item,qty,unit,notes -Steel tower fabrication,8545.98,kg,"sum of 4 towers, k=280 kg/m" -Tower-top sheave assembly,2.00,ea,"one assembly per intermediate tower" -Concrete foundation,90.00,m^3,"4 pads, 2.5 m deep" -Reinforcing rebar,7200.00,kg,"80 kg/m^3 of concrete (typ. mountain footing)" -Steel wire rope,1810.97,m,"2 strand(s) incl. 5% slack + 50 m tails" +Steel tower fabrication,29542.06,kg,"sum of 3 towers, k=280 kg/m" +Tower-top sheave assembly,1.00,ea,"one assembly per intermediate tower" +Concrete foundation,67.50,m^3,"3 pads, 2.5 m deep" +Reinforcing rebar,5400.00,kg,"80 kg/m^3 of concrete (typ. mountain footing)" +Steel wire rope,15071.70,m,"6 strand(s) incl. 5% slack + 50 m tails" Station building (drive),1.00,ea,"incl. drive + tensioning station" Station building (return),1.00,ea,"incl. return bullwheel" Drive motor + VFD,1.00,ea,"rated to design speed and full load" -Carriers (cabins / chairs),16.00,ea,"@ 50 m spacing, 8 pax each" +Carriers (cabins / chairs),1.00,ea,"@ 3000 m spacing, 80 pax each" diff --git a/docs/case_studies/engineer_trial_india_outputs/convergence.png b/docs/case_studies/engineer_trial_india_outputs/convergence.png index 861ce3bdc5477e29071c7a25515e1177de014fca..278dd96a999ed7add05af60c860352bf7947f5c2 100644 GIT binary patch literal 53516 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 PbY4qizj}(Q)!F|6j2>3E literal 53778 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


Ground elevation: 953 m
Tower height: 61.8 m
Anchor (cable) elevation: 1015 m
Lateral offset: 0.0 m]]> + #stationStyle + + absolute + 1 + 73.5330820,19.0700494,1014.55 + + + + + Cable centerline + #cableStyle + + absolute + 1 + 73.5123812,19.0691450,216.33 73.5296546,19.0698997,986.27 73.5330820,19.0700494,1014.55 + + + + Ground centerline (reference) + #groundStyle + + clampToGround + 1 + 73.5123812,19.0691450,211.33 73.5296546,19.0698997,947.61 73.5330820,19.0700494,952.71 + + + + diff --git a/examples/case_engineer_trial_india.py b/examples/case_engineer_trial_india.py index 31036b5..07f1b34 100644 --- a/examples/case_engineer_trial_india.py +++ b/examples/case_engineer_trial_india.py @@ -28,7 +28,7 @@ from ropeway.bom import build_bom from ropeway.cost import Region, estimate_cost from ropeway.dem import extract_profile_from_dem -from ropeway.io import alignment_to_csv, alignment_to_geojson +from ropeway.io import alignment_to_csv, alignment_to_geojson, alignment_to_kml from ropeway.landxml import alignment_to_landxml from ropeway.multi_rope import RopewaySystemType, system_defaults from ropeway.optimizer import GAConfig, optimize @@ -91,6 +91,8 @@ def main() -> None: alignment_to_geojson(align, profile, OUT_DIR / "alignment.geojson") alignment_to_csv(align, profile, OUT_DIR / "towers.csv") alignment_to_landxml(align, profile, OUT_DIR / "alignment.landxml") + alignment_to_kml(align, profile, OUT_DIR / "alignment.kml", + project_name="Bhimashankar pilgrim ropeway") bom = build_bom(align, project_name="Bhimashankar pilgrim ropeway", system=SYSTEM, cfg=cfg) diff --git a/mkdocs.yml b/mkdocs.yml index db52af3..c20283a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -56,6 +56,7 @@ markdown_extensions: nav: - Home: index.md - Process: PROCESS.md + - "Visualize: Google Earth + QGIS": VISUALIZE_GE_QGIS.md - Pitch: PITCH.md - Pricing: PRICING.md - Whitepaper: WHITEPAPER.md diff --git a/src/ropeway/io.py b/src/ropeway/io.py index ec6e212..6355583 100644 --- a/src/ropeway/io.py +++ b/src/ropeway/io.py @@ -83,6 +83,138 @@ def lonlat_at(distance_m: float) -> tuple[float, float]: return out_path +def alignment_to_kml( + alignment: Alignment, + profile: TerrainProfile, + out_path: str | Path, + *, + project_name: str = "Ropeway alignment", +) -> Path: + """Export the alignment as a Google-Earth-ready KML file. + + Geometry shipped: + - one ```` per tower with ```` at the **tower-top + anchor** (ground elev + tower height), ``altitudeMode=absolute`` + so the markers float at correct world height. + - one ```` for the **cable centerline** as a + ```` of (lon, lat, anchor_elev) — renders as the + actual cable suspended over terrain. + - one ```` for the **ground centerline** as a + ```` clamped to ground — useful as a visual + reference for the corridor footprint. + + Coords in WGS84 (EPSG:4326). Open by double-clicking the .kml in + Google Earth Pro (desktop) or uploading via 'New project' → + 'Import KML file' on earth.google.com. + """ + out_path = Path(out_path) + start = profile.start_lonlat + end = profile.end_lonlat + total_len_m = profile.total_length + if total_len_m <= 0: + raise ValueError("profile has zero length") + + def lonlat_at(distance_m: float) -> tuple[float, float]: + t = distance_m / total_len_m + return ( + start[0] + (end[0] - start[0]) * t, + start[1] + (end[1] - start[1]) * t, + ) + + n = len(alignment.towers) + tower_placemarks: list[str] = [] + cable_coords: list[str] = [] + ground_coords: list[str] = [] + + for i, t in enumerate(alignment.towers): + lon, lat = lonlat_at(t.distance) + ground = float(profile.elevation_at(t.distance)) + anchor = ground + t.height + is_station = bool(t.is_station) or i in (0, n - 1) + style = "stationStyle" if is_station else "towerStyle" + label = ( + f"Station {i}" if is_station and i == 0 else + f"Station {i}" if is_station and i == n - 1 else + f"Station {i}" if is_station else + f"Tower {i}" + ) + descr = ( + f"{t.distance:.0f} m

" + f"Ground elevation: {ground:.0f} m
" + f"Tower height: {t.height:.1f} m
" + f"Anchor (cable) elevation: {anchor:.0f} m
" + f"Lateral offset: {t.offset:.1f} m]]>" + ) + tower_placemarks.append( + f' \n' + f' {label}\n' + f' {descr}\n' + f' #{style}\n' + f' \n' + f' absolute\n' + f' 1\n' + f' {lon:.7f},{lat:.7f},{anchor:.2f}\n' + f' \n' + f' ' + ) + cable_coords.append(f"{lon:.7f},{lat:.7f},{anchor:.2f}") + ground_coords.append(f"{lon:.7f},{lat:.7f},{ground:.2f}") + + kml = ( + '\n' + '\n' + ' \n' + f' {project_name}\n' + ' Generated by Autonomous Ropeway Alignment\n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' Towers + stations\n' + f'{chr(10).join(tower_placemarks)}\n' + ' \n' + ' \n' + ' Cable centerline\n' + ' #cableStyle\n' + ' \n' + ' absolute\n' + ' 1\n' + f' {" ".join(cable_coords)}\n' + ' \n' + ' \n' + ' \n' + ' Ground centerline (reference)\n' + ' #groundStyle\n' + ' \n' + ' clampToGround\n' + ' 1\n' + f' {" ".join(ground_coords)}\n' + ' \n' + ' \n' + ' \n' + '\n' + ) + out_path.parent.mkdir(parents=True, exist_ok=True) + out_path.write_text(kml) + return out_path + + def alignment_to_csv(alignment: Alignment, profile: TerrainProfile, out_path: str | Path) -> Path: """Export tower schedule as CSV.""" out_path = Path(out_path) diff --git a/tests/test_io_kml.py b/tests/test_io_kml.py new file mode 100644 index 0000000..827f898 --- /dev/null +++ b/tests/test_io_kml.py @@ -0,0 +1,104 @@ +"""Smoke tests for alignment_to_kml.""" + +from __future__ import annotations + +from pathlib import Path +from xml.etree import ElementTree as ET + +import pytest + +from ropeway.alignment import Alignment, Tower +from ropeway.dem import synthetic_profile +from ropeway.io import alignment_to_kml +from ropeway.safety import ConstraintConfig + + +KML_NS = "{http://www.opengis.net/kml/2.2}" + + +def _three_tower_alignment(): + cfg = ConstraintConfig() + p = synthetic_profile(length_m=2000.0, seed=4) + a = Alignment( + towers=[ + Tower(0.0, 18.0, is_station=True), + Tower(1000.0, 30.0), + Tower(2000.0, 22.0, is_station=True), + ], + profile_fn=p.as_function(), + cfg=cfg, + ) + return a, p + + +def test_kml_file_is_valid_xml_with_expected_root(tmp_path: Path): + a, p = _three_tower_alignment() + out = alignment_to_kml(a, p, tmp_path / "x.kml", project_name="Test corridor") + assert out.exists() + tree = ET.parse(out) + root = tree.getroot() + assert root.tag == f"{KML_NS}kml" + doc = root.find(f"{KML_NS}Document") + assert doc is not None + name = doc.find(f"{KML_NS}name") + assert name is not None and name.text == "Test corridor" + + +def test_kml_emits_one_placemark_per_tower_plus_two_lines(tmp_path: Path): + """3 towers → 3 tower Placemarks + cable LineString + ground LineString = 5 Placemarks.""" + a, p = _three_tower_alignment() + out = alignment_to_kml(a, p, tmp_path / "x.kml") + tree = ET.parse(out) + placemarks = tree.findall(f".//{KML_NS}Placemark") + assert len(placemarks) == 3 + 2 + + points = tree.findall(f".//{KML_NS}Point") + assert len(points) == 3 + + lines = tree.findall(f".//{KML_NS}LineString") + assert len(lines) == 2 + + +def test_kml_tower_point_uses_absolute_altitude_at_anchor(tmp_path: Path): + """Tower marker should be at ground_elev + tower_height, not at ground.""" + a, p = _three_tower_alignment() + out = alignment_to_kml(a, p, tmp_path / "x.kml") + tree = ET.parse(out) + points = tree.findall(f".//{KML_NS}Point") + altmode = points[1].find(f"{KML_NS}altitudeMode") + assert altmode is not None and altmode.text == "absolute" + coords = points[1].find(f"{KML_NS}coordinates").text.strip() + lon, lat, alt = coords.split(",") + ground = float(p.elevation_at(1000.0)) + expected = ground + 30.0 + assert float(alt) == pytest.approx(expected, abs=0.1) + + +def test_kml_cable_linestring_uses_absolute_altitude(tmp_path: Path): + a, p = _three_tower_alignment() + out = alignment_to_kml(a, p, tmp_path / "x.kml") + tree = ET.parse(out) + lines = tree.findall(f".//{KML_NS}LineString") + cable_line = lines[0] # cable centerline comes first + altmode = cable_line.find(f"{KML_NS}altitudeMode") + assert altmode is not None and altmode.text == "absolute" + coord_text = cable_line.find(f"{KML_NS}coordinates").text.strip().split() + assert len(coord_text) == 3 # one (lon,lat,alt) per tower + + +def test_kml_ground_linestring_clamps_to_ground(tmp_path: Path): + a, p = _three_tower_alignment() + out = alignment_to_kml(a, p, tmp_path / "x.kml") + tree = ET.parse(out) + lines = tree.findall(f".//{KML_NS}LineString") + ground_line = lines[1] + altmode = ground_line.find(f"{KML_NS}altitudeMode") + assert altmode is not None and altmode.text == "clampToGround" + + +def test_kml_zero_length_profile_rejected(tmp_path: Path): + """A zero-length corridor would produce a degenerate KML; reject up front.""" + a, p = _three_tower_alignment() + p.distance[-1] = 0.0 # nuke length + with pytest.raises(ValueError, match="zero length"): + alignment_to_kml(a, p, tmp_path / "x.kml") From 2e3c197151c2e5ae9a1db49826a54d4c389aabc5 Mon Sep 17 00:00:00 2001 From: Harsh Pandhe Date: Sun, 24 May 2026 19:04:43 +0530 Subject: [PATCH 06/21] feat(p72-74): cable rides terrain, station vocabulary, one-button ZIP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P72 — KML cable rides Google Earth's terrain. Switch altitudeMode from 'absolute' to 'relativeToGround' for tower Points and cable LineString. Densify the cable polyline with N catenary samples per span (default 24) when segments= is passed. Each sample emits its height-above-local-ground so GE renders the cable above whatever terrain it has — closes the bug where our 30 m Copernicus DEM disagreed with GE's finer terrain and dropped the cable underground. P73 — Station vs Tower vocabulary everywhere a user sees. index 0 → 'Lower station', index N-1 → 'Upper station', other is_station=True → 'Station ', non-station intermediates → 'Tower '. Applied in KML names + GeoJSON properties (new 'label' key). _support_label() helper to keep one source of truth. P74 — One-button permit-pack ZIP in Streamlit Demo tab. After a Demo run, a single 'Download permit pack (ZIP)' button bundles KML/DXF/LandXML/GeoJSON/BoM/cost/towers.csv + the alignment & convergence PNGs into one zip the engineer can drop into a permitting office or stakeholder deck. No CLI, no per-file download dance. Bhimashankar test: cable now renders 3.22-152 m above ground along the corridor (min/max), never below 0. Vocabulary now 'Lower station'/'Tower 1'/'Upper station'. docs/POST_TRIAL_PLAN.md — three-horizon plan (H1 recover, H2 web product, H3 commercial) capturing the pivot to web-only UX, Cesium 3-D in browser, AI input, embedded Google Earth walkthrough. Tests: 4 KML tests updated for relativeToGround behaviour, 3 new tests added (densification, no-underground guarantee, station vocabulary). Full suite: 509 passing. --- app/streamlit_app.py | 73 +++++++- docs/POST_TRIAL_PLAN.md | 168 ++++++++++++++++++ .../alignment.kml | 28 +-- examples/case_engineer_trial_india.py | 3 +- src/ropeway/io.py | 116 +++++++++--- tests/test_io_kml.py | 69 +++++-- 6 files changed, 397 insertions(+), 60 deletions(-) create mode 100644 docs/POST_TRIAL_PLAN.md diff --git a/app/streamlit_app.py b/app/streamlit_app.py index c534949..f197fd9 100644 --- a/app/streamlit_app.py +++ b/app/streamlit_app.py @@ -439,12 +439,75 @@ def _load_terrain(): fig_c, _ = plot_convergence(result.history_best, result.history_avg) st.pyplot(fig_c, width="stretch") + # ---- P74: one-button "build me everything" ZIP ---- + st.markdown("---") + st.markdown("### Download the permit pack") st.caption( - "Open the **3-D Digital Twin** tab above for the interactive view, " - "or the **Optimize** tab for downloads (DXF, LandXML, PDF, BoM, GeoJSON). " - "Switching tabs now will show this Bhimashankar result. " - "**Do not click the sidebar `Run optimization` button** — that runs the " - "sidebar-configured (default: synthetic 3 km) corridor and overwrites this." + "Single ZIP with KML (Google Earth), DXF (AutoCAD), LandXML, " + "GeoJSON (QGIS), BoM, capex estimate, tower schedule, " + "convergence + alignment PNGs." + ) + + import io as _io + import zipfile + from datetime import datetime as _dt + from ropeway.bom import build_bom as _build_bom + from ropeway.cost import Region as _Region, estimate_cost as _est_cost + from ropeway.dxf_export import alignment_to_dxf as _to_dxf + from ropeway.io import ( + alignment_to_csv as _to_csv, + alignment_to_geojson as _to_geojson, + alignment_to_kml as _to_kml, + ) + from ropeway.landxml import alignment_to_landxml as _to_landxml + from ropeway.multi_rope import RopewaySystemType as _RST + + slug = "".join(c if c.isalnum() else "_" for c in preset_name).strip("_").lower() + with _io.BytesIO() as buf: + with zipfile.ZipFile(buf, "w", zipfile.ZIP_DEFLATED) as zf: + import tempfile as _tmp + with _tmp.TemporaryDirectory() as td: + td_p = Path(td) + _to_kml(align, profile, td_p / "alignment.kml", + project_name=preset_name, segments=eval_res_demo.segments) + _to_dxf(align, profile, td_p / "alignment.dxf", + project_name=preset_name) + _to_landxml(align, profile, td_p / "alignment.landxml") + _to_geojson(align, profile, td_p / "alignment.geojson") + _to_csv(align, profile, td_p / "towers.csv") + + sys_enum_map = {"jigback": _RST.JIG_BACK, "mgd": _RST.MGD, + "bgd": _RST.BGD, "3s": _RST.TGD_3S, + "chair": _RST.CHAIRLIFT, "funitel": _RST.FUNITEL} + bom_obj = _build_bom(align, project_name=preset_name, + system=sys_enum_map[demo_system], cfg=cfg_demo) + (td_p / "bom.csv").write_text(bom_obj.as_csv()) + est_obj = _est_cost(bom_obj, region=_Region.EMERGING) + (td_p / "cost_estimate.csv").write_text(est_obj.as_csv()) + + fig_a.savefig(td_p / "alignment.png", dpi=140) + fig_c.savefig(td_p / "convergence.png", dpi=140) + + for f in sorted(td_p.iterdir()): + zf.write(f, arcname=f"{slug}/{f.name}") + + zip_bytes = buf.getvalue() + + stamp = _dt.utcnow().strftime("%Y%m%d_%H%M") + st.download_button( + label="⬇ Download permit pack (ZIP)", + data=zip_bytes, + file_name=f"ropeway_{slug}_{stamp}.zip", + mime="application/zip", + type="primary", + use_container_width=True, + key="demo_zip_download", + ) + + st.caption( + "Need the interactive 3-D viewer? Open the **3-D Digital Twin** tab. " + "Need a knob-tunable run? **Advanced** users open the sidebar — but the " + "sidebar `Run optimization` button **overwrites** this Demo result." ) diff --git a/docs/POST_TRIAL_PLAN.md b/docs/POST_TRIAL_PLAN.md new file mode 100644 index 0000000..f2786d4 --- /dev/null +++ b/docs/POST_TRIAL_PLAN.md @@ -0,0 +1,168 @@ +# Post-trial plan — web-first, civil-engineer-grade UX + +> **Operating principle.** A civil engineer opens a URL, picks two +> points on a map (or types a place name in plain English), and a +> finished alignment lands in front of them in a 3-D Google-Earth- +> grade scene with full export pack. No CLI. No Python. No mkdocs. +> No terminals visible anywhere. + +--- + +## What went wrong on 2026-05-24 + +| Symptom | Root cause | +|---|---| +| KML cable disappears into hillside in Google Earth | Our absolute-altitude KML uses Copernicus 30 m DEM. GE renders with its own (often finer) terrain. When the two disagree, cable elevation drops below GE's ground. | +| PyVista 3-D twin felt clunky | It is. It's a desktop research tool ported into a browser via trame; not the right surface. | +| Engineer couldn't operate it without you | Streamlit's sidebar still exposes engine knobs. Demo tab helps but the rest of the UI is still developer-facing. | +| CLI in the runbook | Engineers should never see one. Not in pre-flight, not for "regenerate twins", not anywhere. | +| `Tower 0` for terminals | Wrong vocabulary. Terminal = "Station". Intermediate = "Tower". | +| Static graphs | Engineer expected interactive plots (zoom, hover, compare). | + +All of the above are fixable. Plan below. + +--- + +## Three horizons + +### Horizon 1 — recover the demo (this week, 1-2 days) + +Goal: any engineer who opens the URL today **sees a working +Google-Earth-quality scene** without needing you. This is recovery, +not the rebuild. + +| # | Phase | Scope | Effort | Acceptance | +|---|---|---|---|---| +| **P72** | KML cable rides terrain | `altitudeMode=relativeToGround`; densify the cable polyline with N sag samples per span using the catenary equation; tower marker altitude = tower height above ground (not absolute). | S | Cable never goes underground in GE on Bhimashankar | +| **P73** | Station vs Tower labels everywhere | `Tower(is_station=True)` renders "Station " in KML / docs / Streamlit / plots / PDF. Names: `"Lower station"`, `"Upper station"`, `"Station "` for pinned stations. | S | No "Tower 0" anywhere a user sees | +| **P74** | One-button "build me everything" | Single Streamlit Demo-tab button that triggers: optimize → KML → DXF → LandXML → PDF → twin → returns a ZIP. Hide the Optimize and 3-D Twin tabs unless an "Advanced" toggle is on. | S | Engineer downloads one ZIP, opens KML in GE, gets the cable above terrain | +| **P75** | Demo runbook becomes a 30-sec video | Screen-cap a clean walkthrough: open URL → enter 2 coords → click Run → download ZIP → open KML in GE → fly the corridor. Host on the landing page as the hero. | S | Landing page leads with the video, not with text | + +After H1 the engineer can do the entire flow themselves from a +browser tab. Still Streamlit. Still your box. But it works end-to-end. + +### Horizon 2 — the web product (2-3 weeks) + +Goal: kill Streamlit + CLI for end users. Replace with a Next.js +SPA hitting FastAPI on your box via Cloudflare Tunnel. Cesium for +3-D, Plotly for graphs, AI for input. + +| # | Phase | Scope | Effort | Acceptance | +|---|---|---|---|---| +| **P76** | FastAPI corridor endpoint | `POST /api/v1/corridor` accepts `{start, end, system?, name?}`, runs the optimizer via Phase 9b job queue, returns `job_id` + WebSocket for live progress. | M | curl / Postman returns an alignment in 5-15 s | +| **P77** | Next.js SPA scaffold | TS + Next 15 + shadcn/ui + Tailwind + react-query. Single page: hero, map input, results panel. Vercel deploy. Hits FastAPI on the tunnel. | M | Deployed at `.vercel.app`; clicks → real backend | +| **P78** | Map-first corridor input | MapLibre or Leaflet (free, no key) for picking 2 points. Auto-reverse-geocode for station names. "Suggest endpoints" button. | M | Click 2 spots → see corridor highlighted → click Run | +| **P79** | Cesium 3-D viewer | Cesium Ion free tier (or open-tile fallback). Render terrain + cable + tower meshes. Free-fly camera. "Tour" button auto-flies the corridor. Cable uses relativeToGround so it never clips. | L | Engineer can fly the cable end-to-end in the browser, no plugin | +| **P80** | Interactive graphs | Plotly (or Observable Plot): convergence curve, elevation profile with cable overlay, tension diagram, capex bar. Hover for values. | M | Every metric on the result page is clickable / hoverable | +| **P81** | AI input mode | `POST /api/v1/ask` takes free text ("ropeway from Shidighat to Bhimashankar temple, MGD"), Claude Sonnet parses → coords + system + constraints → runs P76. Fallback to map if ambiguous. | M | Engineer types one sentence, gets a corridor | +| **P82** | Export pack on result page | One-click download for KML / DXF / LandXML / GeoJSON / PDF / ZIP. No CLI. | S | Right-rail panel with 6 download buttons | +| **P83** | Auth + tier gating | OAuth (P26 already done) carries through to the SPA. Free tier: 3 runs / day. Paid tier: unlimited + custom system overrides. | M | New user lands at `/sign-in`; signed in user sees tier badge | + +After H2 the product is a real web app. Any civil engineer with the +URL can model their own corridor. You only run the backend. + +### Horizon 3 — commercial-ready (1-2 months) + +Goal: the product reads like Doppelmayr's online configurator, not +like a research repo. + +| # | Phase | Scope | Effort | Acceptance | +|---|---|---|---|---| +| **P84** | Project workspace | Saved corridors, named projects, version history, share-link tokens. P26 user model + new `corridors` table. | M | Engineer can re-open a corridor a week later, share a URL with their colleague | +| **P85** | Walkthrough video generator | Server-side render a 30-60 s flyover MP4 of the optimized corridor (Cesium → headless Chromium → ffmpeg). Auto-attached to the result page; downloadable. | M | Result page shows a flyover the engineer can email to a stakeholder | +| **P86** | AI design assistant | Sonnet chat in the result panel: "make it cheaper", "fewer towers", "avoid this polygon I just drew" → translates to GA params + reruns. | M | Engineer iterates by chatting, not by re-clicking forms | +| **P87** | Stakeholder presentation export | One-click PDF that bundles: aerial photo from the satellite tile, alignment plan, validation summary, BoM table, flyover video link, share-link token. | M | Engineer downloads one PDF to take to a meeting | +| **P88** | Comparison mode | Side-by-side: optimizer result vs as-built (when known) vs engineer's manual sketch. Tower-by-tower diff. | M | Engineer can show "here's what the tool found that I missed" | +| **P89** | Realtime DEM upgrade | Pull latest Copernicus revisions + optionally Mapbox terrain RGB / Google Maps 3D-Tiles where licensed. Heuristic: pick best free source per region. | M | Bhimashankar terrain matches GE imagery 1:1 | +| **P90** | Cost model overhaul | Drop the Eurocode-EU defaults for emerging-market projects; use OEM-supplied unit costs (Doppelmayr/Leitner/Damodar) with region multipliers. Engineer-editable. | M | Capex matches a real published tender within ±20 % | +| **P91** | Audit + permit-pack PDF | Multi-page PDF auto-generated with cover page, all Eurocode/ISO checks, plan view at survey scale, tower schedule, BoM, capex, engineer sign-off block. | M | Engineer takes one PDF to a permitting office | +| **P92** | Mobile-friendly result view | Result page works on iPhone-class screens (engineer in the field). Cesium → fallback static images + numbers. | S | Demoable from a phone at the corridor site | + +After H3 this is a commercial-grade tool. Demoing it should feel +like demoing Figma, not like demoing a research notebook. + +--- + +## What we delete + +- **CLI as a user surface.** `ropeway` stays internal (you, CI). Engineer never sees a terminal. +- **Streamlit.** Replaced by the Next.js SPA. We keep one Streamlit page as an admin / debug surface but it's not the URL we share. +- **PyVista / trame 3-D twin.** Dead. Cesium replaces it. +- **mkdocs as the "landing page".** mkdocs stays for technical docs (engineers' second visit). The landing-page hero becomes the SPA hero. +- **Static PNG plots.** Replaced by interactive Plotly / Observable Plot. + +## What we keep + +- The **engine** (optimizer, NSGA-II, RSM surrogate, RL, all the + Eurocode checks, all the validation against 12 real installations). + That's the moat. Web is a skin over it. +- The **case studies** as marketing proof. Render them in Cesium + too, embed the flyovers on the landing. +- **FastAPI + Cloudflare Tunnel** topology from P28b. Already specced. + +--- + +## What an engineer experiences after H1 + H2 + H3 + +1. Opens `bhimashankar.example` from his phone. +2. Sees a 30-second flyover of Aiguille du Midi running automatically (proof). +3. Clicks **Try yours** → map opens. Drops two pins. +4. Map auto-resolves "Shidighat" and "Bhimashankar plateau" as station names. +5. Types `MGD, pilgrim service` in the system box (or skips it — AI defaults). +6. Clicks **Build my alignment**. +7. Watches a progress bar for 8 seconds. +8. Result page renders: + - **Hero:** auto-flown Cesium 3-D view of the alignment over satellite terrain. + - **Right rail:** download buttons (PDF / KML / DXF / LandXML / video). + - **Below the fold:** interactive elevation profile, tension diagram, convergence curve, capex bar. + - **Chat box:** "Make it cheaper" → AI re-runs with `w_n` raised → result updates inline. +9. Clicks **Share** → gets a link he sends his boss. +10. Boss opens it on a desktop → same scene + the **Download presentation PDF** button. + +No terminal. No mkdocs. No Streamlit. No "double-click the KML". + +--- + +## Sequence and dependency graph + +``` +H1 (recover): P72 ─ P73 ─ P74 ─ P75 [in series, 1-2 days] + │ +H2 (web product): P76 ─ P77 ─ P78 │ + │ │ │ │ + ├─── P79 ──┤ │ + ├─── P80 ──┤ │ + ├─── P81 ──┤ │ + ├─── P82 ──┤ │ + └─── P83 ──┘ │ + │ +H3 (commercial): P84 ─ P85 ─ P86 ─ P87 ─ P88 ─ P89 ─ P90 ─ P91 ─ P92 +``` + +H1 ships this week. +H2 ships in 2-3 weeks (one phase per day if focused). +H3 ships in 1-2 months. + +End of H2 = engineer-usable web product. +End of H3 = commercial-grade. + +--- + +## Decision points + +1. **Cesium Ion (free tier, key needed) vs Mapbox GL JS + open tiles (no key, less smooth)** — pick before P79. +2. **Vercel hosting tier** — free tier handles the SPA; FastAPI stays on your box via tunnel. Upgrade only if traffic warrants. +3. **AI provider** — Claude Sonnet 4.5/4.6 via Anthropic SDK is the default (P33 was already specced for this). Free tier with rate-limit; paid users pass their own key. +4. **Walkthrough-video tech** — Cesium-Sandcastle + headless Chromium + ffmpeg is the cheap path; Blender CLI is the fancy path. Start cheap. + +--- + +## What you do tomorrow (post-trial day 1) + +1. Merge **#58 / #70 / #71** (queued PRs from yesterday) so main reflects the demo pack. +2. Ship **P72 + P73** in one PR (KML fix + station/tower vocabulary fix). 30 min of work. +3. Cut **P74** branch (one-button "build everything" in Streamlit + ZIP download). 1 hr. +4. Record the **P75** video. 30 min. +5. **Re-send the URL** to the engineer with a one-sentence note: "fixed the visualisation bug + simplified the flow, please retry." + +That's day 1. P76 starts day 2. diff --git a/docs/case_studies/engineer_trial_india_outputs/alignment.kml b/docs/case_studies/engineer_trial_india_outputs/alignment.kml index 5dfb2ad..e9ffa66 100644 --- a/docs/case_studies/engineer_trial_india_outputs/alignment.kml +++ b/docs/case_studies/engineer_trial_india_outputs/alignment.kml @@ -25,33 +25,33 @@ Towers + stations - Station 0 - 0 m
Ground elevation: 211 m
Tower height: 5.0 m
Anchor (cable) elevation: 216 m
Lateral offset: 0.0 m]]>
+ Lower station + 0 m
Ground elevation (DEM): 211 m
Support height: 5.0 m
Anchor elevation: 216 m
Lateral offset: 0.0 m]]>
#stationStyle - absolute + relativeToGround 1 - 73.5123812,19.0691450,216.33 + 73.5123812,19.0691450,5.00
Tower 1 - 1820 m
Ground elevation: 948 m
Tower height: 38.7 m
Anchor (cable) elevation: 986 m
Lateral offset: 0.0 m]]>
+ 1820 m
Ground elevation (DEM): 948 m
Support height: 38.7 m
Anchor elevation: 986 m
Lateral offset: 0.0 m]]>
#towerStyle - absolute + relativeToGround 1 - 73.5296546,19.0698997,986.27 + 73.5296546,19.0698997,38.66
- Station 2 - 2181 m
Ground elevation: 953 m
Tower height: 61.8 m
Anchor (cable) elevation: 1015 m
Lateral offset: 0.0 m]]>
+ Upper station + 2181 m
Ground elevation (DEM): 953 m
Support height: 61.8 m
Anchor elevation: 1015 m
Lateral offset: 0.0 m]]>
#stationStyle - absolute + relativeToGround 1 - 73.5330820,19.0700494,1014.55 + 73.5330820,19.0700494,61.85
@@ -59,9 +59,9 @@ Cable centerline #cableStyle - absolute + relativeToGround 1 - 73.5123812,19.0691450,216.33 73.5296546,19.0698997,986.27 73.5330820,19.0700494,1014.55 + 73.5123812,19.0691450,5.00 73.5131322,19.0691778,30.41 73.5138832,19.0692106,51.16 73.5146342,19.0692434,70.83 73.5153853,19.0692762,89.51 73.5161363,19.0693091,111.89 73.5168873,19.0693419,114.51 73.5176383,19.0693747,118.67 73.5183893,19.0694075,117.22 73.5191403,19.0694403,107.63 73.5198914,19.0694731,64.02 73.5206424,19.0695059,3.44 73.5213934,19.0695387,13.54 73.5221444,19.0695715,37.63 73.5228954,19.0696044,72.64 73.5236464,19.0696372,101.99 73.5243975,19.0696700,135.77 73.5251485,19.0697028,147.55 73.5258995,19.0697356,151.98 73.5266505,19.0697684,142.15 73.5274015,19.0698012,94.49 73.5281525,19.0698340,42.73 73.5289036,19.0698668,62.89 73.5296546,19.0698997,38.66 73.5298036,19.0699062,34.67 73.5299526,19.0699127,17.87 73.5301016,19.0699192,17.38 73.5302507,19.0699257,8.56 73.5303997,19.0699322,9.63 73.5305487,19.0699387,12.10 73.5306977,19.0699452,11.71 73.5308467,19.0699517,6.56 73.5309957,19.0699583,6.06 73.5311448,19.0699648,3.22 73.5312938,19.0699713,8.14 73.5314428,19.0699778,15.26 73.5315918,19.0699843,23.44 73.5317408,19.0699908,38.43 73.5318899,19.0699973,45.28 73.5320389,19.0700038,49.86 73.5321879,19.0700103,53.06 73.5323369,19.0700168,55.05 73.5324859,19.0700234,56.75 73.5326349,19.0700299,56.03 73.5327840,19.0700364,57.22 73.5329330,19.0700429,60.09 73.5330820,19.0700494,61.85 @@ -70,7 +70,7 @@ clampToGround 1 - 73.5123812,19.0691450,211.33 73.5296546,19.0698997,947.61 73.5330820,19.0700494,952.71 + 73.5123812,19.0691450,0 73.5296546,19.0698997,0 73.5330820,19.0700494,0 diff --git a/examples/case_engineer_trial_india.py b/examples/case_engineer_trial_india.py index 07f1b34..0e9b573 100644 --- a/examples/case_engineer_trial_india.py +++ b/examples/case_engineer_trial_india.py @@ -92,7 +92,8 @@ def main() -> None: alignment_to_csv(align, profile, OUT_DIR / "towers.csv") alignment_to_landxml(align, profile, OUT_DIR / "alignment.landxml") alignment_to_kml(align, profile, OUT_DIR / "alignment.kml", - project_name="Bhimashankar pilgrim ropeway") + project_name="Bhimashankar pilgrim ropeway", + segments=eval_res.segments) bom = build_bom(align, project_name="Bhimashankar pilgrim ropeway", system=SYSTEM, cfg=cfg) diff --git a/src/ropeway/io.py b/src/ropeway/io.py index 6355583..74df4cc 100644 --- a/src/ropeway/io.py +++ b/src/ropeway/io.py @@ -1,14 +1,33 @@ -"""GeoJSON export for towers and cable centerline.""" +"""GeoJSON + KML export for towers and cable centerline.""" from __future__ import annotations import json from pathlib import Path +import numpy as np from pyproj import CRS, Transformer from .alignment import Alignment from .dem import TerrainProfile +from .physics import Catenary + + +def _support_label(index: int, total: int, is_station: bool) -> str: + """P73 — Station vs Tower naming used across KML / GeoJSON / plots. + + - index 0 -> "Lower station" + - index N-1 -> "Upper station" + - other ``is_station=True`` -> "Station " + - everything else -> "Tower " + """ + if index == 0: + return "Lower station" + if index == total - 1: + return "Upper station" + if is_station: + return f"Station {index}" + return f"Tower {index}" def _bearing_lonlat(p1: tuple[float, float], p2: tuple[float, float]) -> tuple[float, float, float]: @@ -46,21 +65,24 @@ def lonlat_at(distance_m: float) -> tuple[float, float]: ) features = [] + n_total = len(alignment.towers) for i, t in enumerate(alignment.towers): lon, lat = lonlat_at(t.distance) ground = profile.elevation_at(t.distance) + is_station = bool(t.is_station) or i in (0, n_total - 1) features.append( { "type": "Feature", "geometry": {"type": "Point", "coordinates": [lon, lat]}, "properties": { - "kind": "tower", + "kind": "station" if is_station else "tower", + "label": _support_label(i, n_total, is_station), "index": i, "distance_m": t.distance, "height_m": t.height, "ground_elev_m": ground, "anchor_elev_m": ground + t.height, - "is_station": bool(t.is_station) or i in (0, len(alignment.towers) - 1), + "is_station": is_station, }, } ) @@ -89,19 +111,38 @@ def alignment_to_kml( out_path: str | Path, *, project_name: str = "Ropeway alignment", + segments: list[Catenary] | None = None, + cable_samples_per_span: int = 24, ) -> Path: """Export the alignment as a Google-Earth-ready KML file. + **P72 — cable rides terrain.** Altitudes are emitted as + ``altitudeMode=relativeToGround`` and the cable polyline is + densified with ``cable_samples_per_span`` samples per span using + the per-segment catenary equation. Each sample carries its + *height-above-local-ground*, so Google Earth's own terrain (often + finer than our 30 m DEM) renders the cable correctly. Prior + absolute-altitude output would sometimes dip the cable below GE's + rendered ground when the two terrain models disagreed. + Geometry shipped: - - one ```` per tower with ```` at the **tower-top - anchor** (ground elev + tower height), ``altitudeMode=absolute`` - so the markers float at correct world height. + - one ```` per support with ```` at + ``height=tower_height`` above local ground (so the marker + floats at the cable anchor regardless of GE's terrain). - one ```` for the **cable centerline** as a - ```` of (lon, lat, anchor_elev) — renders as the - actual cable suspended over terrain. + densified ```` (relativeToGround); each sample's + altitude is (cable_elev - local_ground) → the cable always + rides above terrain. - one ```` for the **ground centerline** as a - ```` clamped to ground — useful as a visual - reference for the corridor footprint. + ```` clamped to ground (visual footprint). + + Pass ``segments=eval_result.segments`` to use the true catenary + sag curve; without it the cable is rendered as straight chords + between anchors (still relativeToGround, still safe). + + P73 — naming: index 0 = "Lower station", index N-1 = "Upper + station", any other ``is_station=True`` = "Station ", + intermediate non-station = "Tower ". Coords in WGS84 (EPSG:4326). Open by double-clicking the .kml in Google Earth Pro (desktop) or uploading via 'New project' → @@ -115,7 +156,7 @@ def alignment_to_kml( raise ValueError("profile has zero length") def lonlat_at(distance_m: float) -> tuple[float, float]: - t = distance_m / total_len_m + t = max(0.0, min(1.0, distance_m / total_len_m)) return ( start[0] + (end[0] - start[0]) * t, start[1] + (end[1] - start[1]) * t, @@ -123,26 +164,23 @@ def lonlat_at(distance_m: float) -> tuple[float, float]: n = len(alignment.towers) tower_placemarks: list[str] = [] - cable_coords: list[str] = [] ground_coords: list[str] = [] + # Per-tower Placemarks. Altitude here is tower height above local + # ground (relativeToGround) — the marker pin will then sit at the + # cable anchor regardless of GE's terrain. for i, t in enumerate(alignment.towers): lon, lat = lonlat_at(t.distance) ground = float(profile.elevation_at(t.distance)) anchor = ground + t.height is_station = bool(t.is_station) or i in (0, n - 1) style = "stationStyle" if is_station else "towerStyle" - label = ( - f"Station {i}" if is_station and i == 0 else - f"Station {i}" if is_station and i == n - 1 else - f"Station {i}" if is_station else - f"Tower {i}" - ) + label = _support_label(i, n, is_station) descr = ( f"{t.distance:.0f} m
" - f"Ground elevation: {ground:.0f} m
" - f"Tower height: {t.height:.1f} m
" - f"Anchor (cable) elevation: {anchor:.0f} m
" + f"Ground elevation (DEM): {ground:.0f} m
" + f"Support height: {t.height:.1f} m
" + f"Anchor elevation: {anchor:.0f} m
" f"Lateral offset: {t.offset:.1f} m]]>" ) tower_placemarks.append( @@ -151,14 +189,40 @@ def lonlat_at(distance_m: float) -> tuple[float, float]: f' {descr}\n' f' #{style}\n' f' \n' - f' absolute\n' + f' relativeToGround\n' f' 1\n' - f' {lon:.7f},{lat:.7f},{anchor:.2f}\n' + f' {lon:.7f},{lat:.7f},{t.height:.2f}\n' f' \n' f'
' ) - cable_coords.append(f"{lon:.7f},{lat:.7f},{anchor:.2f}") - ground_coords.append(f"{lon:.7f},{lat:.7f},{ground:.2f}") + ground_coords.append(f"{lon:.7f},{lat:.7f},0") + + # Cable centerline — densified with the catenary sag curve when + # available, else fall back to straight chords. Either way each + # sample's altitude is *height above local ground* so GE renders + # the cable above its own terrain. + cable_coords: list[str] = [] + if segments and len(segments) == n - 1 and all(abs(t.offset) < 1e-6 for t in alignment.towers): + # Phase 12c lateral offsets break the simple plan-x ↔ distance + # mapping; fall back to straight chords in that case. + for span_idx, seg in enumerate(segments): + xs, ys = seg.sample(max(2, int(cable_samples_per_span))) + # First sample of every span except the first would duplicate + # the previous span's last anchor — skip. + i_start = 1 if span_idx > 0 else 0 + for x, y in zip(xs[i_start:], ys[i_start:]): + d = float(x) # plan-x == along-corridor distance (no offset) + ground = float(profile.elevation_at(d)) + # Height above local ground; clamp tiny negatives from + # numeric noise so GE never sees a sub-zero altitude. + h = max(0.0, float(y) - ground) + lon, lat = lonlat_at(d) + cable_coords.append(f"{lon:.7f},{lat:.7f},{h:.2f}") + else: + # Chord fallback. relativeToGround + tower height per anchor. + for t in alignment.towers: + lon, lat = lonlat_at(t.distance) + cable_coords.append(f"{lon:.7f},{lat:.7f},{t.height:.2f}") kml = ( '\n' @@ -193,7 +257,7 @@ def lonlat_at(distance_m: float) -> tuple[float, float]: ' Cable centerline\n' ' #cableStyle\n' ' \n' - ' absolute\n' + ' relativeToGround\n' ' 1\n' f' {" ".join(cable_coords)}\n' ' \n' diff --git a/tests/test_io_kml.py b/tests/test_io_kml.py index 827f898..7e606c2 100644 --- a/tests/test_io_kml.py +++ b/tests/test_io_kml.py @@ -7,7 +7,7 @@ import pytest -from ropeway.alignment import Alignment, Tower +from ropeway.alignment import Alignment, Tower, evaluate_alignment from ropeway.dem import synthetic_profile from ropeway.io import alignment_to_kml from ropeway.safety import ConstraintConfig @@ -59,31 +59,58 @@ def test_kml_emits_one_placemark_per_tower_plus_two_lines(tmp_path: Path): assert len(lines) == 2 -def test_kml_tower_point_uses_absolute_altitude_at_anchor(tmp_path: Path): - """Tower marker should be at ground_elev + tower_height, not at ground.""" +def test_kml_tower_point_uses_relative_altitude_equal_to_height(tmp_path: Path): + """P72: tower Point altitude is the *support height* above local ground + (relativeToGround), so GE's own terrain places the anchor correctly.""" a, p = _three_tower_alignment() out = alignment_to_kml(a, p, tmp_path / "x.kml") tree = ET.parse(out) points = tree.findall(f".//{KML_NS}Point") altmode = points[1].find(f"{KML_NS}altitudeMode") - assert altmode is not None and altmode.text == "absolute" - coords = points[1].find(f"{KML_NS}coordinates").text.strip() - lon, lat, alt = coords.split(",") - ground = float(p.elevation_at(1000.0)) - expected = ground + 30.0 - assert float(alt) == pytest.approx(expected, abs=0.1) + assert altmode is not None and altmode.text == "relativeToGround" + _, _, alt = points[1].find(f"{KML_NS}coordinates").text.strip().split(",") + assert float(alt) == pytest.approx(30.0, abs=0.01) # tower height -def test_kml_cable_linestring_uses_absolute_altitude(tmp_path: Path): +def test_kml_cable_linestring_uses_relative_altitude(tmp_path: Path): + """P72: cable LineString must be relativeToGround so it rides over + whatever terrain Google Earth renders, even when our 30 m DEM and + GE's finer terrain disagree.""" a, p = _three_tower_alignment() out = alignment_to_kml(a, p, tmp_path / "x.kml") tree = ET.parse(out) lines = tree.findall(f".//{KML_NS}LineString") - cable_line = lines[0] # cable centerline comes first + cable_line = lines[0] altmode = cable_line.find(f"{KML_NS}altitudeMode") - assert altmode is not None and altmode.text == "absolute" - coord_text = cable_line.find(f"{KML_NS}coordinates").text.strip().split() - assert len(coord_text) == 3 # one (lon,lat,alt) per tower + assert altmode is not None and altmode.text == "relativeToGround" + + +def test_kml_cable_densified_with_segments(tmp_path: Path): + """When ``segments=`` is passed, the cable is densified well beyond + one-coord-per-tower so GE shows the catenary sag, not chord lines.""" + a, p = _three_tower_alignment() + eval_res = evaluate_alignment(a) + out = alignment_to_kml(a, p, tmp_path / "x.kml", + segments=eval_res.segments, cable_samples_per_span=20) + tree = ET.parse(out) + lines = tree.findall(f".//{KML_NS}LineString") + coords = lines[0].find(f"{KML_NS}coordinates").text.strip().split() + # 2 spans × 20 samples - 1 dedup = 39. Allow ±1 for first-sample edge case. + assert 35 <= len(coords) <= 42 + + +def test_kml_cable_altitudes_never_below_zero(tmp_path: Path): + """The cable must never have a negative relativeToGround altitude — + that would mean we're asking GE to draw it underground, which was + the exact bug we're closing.""" + a, p = _three_tower_alignment() + eval_res = evaluate_alignment(a) + out = alignment_to_kml(a, p, tmp_path / "x.kml", segments=eval_res.segments) + tree = ET.parse(out) + coords = tree.findall(f".//{KML_NS}LineString")[0].find( + f"{KML_NS}coordinates").text.strip().split() + alts = [float(c.split(",")[2]) for c in coords] + assert min(alts) >= 0.0 def test_kml_ground_linestring_clamps_to_ground(tmp_path: Path): @@ -96,6 +123,20 @@ def test_kml_ground_linestring_clamps_to_ground(tmp_path: Path): assert altmode is not None and altmode.text == "clampToGround" +def test_kml_uses_lower_upper_station_vocabulary(tmp_path: Path): + """P73: terminal supports get 'Lower station' / 'Upper station', + not 'Tower 0' / 'Tower N'.""" + a, p = _three_tower_alignment() + out = alignment_to_kml(a, p, tmp_path / "x.kml") + tree = ET.parse(out) + placemark_names = [pm.find(f"{KML_NS}name").text + for pm in tree.findall(f".//{KML_NS}Folder/{KML_NS}Placemark")] + assert placemark_names[0] == "Lower station" + assert placemark_names[-1] == "Upper station" + assert all(n.startswith("Tower") for n in placemark_names[1:-1]) + assert "Tower 0" not in placemark_names + + def test_kml_zero_length_profile_rejected(tmp_path: Path): """A zero-length corridor would produce a degenerate KML; reject up front.""" a, p = _three_tower_alignment() From bec251b9b66af3414211b3008cf987e9bfdcf4a6 Mon Sep 17 00:00:00 2001 From: Harsh Pandhe Date: Sun, 24 May 2026 19:09:50 +0530 Subject: [PATCH 07/21] =?UTF-8?q?feat(p76):=20corridor=20API=20=E2=80=94?= =?UTF-8?q?=20coords-in,=20permit-pack=20out?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit POST /api/v1/corridor takes {start, end, system, name, GA knobs}, auto-fetches the matching Copernicus DEM tile via Phase 47's cache, runs the optimizer in the existing BackgroundTasks queue, writes every artifact to a job-scoped tmpdir, and pre-bakes a ZIP. Endpoints: POST /api/v1/corridor -> 202 + job_id (+ status_url, artifacts_url) GET /api/v1/corridor/{job_id} -> status + structured result payload GET /api/v1/corridor/{job_id}/artifacts -> map of {kind: url} GET /api/v1/corridor/{job_id}/artifacts/{kind} -> FileResponse Artifact kinds (stable names for the SPA): kml, dxf, landxml, geojson, towers_csv, bom_csv, cost_csv, alignment_png, convergence_png, zip. Validation: - lon/lat range check (-180..180, -90..90) - system must be one of the six RopewaySystemType values - start != end (400) - unknown kind -> 400, unknown job_id -> 404, not-yet-done -> 409 11 new tests cover POST validation, status polling, artifact listing, KML mime + P72/P73 content checks, ZIP bundle contents, all error-path codes. Full suite: 520 passing. This is the backbone for H2 (Next.js SPA in POST_TRIAL_PLAN.md). The SPA will POST here and poll the status URL; no CLI or Streamlit on the engineer's path. --- src/ropeway/server/api.py | 4 + src/ropeway/server/corridor.py | 340 +++++++++++++++++++++++++++++++++ tests/test_corridor_api.py | 179 +++++++++++++++++ 3 files changed, 523 insertions(+) create mode 100644 src/ropeway/server/corridor.py create mode 100644 tests/test_corridor_api.py diff --git a/src/ropeway/server/api.py b/src/ropeway/server/api.py index 3424ee9..6d38eb7 100644 --- a/src/ropeway/server/api.py +++ b/src/ropeway/server/api.py @@ -167,6 +167,10 @@ def create_app(settings: Settings | None = None) -> FastAPI: from .jobs import router as jobs_router app.include_router(jobs_router) + # ---- P76: corridor API — coords-in / artifacts-out (web product) ---- + from .corridor import router as corridor_router + app.include_router(corridor_router) + # ---- COMM-4: optional Prometheus /metrics + structured request log ---- from .observability import configure_prometheus, configure_structured_logs configure_prometheus(app) diff --git a/src/ropeway/server/corridor.py b/src/ropeway/server/corridor.py new file mode 100644 index 0000000..6113906 --- /dev/null +++ b/src/ropeway/server/corridor.py @@ -0,0 +1,340 @@ +"""P76 — Corridor API: two coordinates in, alignment + permit-pack out. + +This is the backbone the Next.js SPA (H2) hits. The existing +`/optimize/async` endpoint takes synthetic-corridor params; this one +takes real `(lon, lat)` terminals, auto-fetches the matching +Copernicus tile via Phase 47's cache, runs the optimizer, writes every +artifact to a tmpdir keyed by job id, and serves them back. + +Surface: + POST /api/v1/corridor — submit (returns job_id) + GET /api/v1/corridor/{job_id} — status + summary + GET /api/v1/corridor/{job_id}/artifacts — list + GET /api/v1/corridor/{job_id}/artifacts/{kind} — fetch one + +`kind` ∈ {kml, dxf, landxml, geojson, towers_csv, bom_csv, +cost_csv, alignment_png, convergence_png, zip}. +""" + +from __future__ import annotations + +import io as _io +import tempfile +import threading +import time +import uuid +import zipfile +from dataclasses import dataclass, field +from enum import Enum +from pathlib import Path +from typing import Any + +import matplotlib +matplotlib.use("Agg", force=True) +import matplotlib.pyplot as plt +from fastapi import APIRouter, BackgroundTasks, HTTPException +from fastapi.responses import FileResponse +from pydantic import BaseModel, Field, field_validator + + +class CorridorJobStatus(str, Enum): + PENDING = "pending" + RUNNING = "running" + DONE = "done" + FAILED = "failed" + + +@dataclass +class CorridorJob: + id: str + body: "CorridorRequest" + status: CorridorJobStatus = CorridorJobStatus.PENDING + submitted_at: float = field(default_factory=time.time) + started_at: float | None = None + finished_at: float | None = None + artifacts_dir: Path | None = None + result: dict[str, Any] | None = None + error: str | None = None + + def to_dict(self) -> dict: + return { + "job_id": self.id, + "status": self.status.value, + "submitted_at": self.submitted_at, + "started_at": self.started_at, + "finished_at": self.finished_at, + "elapsed_s": ( + (self.finished_at or time.time()) - (self.started_at or self.submitted_at) + ), + "result": self.result, + "error": self.error, + "request": self.body.model_dump(), + } + + +_STORE: dict[str, CorridorJob] = {} +_STORE_LOCK = threading.Lock() + + +def _valid_systems() -> list[str]: + # Imported lazily so import cost stays low. + from ..multi_rope import RopewaySystemType + return [s.value for s in RopewaySystemType] + + +class CorridorRequest(BaseModel): + """Body for ``POST /api/v1/corridor``.""" + + start: tuple[float, float] = Field( + ..., description="Lower terminal as (lon, lat) in WGS-84." + ) + end: tuple[float, float] = Field( + ..., description="Upper terminal as (lon, lat) in WGS-84." + ) + system: str = Field( + default="mgd", + description="Ropeway type: jigback | mgd | bgd | 3s | chair | funitel.", + ) + name: str = Field( + default="Corridor", + description="Display name for the project; ends up in KML title etc.", + ) + generations: int = Field(default=80, ge=20, le=400) + population_size: int = Field(default=80, ge=20, le=400) + max_intermediate_towers: int = Field(default=12, ge=1, le=24) + seed: int = Field(default=2026) + + @field_validator("start", "end") + @classmethod + def _lonlat_in_range(cls, v: tuple[float, float]) -> tuple[float, float]: + lon, lat = v + if not (-180.0 <= lon <= 180.0): + raise ValueError(f"lon {lon} out of range [-180, 180]") + if not (-90.0 <= lat <= 90.0): + raise ValueError(f"lat {lat} out of range [-90, 90]") + return v + + @field_validator("system") + @classmethod + def _known_system(cls, v: str) -> str: + if v not in _valid_systems(): + raise ValueError(f"unknown system {v!r}; expected one of {_valid_systems()}") + return v + + +# --------------------------------------------------------------------------- +# Background worker +# --------------------------------------------------------------------------- + + +def _run_corridor_job(job_id: str) -> None: + """Run the optimizer + write every artifact to the job's tmpdir.""" + # Imports kept inside the worker so the API module stays lightweight. + from ..alignment import evaluate_alignment + from ..bom import build_bom + from ..cost import Region, estimate_cost + from ..dem import ensure_dem_tile, extract_profile_from_dem + from ..dxf_export import alignment_to_dxf + from ..io import ( + alignment_to_csv, + alignment_to_geojson, + alignment_to_kml, + ) + from ..landxml import alignment_to_landxml + from ..multi_rope import RopewaySystemType, system_defaults + from ..optimizer import GAConfig, optimize + from ..viz import plot_alignment, plot_convergence + + with _STORE_LOCK: + job = _STORE.get(job_id) + if job is None: + return + job.status = CorridorJobStatus.RUNNING + job.started_at = time.time() + body = job.body + + try: + lon_start, lat_start = body.start + lon_end, lat_end = body.end + + # P47 — auto-fetch the matching DEM tile (cached). + tile_path = ensure_dem_tile(lon_start, lat_start, cache_dir="data/dem") + + profile = extract_profile_from_dem( + tile_path, + (lon_start, lat_start), + (lon_end, lat_end), + sample_spacing_m=15.0, + ) + + sys_type = RopewaySystemType(body.system) + cfg = system_defaults(sys_type) + ga = GAConfig( + max_intermediate_towers=body.max_intermediate_towers, + population_size=body.population_size, + generations=body.generations, + seed=body.seed, + ) + result = optimize(profile.as_function(), profile.total_length, + cfg=cfg, ga=ga, verbose=False) + align = result.best_alignment + eval_res = result.best_result + rep = eval_res.report + + # Write every artifact into a fresh tmpdir kept on the job. + tmp_root = Path(tempfile.gettempdir()) / "ropeway-corridor-jobs" / job_id + tmp_root.mkdir(parents=True, exist_ok=True) + + alignment_to_kml(align, profile, tmp_root / "alignment.kml", + project_name=body.name, segments=eval_res.segments) + alignment_to_dxf(align, profile, tmp_root / "alignment.dxf", + project_name=body.name) + alignment_to_landxml(align, profile, tmp_root / "alignment.landxml") + alignment_to_geojson(align, profile, tmp_root / "alignment.geojson") + alignment_to_csv(align, profile, tmp_root / "towers.csv") + + bom = build_bom(align, project_name=body.name, system=sys_type, cfg=cfg) + (tmp_root / "bom.csv").write_text(bom.as_csv()) + est = estimate_cost(bom, region=Region.EMERGING) + (tmp_root / "cost_estimate.csv").write_text(est.as_csv()) + + fig_a, _ = plot_alignment(profile, align, segments=eval_res.segments, + title=f"{body.name} — optimised alignment") + fig_a.savefig(tmp_root / "alignment.png", dpi=140) + plt.close(fig_a) + + fig_c, _ = plot_convergence(result.history_best, result.history_avg) + fig_c.savefig(tmp_root / "convergence.png", dpi=140) + plt.close(fig_c) + + # Pre-bake the ZIP — most SPA users only download this. + zip_path = tmp_root / "permit_pack.zip" + with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf: + for f in sorted(tmp_root.iterdir()): + if f.name == "permit_pack.zip": + continue + zf.write(f, arcname=f"{job_id}/{f.name}") + + with _STORE_LOCK: + job.artifacts_dir = tmp_root + job.result = { + "feasible": eval_res.feasible, + "intermediate_towers": max(0, len(align.towers) - 2), + "cable_length_m": rep.total_cable_length_m, + "corridor_length_m": float(profile.total_length), + "elevation_gain_m": float( + profile.elevation.max() - profile.elevation.min() + ), + "min_clearance_m": rep.min_clearance_m, + "max_tension_kn": rep.max_tension_n / 1e3, + "max_break_over_deg": rep.max_break_over_deg, + "min_overturning_sf": rep.min_overturning_sf, + "min_sliding_sf": rep.min_sliding_sf, + "cost": eval_res.cost, + "capex_usd_estimate": float(est.grand_total), + "dem_tile": tile_path.name, + } + job.status = CorridorJobStatus.DONE + job.finished_at = time.time() + except Exception as exc: # noqa: BLE001 — surface anything to the client + with _STORE_LOCK: + job.status = CorridorJobStatus.FAILED + job.error = f"{type(exc).__name__}: {exc}" + job.finished_at = time.time() + + +# --------------------------------------------------------------------------- +# Router +# --------------------------------------------------------------------------- + + +router = APIRouter(prefix="/api/v1/corridor", tags=["corridor"]) + + +# Filename for each artifact kind. Keep the keys stable — the SPA +# references them by name. +_ARTIFACT_FILES: dict[str, tuple[str, str]] = { + "kml": ("alignment.kml", "application/vnd.google-earth.kml+xml"), + "dxf": ("alignment.dxf", "application/dxf"), + "landxml": ("alignment.landxml", "application/xml"), + "geojson": ("alignment.geojson", "application/geo+json"), + "towers_csv": ("towers.csv", "text/csv"), + "bom_csv": ("bom.csv", "text/csv"), + "cost_csv": ("cost_estimate.csv", "text/csv"), + "alignment_png": ("alignment.png", "image/png"), + "convergence_png": ("convergence.png", "image/png"), + "zip": ("permit_pack.zip", "application/zip"), +} + + +@router.post("", status_code=202) +def submit_corridor(body: CorridorRequest, background: BackgroundTasks) -> dict: + """Submit a new corridor optimisation job. Returns immediately.""" + if body.start == body.end: + raise HTTPException(status_code=400, detail="start and end coincide") + + job = CorridorJob(id=str(uuid.uuid4()), body=body) + with _STORE_LOCK: + _STORE[job.id] = job + background.add_task(_run_corridor_job, job.id) + return { + "job_id": job.id, + "status": job.status.value, + "status_url": f"/api/v1/corridor/{job.id}", + "artifacts_url": f"/api/v1/corridor/{job.id}/artifacts", + } + + +@router.get("/{job_id}") +def read_corridor(job_id: str) -> dict: + with _STORE_LOCK: + job = _STORE.get(job_id) + if job is None: + raise HTTPException(status_code=404, detail="job not found") + return job.to_dict() + + +@router.get("/{job_id}/artifacts") +def list_artifacts(job_id: str) -> dict: + with _STORE_LOCK: + job = _STORE.get(job_id) + if job is None: + raise HTTPException(status_code=404, detail="job not found") + if job.status is not CorridorJobStatus.DONE: + raise HTTPException(status_code=409, + detail=f"job not done (status={job.status.value})") + return { + "artifacts": { + kind: f"/api/v1/corridor/{job_id}/artifacts/{kind}" + for kind in _ARTIFACT_FILES + }, + "kinds": list(_ARTIFACT_FILES.keys()), + } + + +@router.get("/{job_id}/artifacts/{kind}") +def fetch_artifact(job_id: str, kind: str): + with _STORE_LOCK: + job = _STORE.get(job_id) + if job is None: + raise HTTPException(status_code=404, detail="job not found") + if job.status is not CorridorJobStatus.DONE or job.artifacts_dir is None: + raise HTTPException(status_code=409, + detail=f"job not done (status={job.status.value})") + if kind not in _ARTIFACT_FILES: + raise HTTPException(status_code=400, + detail=f"unknown artifact kind {kind!r}; " + f"expected one of {list(_ARTIFACT_FILES.keys())}") + + fname, media_type = _ARTIFACT_FILES[kind] + path = job.artifacts_dir / fname + if not path.exists(): + raise HTTPException(status_code=404, detail=f"artifact {fname} missing") + return FileResponse(path, media_type=media_type, filename=fname) + + +__all__ = [ + "router", + "CorridorJob", "CorridorJobStatus", "CorridorRequest", + "_STORE", # exported for tests +] diff --git a/tests/test_corridor_api.py b/tests/test_corridor_api.py new file mode 100644 index 0000000..1e211d7 --- /dev/null +++ b/tests/test_corridor_api.py @@ -0,0 +1,179 @@ +"""P76 — corridor API tests. + +Exercises POST /api/v1/corridor end-to-end with TestClient's in-process +BackgroundTasks scheduling — every job completes synchronously the moment +the POST response is constructed, so we can poll status and download +artifacts in the same test. +""" + +from __future__ import annotations + +import os +from pathlib import Path + +import pytest +from fastapi.testclient import TestClient + + +@pytest.fixture() +def client(tmp_path, monkeypatch): + db_url = f"sqlite:///{tmp_path / 'api.db'}" + monkeypatch.setenv("ROPEWAY_DATABASE_URL", db_url) + monkeypatch.setenv("ROPEWAY_SECRET_KEY", "x") + + from ropeway.server import config as cfg_mod + cfg_mod.get_settings.cache_clear() + from ropeway.server import db as db_mod + db_mod._engines.clear() + # Reset the in-memory corridor job store so tests don't bleed into each other. + from ropeway.server import corridor as corridor_mod + corridor_mod._STORE.clear() + + from ropeway.server.api import create_app + return TestClient(create_app(cfg_mod.get_settings())) + + +# A small synthetic corridor inside the Bhimashankar tile so the +# DEM cache (data/dem/Copernicus_DSM_N19_E073.tif) is already warm. +_TINY = { + "start": [73.5123812, 19.0691450], + "end": [73.5189329, 19.0728925], + "system": "mgd", + "name": "Test corridor", + "generations": 20, # keep CI cheap + "population_size": 30, + "max_intermediate_towers": 6, +} + + +# --------------------------------------------------------------------------- +# POST validation +# --------------------------------------------------------------------------- + + +def test_post_returns_job_id_and_status_pending_or_done(client): + r = client.post("/api/v1/corridor", json=_TINY) + assert r.status_code == 202, r.text + body = r.json() + assert "job_id" in body + assert body["status_url"].endswith(body["job_id"]) + assert "artifacts_url" in body + # In a TestClient the background task runs before the response is + # returned, so the job will already be DONE when we read it. + + +def test_post_rejects_out_of_range_lon(client): + bad = {**_TINY, "start": [181.0, 19.0]} + r = client.post("/api/v1/corridor", json=bad) + assert r.status_code == 422 + assert "lon" in r.text.lower() + + +def test_post_rejects_unknown_system(client): + bad = {**_TINY, "system": "rocket"} + r = client.post("/api/v1/corridor", json=bad) + assert r.status_code == 422 + assert "system" in r.text.lower() + + +def test_post_rejects_coincident_endpoints(client): + bad = {**_TINY, "end": _TINY["start"]} + r = client.post("/api/v1/corridor", json=bad) + assert r.status_code == 400 + assert "coincide" in r.json()["detail"] + + +# --------------------------------------------------------------------------- +# Status + result +# --------------------------------------------------------------------------- + + +def _skip_if_dem_missing(): + if not Path("data/dem/Copernicus_DSM_N19_E073.tif").exists(): + pytest.skip("Bhimashankar DEM tile not present; run ensure_dem_tile first.") + + +def test_status_endpoint_returns_done_with_result_payload(client): + _skip_if_dem_missing() + r = client.post("/api/v1/corridor", json=_TINY) + job_id = r.json()["job_id"] + + status = client.get(f"/api/v1/corridor/{job_id}").json() + assert status["status"] == "done", status + assert status["result"] is not None + res = status["result"] + for key in ( + "feasible", "intermediate_towers", "cable_length_m", + "corridor_length_m", "elevation_gain_m", "min_clearance_m", + "max_tension_kn", "cost", "capex_usd_estimate", "dem_tile", + ): + assert key in res, f"missing {key} in result" + + +def test_status_unknown_job_404(client): + r = client.get("/api/v1/corridor/does-not-exist") + assert r.status_code == 404 + + +# --------------------------------------------------------------------------- +# Artifacts +# --------------------------------------------------------------------------- + + +def test_artifacts_listing_lists_all_known_kinds(client): + _skip_if_dem_missing() + r = client.post("/api/v1/corridor", json=_TINY) + job_id = r.json()["job_id"] + + listing = client.get(f"/api/v1/corridor/{job_id}/artifacts").json() + assert set(listing["kinds"]) == { + "kml", "dxf", "landxml", "geojson", "towers_csv", "bom_csv", + "cost_csv", "alignment_png", "convergence_png", "zip", + } + + +def test_artifact_kml_is_served_with_correct_mime_and_content(client): + _skip_if_dem_missing() + r = client.post("/api/v1/corridor", json=_TINY) + job_id = r.json()["job_id"] + + a = client.get(f"/api/v1/corridor/{job_id}/artifacts/kml") + assert a.status_code == 200 + assert "kml" in a.headers["content-type"] + body = a.text + assert " Date: Sun, 24 May 2026 19:20:29 +0530 Subject: [PATCH 08/21] =?UTF-8?q?feat(p77):=20Next.js=20SPA=20scaffold=20?= =?UTF-8?q?=E2=80=94=20corridor=20form=20+=20result=20+=20downloads?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit web/ — Next.js 16 (App Router, TypeScript, Tailwind v4) client for the FastAPI corridor API (P76). End-to-end engineer flow: 1. Pick a preset (Bhimashankar / Aiguille du Midi / Cablebús L2), or paste two (lon, lat) pairs and a system type. 2. Click 'Build my alignment'. 3. Progress indicator polls /api/v1/corridor/{job_id} every 1.5 s. 4. Result panel renders headline metrics + alignment plot + a one-click download for every artifact (KML, DXF, LandXML, GeoJSON, BoM, capex, towers.csv, plots, full ZIP). No CLI, no Python, no Streamlit on the engineer's path. Includes: - web/lib/api.ts — typed fetch wrapper (CorridorRequest / CorridorJob / artifact URLs / pollUntilDone helper) - web/app/page.tsx — single-page form + result panel, a11y-compliant inputs (aria-labels + htmlFor on every control) - web/README.md — local dev + Vercel + Cloudflare Tunnel deploy - web/.env.local.example — NEXT_PUBLIC_API_URL hint Lint clean (0 errors, 1 warning re: next/image vs for the cross-origin alignment.png — acceptable). Node 18 will run dev; Next 16 + Tailwind 4 want Node ≥ 20 for a clean prod build — documented in web/README.md. Backbone for H2 (POST_TRIAL_PLAN.md): the SPA replaces Streamlit as the user-facing surface; the engine stays in Python on the box. --- web/.env.local.example | 4 + web/.gitignore | 42 + web/AGENTS.md | 5 + web/CLAUDE.md | 1 + web/README.md | 84 + web/app/favicon.ico | Bin 0 -> 25931 bytes web/app/globals.css | 26 + web/app/layout.tsx | 33 + web/app/page.tsx | 295 ++ web/eslint.config.mjs | 18 + web/lib/api.ts | 138 + web/next.config.ts | 7 + web/package-lock.json | 6210 ++++++++++++++++++++++++++++++++++++++++ web/package.json | 26 + web/postcss.config.mjs | 7 + web/public/file.svg | 1 + web/public/globe.svg | 1 + web/public/next.svg | 1 + web/public/vercel.svg | 1 + web/public/window.svg | 1 + web/tsconfig.json | 34 + 21 files changed, 6935 insertions(+) create mode 100644 web/.env.local.example create mode 100644 web/.gitignore create mode 100644 web/AGENTS.md create mode 100644 web/CLAUDE.md create mode 100644 web/README.md create mode 100644 web/app/favicon.ico create mode 100644 web/app/globals.css create mode 100644 web/app/layout.tsx create mode 100644 web/app/page.tsx create mode 100644 web/eslint.config.mjs create mode 100644 web/lib/api.ts create mode 100644 web/next.config.ts create mode 100644 web/package-lock.json create mode 100644 web/package.json create mode 100644 web/postcss.config.mjs create mode 100644 web/public/file.svg create mode 100644 web/public/globe.svg create mode 100644 web/public/next.svg create mode 100644 web/public/vercel.svg create mode 100644 web/public/window.svg create mode 100644 web/tsconfig.json diff --git a/web/.env.local.example b/web/.env.local.example new file mode 100644 index 0000000..c911a4e --- /dev/null +++ b/web/.env.local.example @@ -0,0 +1,4 @@ +# URL of the FastAPI backend running on your box. +# In dev: leave as http://localhost:8000 and run `ropeway serve` in another terminal. +# Behind Cloudflare Tunnel: set to https://.trycloudflare.com. +NEXT_PUBLIC_API_URL=http://localhost:8000 diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 0000000..b721bff --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,42 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* +!.env.local.example + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/web/AGENTS.md b/web/AGENTS.md new file mode 100644 index 0000000..8bd0e39 --- /dev/null +++ b/web/AGENTS.md @@ -0,0 +1,5 @@ + +# This is NOT the Next.js you know + +This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices. + diff --git a/web/CLAUDE.md b/web/CLAUDE.md new file mode 100644 index 0000000..43c994c --- /dev/null +++ b/web/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..58a9fba --- /dev/null +++ b/web/README.md @@ -0,0 +1,84 @@ +# `web/` — Autonomous Ropeway Alignment SPA (P77) + +Next.js 16 (App Router, TypeScript, Tailwind v4) client for the +FastAPI corridor API (Phase P76). This is the front door for the +**non-technical civil engineer**: + +- Pick a preset, or paste two `(lon, lat)` pairs and a system type. +- Click **Build my alignment**. +- Watch a progress indicator while the backend optimises. +- Result page shows the alignment plot, the headline metrics, and + a one-click download for every artefact (KML, DXF, LandXML, + GeoJSON, BoM, capex, plots, full ZIP). + +No CLI. No Python. No Streamlit on the engineer's path. + +## Local dev + +In one terminal, run the FastAPI backend: + +```bash +cd .. +make install +ropeway serve # listens on :8000 by default +``` + +In another terminal, run the SPA: + +```bash +cd web +cp .env.local.example .env.local +npm install +npm run dev # http://localhost:3000 +``` + +Open , pick the **Bhimashankar** preset, +click **Build my alignment**. The page should land at "Result" +in ~10-20 s with downloads for the entire permit pack. + +## Deploy + +The SPA is a static Vercel app; the backend stays on your box and +gets exposed via Cloudflare Tunnel. + +```bash +# On the box: +ropeway serve & +cloudflared tunnel --url http://localhost:8000 +# Copy the printed https://*.trycloudflare.com URL. + +# In Vercel: project settings → environment variables → +# NEXT_PUBLIC_API_URL = https://.trycloudflare.com +# Re-deploy. Engineers visit https://.vercel.app. +``` + +CORS on the FastAPI side is already handled by P28b — set +`ROPEWAY_CORS_ORIGINS=https://.vercel.app` before running +`ropeway serve` in prod. + +## Roadmap (POST_TRIAL_PLAN.md) + +| Phase | Status | +|---|---| +| **P77** scaffold + form + result + downloads | ✅ this PR | +| P78 map-first input (Leaflet/MapLibre) | next | +| P79 Cesium 3-D viewer in the result panel | next | +| P80 interactive graphs (Plotly) | next | +| P81 AI input mode (Anthropic Sonnet) | next | +| P82 export pack already shipped via /api/v1/corridor zip endpoint | ✅ | +| P83 auth + tier gating (OAuth from P26) | next | + +## Node version note + +Next 16 + Tailwind v4 want Node ≥ 20. The repo machine had 18.19.1 +when scaffolded; `npm run dev` still works there but `npm run build` +might warn. Upgrade to Node 20 LTS for a clean build: + +```bash +# nvm: +nvm install 20 && nvm use 20 + +# or system pkg: +curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash - +sudo apt install -y nodejs +``` diff --git a/web/app/favicon.ico b/web/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/web/app/globals.css b/web/app/globals.css new file mode 100644 index 0000000..a2dc41e --- /dev/null +++ b/web/app/globals.css @@ -0,0 +1,26 @@ +@import "tailwindcss"; + +:root { + --background: #ffffff; + --foreground: #171717; +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +body { + background: var(--background); + color: var(--foreground); + font-family: Arial, Helvetica, sans-serif; +} diff --git a/web/app/layout.tsx b/web/app/layout.tsx new file mode 100644 index 0000000..976eb90 --- /dev/null +++ b/web/app/layout.tsx @@ -0,0 +1,33 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + {children} + + ); +} diff --git a/web/app/page.tsx b/web/app/page.tsx new file mode 100644 index 0000000..6d17ac5 --- /dev/null +++ b/web/app/page.tsx @@ -0,0 +1,295 @@ +"use client"; + +import { useState } from "react"; +import { + type CorridorJob, + type CorridorRequest, + ARTIFACT_ORDER, + artifactLabel, + artifactNote, + artifactUrl, + pollUntilDone, + submitCorridor, +} from "@/lib/api"; + +const PRESETS: Record = { + bhimashankar: { + name: "Bhimashankar (Maharashtra, India)", + note: "Jyotirlinga pilgrim line, Shidighat → plateau. 2.18 km, 742 m rise, jig-back.", + req: { + start: [73.5123812, 19.0691450], + end: [73.5330820, 19.0700494], + system: "jigback", + name: "Bhimashankar pilgrim ropeway", + generations: 120, + population_size: 100, + max_intermediate_towers: 8, + }, + }, + aiguille: { + name: "Aiguille du Midi Stage 2 (Chamonix, France)", + note: "World-record 2 867 m span, single intermediate tower.", + req: { + start: [6.8700, 45.8920], + end: [6.8870, 45.9160], + system: "jigback", + name: "Aiguille du Midi reference", + generations: 100, + population_size: 100, + max_intermediate_towers: 4, + }, + }, + cablebus: { + name: "Cablebús Línea 2 (CDMX, Mexico)", + note: "Longest urban gondola at opening — MGD, 10.6 km route.", + req: { + start: [-99.04320, 19.34600], + end: [-99.00240, 19.36450], + system: "mgd", + name: "Cablebús Línea 2 reference", + generations: 80, + population_size: 80, + max_intermediate_towers: 14, + }, + }, +}; + +export default function Home() { + const [presetKey, setPresetKey] = useState("bhimashankar"); + const [req, setReq] = useState(PRESETS.bhimashankar.req); + const [job, setJob] = useState(null); + const [busy, setBusy] = useState(false); + const [err, setErr] = useState(null); + + function loadPreset(key: keyof typeof PRESETS) { + setPresetKey(key); + setReq(PRESETS[key].req); + setJob(null); + setErr(null); + } + + async function run() { + setErr(null); + setJob(null); + setBusy(true); + try { + const { job_id } = await submitCorridor(req); + const finished = await pollUntilDone(job_id, { + intervalMs: 1500, + onTick: (j) => setJob(j), + }); + setJob(finished); + } catch (e: unknown) { + setErr(e instanceof Error ? e.message : String(e)); + } finally { + setBusy(false); + } + } + + const result = job?.status === "done" ? job.result : null; + + return ( +
+
+
+
+

Autonomous Ropeway Alignment

+

Two coordinates → permit-grade alignment in ~15 seconds.

+
+ github +
+
+ +
+ {/* ---- Left: form ---- */} +
+

Corridor

+ +
+ + +

{PRESETS[presetKey].note}

+
+ +
+ Lower terminal (lon, lat) +
+ setReq({ ...req, start: [parseFloat(e.target.value), req.start[1]] })} + /> + setReq({ ...req, start: [req.start[0], parseFloat(e.target.value)] })} + /> +
+
+ +
+ Upper terminal (lon, lat) +
+ setReq({ ...req, end: [parseFloat(e.target.value), req.end[1]] })} + /> + setReq({ ...req, end: [req.end[0], parseFloat(e.target.value)] })} + /> +
+
+ +
+ + +
+ + + +

+ POSTs to /api/v1/corridor; auto-fetches the + matching Copernicus DEM tile; runs GA + Eurocode checks; returns artefacts. +

+
+ + {/* ---- Right: result ---- */} +
+

Result

+ + {busy && !result && ( +
+

Running optimiser…

+

+ {job?.status === "running" + ? `Status: running · elapsed ${job.elapsed_s.toFixed(1)} s` + : job?.status === "pending" + ? "Queued." + : "Submitting…"} +

+
+ )} + + {err && ( +
+

Failed

+
{err}
+
+ )} + + {result && job && ( + <> +
+ + + + + + + + +
+ +
+ Alignment plot +
+ +

Downloads

+
+ {ARTIFACT_ORDER.map((kind) => ( + +
{artifactLabel(kind)}
+
{artifactNote(kind)}
+
+ ))} +
+ +
+ Raw response payload +
+                  {JSON.stringify(job, null, 2)}
+                
+
+ + )} + + {!busy && !result && !err && ( +

Pick a preset (or edit the coordinates) and click Build my alignment.

+ )} +
+
+ +
+ Backed by FastAPI on {process.env.NEXT_PUBLIC_API_URL || "http://localhost:8000"}. + Engine: DEAP GA + pymoo NSGA-II + EN 12929-1 / ANSI B77.1 / EN 1991-1-4 / ISO 12494 / EN 1993-1-1. +
+
+ ); +} + +function Metric({ label, value, good }: { label: string; value: string; good?: boolean }) { + const color = + good === true + ? "text-emerald-600 dark:text-emerald-400" + : good === false + ? "text-red-600 dark:text-red-400" + : "text-zinc-900 dark:text-zinc-100"; + return ( +
+
{label}
+
{value}
+
+ ); +} diff --git a/web/eslint.config.mjs b/web/eslint.config.mjs new file mode 100644 index 0000000..05e726d --- /dev/null +++ b/web/eslint.config.mjs @@ -0,0 +1,18 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import nextVitals from "eslint-config-next/core-web-vitals"; +import nextTs from "eslint-config-next/typescript"; + +const eslintConfig = defineConfig([ + ...nextVitals, + ...nextTs, + // Override default ignores of eslint-config-next. + globalIgnores([ + // Default ignores of eslint-config-next: + ".next/**", + "out/**", + "build/**", + "next-env.d.ts", + ]), +]); + +export default eslintConfig; diff --git a/web/lib/api.ts b/web/lib/api.ts new file mode 100644 index 0000000..09e2aa2 --- /dev/null +++ b/web/lib/api.ts @@ -0,0 +1,138 @@ +/** + * Typed wrapper around the FastAPI corridor API (Phase P76). + * + * Default base URL = NEXT_PUBLIC_API_URL env, else + * http://localhost:8000 (the dev `ropeway serve` default). + */ + +export const API_BASE = + process.env.NEXT_PUBLIC_API_URL?.replace(/\/$/, "") || "http://localhost:8000"; + +export type CorridorRequest = { + start: [number, number]; // [lon, lat] + end: [number, number]; + system: "jigback" | "mgd" | "bgd" | "3s" | "chair" | "funitel"; + name?: string; + generations?: number; + population_size?: number; + max_intermediate_towers?: number; + seed?: number; +}; + +export type CorridorJobStatus = "pending" | "running" | "done" | "failed"; + +export type CorridorResult = { + feasible: boolean; + intermediate_towers: number; + cable_length_m: number; + corridor_length_m: number; + elevation_gain_m: number; + min_clearance_m: number; + max_tension_kn: number; + max_break_over_deg: number; + min_overturning_sf: number; + min_sliding_sf: number; + cost: number; + capex_usd_estimate: number; + dem_tile: string; +}; + +export type CorridorJob = { + job_id: string; + status: CorridorJobStatus; + submitted_at: number; + started_at: number | null; + finished_at: number | null; + elapsed_s: number; + result: CorridorResult | null; + error: string | null; + request: CorridorRequest; +}; + +export type ArtifactKind = + | "kml" + | "dxf" + | "landxml" + | "geojson" + | "towers_csv" + | "bom_csv" + | "cost_csv" + | "alignment_png" + | "convergence_png" + | "zip"; + +const ARTIFACT_LABELS: Record = { + kml: { label: "Google Earth (KML)", ext: "kml", note: "Double-click to fly the corridor in GE Pro." }, + dxf: { label: "AutoCAD (DXF)", ext: "dxf", note: "Survey overlay." }, + landxml: { label: "LandXML 1.2", ext: "landxml", note: "Civil 3D / OpenRoads." }, + geojson: { label: "GeoJSON (QGIS)", ext: "geojson", note: "Drag onto QGIS canvas." }, + towers_csv: { label: "Tower schedule", ext: "csv", note: "Distance / height / station." }, + bom_csv: { label: "Bill of materials", ext: "csv", note: "Sheaves, cable, anchors." }, + cost_csv: { label: "Capex estimate", ext: "csv", note: "Emerging-band breakdown." }, + alignment_png: { label: "Alignment plot", ext: "png", note: "Plan + elevation view." }, + convergence_png: { label: "GA convergence", ext: "png", note: "Best-cost-per-generation." }, + zip: { label: "All artefacts (ZIP)", ext: "zip", note: "Everything above, bundled." }, +}; + +export function artifactLabel(kind: ArtifactKind): string { + return ARTIFACT_LABELS[kind].label; +} + +export function artifactNote(kind: ArtifactKind): string { + return ARTIFACT_LABELS[kind].note; +} + +export function artifactUrl(jobId: string, kind: ArtifactKind): string { + return `${API_BASE}/api/v1/corridor/${jobId}/artifacts/${kind}`; +} + +export async function submitCorridor(req: CorridorRequest): Promise<{ job_id: string }> { + const r = await fetch(`${API_BASE}/api/v1/corridor`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(req), + }); + if (!r.ok) { + const txt = await r.text(); + throw new Error(`POST /api/v1/corridor failed (${r.status}): ${txt}`); + } + return r.json(); +} + +export async function readCorridor(jobId: string): Promise { + const r = await fetch(`${API_BASE}/api/v1/corridor/${jobId}`, { + cache: "no-store", + }); + if (!r.ok) throw new Error(`GET corridor ${jobId} failed (${r.status})`); + return r.json(); +} + +/** Poll the status endpoint until the job is in a terminal state. */ +export async function pollUntilDone( + jobId: string, + opts: { intervalMs?: number; timeoutMs?: number; onTick?: (j: CorridorJob) => void } = {}, +): Promise { + const interval = opts.intervalMs ?? 1500; + const timeout = opts.timeoutMs ?? 5 * 60 * 1000; + const start = Date.now(); + while (Date.now() - start < timeout) { + const job = await readCorridor(jobId); + opts.onTick?.(job); + if (job.status === "done" || job.status === "failed") return job; + await new Promise((res) => setTimeout(res, interval)); + } + throw new Error(`Job ${jobId} did not finish within ${timeout / 1000} s`); +} + +export const ARTIFACT_ORDER: ArtifactKind[] = [ + "zip", + "kml", + "geojson", + "dxf", + "landxml", + "alignment_png", + "convergence_png", + "towers_csv", + "bom_csv", + "cost_csv", +]; diff --git a/web/next.config.ts b/web/next.config.ts new file mode 100644 index 0000000..e9ffa30 --- /dev/null +++ b/web/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/web/package-lock.json b/web/package-lock.json new file mode 100644 index 0000000..e3d6606 --- /dev/null +++ b/web/package-lock.json @@ -0,0 +1,6210 @@ +{ + "name": "web", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "web", + "version": "0.1.0", + "dependencies": { + "next": "16.2.6", + "react": "19.2.4", + "react-dom": "19.2.4" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "16.2.6", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "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, + "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.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "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.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "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/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "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.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "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, + "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, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@next/env": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.6.tgz", + "integrity": "sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.6.tgz", + "integrity": "sha512-Z8l6o4JWKUl755x4R+wogD86KPeU+Ckw4K+SYG4kHeOJtRenDeK+OSbGcqZpDtbwn9DsJVdir2UxmwXuinUbUw==", + "dev": true, + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz", + "integrity": "sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.6.tgz", + "integrity": "sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.6.tgz", + "integrity": "sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.6.tgz", + "integrity": "sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.6.tgz", + "integrity": "sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.6.tgz", + "integrity": "sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.6.tgz", + "integrity": "sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.6.tgz", + "integrity": "sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "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, + "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, + "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, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz", + "integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==", + "dev": true, + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.21.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz", + "integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==", + "dev": true, + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-x64": "4.3.0", + "@tailwindcss/oxide-freebsd-x64": "4.3.0", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-x64-musl": "4.3.0", + "@tailwindcss/oxide-wasm32-wasi": "4.3.0", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz", + "integrity": "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz", + "integrity": "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz", + "integrity": "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz", + "integrity": "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz", + "integrity": "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz", + "integrity": "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz", + "integrity": "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz", + "integrity": "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz", + "integrity": "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz", + "integrity": "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/core": "^1.10.0", + "@emnapi/runtime": "^1.10.0", + "@emnapi/wasi-threads": "^1.2.1", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz", + "integrity": "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz", + "integrity": "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.0.tgz", + "integrity": "sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.3.0", + "@tailwindcss/oxide": "4.3.0", + "postcss": "^8.5.10", + "tailwindcss": "4.3.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.19.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz", + "integrity": "sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==", + "dev": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.15.tgz", + "integrity": "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==", + "dev": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.4.tgz", + "integrity": "sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/type-utils": "8.59.4", + "@typescript-eslint/utils": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.4", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.4.tgz", + "integrity": "sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.4.tgz", + "integrity": "sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==", + "dev": true, + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.59.4", + "@typescript-eslint/types": "^8.59.4", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.4.tgz", + "integrity": "sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.4.tgz", + "integrity": "sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.4.tgz", + "integrity": "sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/utils": "8.59.4", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.4.tgz", + "integrity": "sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.4.tgz", + "integrity": "sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==", + "dev": true, + "dependencies": { + "@typescript-eslint/project-service": "8.59.4", + "@typescript-eslint/tsconfig-utils": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.4.tgz", + "integrity": "sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.4.tgz", + "integrity": "sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.59.4", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", + "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", + "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", + "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", + "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", + "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", + "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", + "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", + "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", + "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", + "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", + "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", + "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", + "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", + "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", + "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", + "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", + "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-openharmony-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", + "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", + "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", + "cpu": [ + "wasm32" + ], + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", + "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", + "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", + "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "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, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "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-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "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 + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "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, + "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.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "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, + "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, + "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, + "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, + "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/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true + }, + "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, + "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, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.4.tgz", + "integrity": "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "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 + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.32", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.32.tgz", + "integrity": "sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "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, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "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, + "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, + "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, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "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, + "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/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "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, + "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 + }, + "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 + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "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, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "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, + "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, + "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, + "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, + "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 + }, + "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, + "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, + "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/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.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, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.361", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.361.tgz", + "integrity": "sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.22.0.tgz", + "integrity": "sha512-xYcDWrpELkFzz9SpZ3PlI6Eu6eD93Yf0WLDRxikGhWJ3MAir2SNZTIVCVZqZ/NUyx8AdMc2gT9C0gPiw18kG+A==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "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, + "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, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", + "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "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, + "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, + "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, + "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/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "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-config-next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.6.tgz", + "integrity": "sha512-z2ELYSkyrrJ6cuunTU8vhsT/RpouPkjaSah06nVW6Rg2Hpg0Vs8s497/e5s8G8qtdp4ccsiovz5P1rv+5VSW2Q==", + "dev": true, + "dependencies": { + "@next/eslint-plugin-next": "16.2.6", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^7.0.0", + "globals": "16.4.0", + "typescript-eslint": "^8.46.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "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, + "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, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "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.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "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, + "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, + "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, + "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 + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/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, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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 + }, + "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 + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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, + "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", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=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, + "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, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true + }, + "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, + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "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, + "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, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "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, + "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, + "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, + "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/get-tsconfig": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "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, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "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, + "engines": { + "node": ">=18" + }, + "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, + "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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "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, + "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, + "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, + "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, + "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, + "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, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "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, + "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, + "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, + "engines": { + "node": ">=0.8.19" + } + }, + "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, + "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, + "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, + "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, + "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, + "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-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "dependencies": { + "hasown": "^2.0.3" + }, + "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, + "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, + "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, + "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, + "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.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "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, + "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, + "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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">=0.12.0" + } + }, + "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, + "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-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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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 + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "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==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "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 + }, + "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 + }, + "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 + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "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, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "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, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "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, + "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 + }, + "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==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "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, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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 + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "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 + }, + "node_modules/next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/next/-/next-16.2.6.tgz", + "integrity": "sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==", + "dependencies": { + "@next/env": "16.2.6", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.9.19", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.2.6", + "@next/swc-darwin-x64": "16.2.6", + "@next/swc-linux-arm64-gnu": "16.2.6", + "@next/swc-linux-arm64-musl": "16.2.6", + "@next/swc-linux-x64-gnu": "16.2.6", + "@next/swc-linux-x64-musl": "16.2.6", + "@next/swc-win32-arm64-msvc": "16.2.6", + "@next/swc-win32-x64-msvc": "16.2.6", + "sharp": "^0.34.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-releases": { + "version": "2.0.46", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.46.tgz", + "integrity": "sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "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, + "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, + "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, + "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, + "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, + "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, + "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.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "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/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "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, + "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, + "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, + "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, + "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, + "engines": { + "node": ">=8" + } + }, + "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, + "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 + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "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, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.12", + "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, + "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, + "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, + "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" + } + ] + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "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 + }, + "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, + "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, + "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.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "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, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "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" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "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, + "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, + "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.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==" + }, + "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, + "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, + "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, + "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, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "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, + "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, + "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.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "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, + "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, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true + }, + "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, + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "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, + "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.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "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, + "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, + "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, + "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-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "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, + "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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", + "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", + "dev": true + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/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, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "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, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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, + "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, + "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, + "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, + "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/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.4.tgz", + "integrity": "sha512-Rw6+44QNFaXtgHSjPy+Kw8hrJniMYzR85E9yLmOLcfZ91/rz+JXQbDTCmc6ccxMPY6K6PgAq26f0JCBfR7LIPQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.59.4", + "@typescript-eslint/parser": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/utils": "8.59.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "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, + "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/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true + }, + "node_modules/unrs-resolver": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", + "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "napi-postinstall": "^0.3.4" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.12.2", + "@unrs/resolver-binding-android-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-x64": "1.12.2", + "@unrs/resolver-binding-freebsd-x64": "1.12.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", + "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-musl": "1.12.2", + "@unrs/resolver-binding-openharmony-arm64": "1.12.2", + "@unrs/resolver-binding-wasm32-wasi": "1.12.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "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, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "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, + "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, + "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, + "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, + "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.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..5ee96c8 --- /dev/null +++ b/web/package.json @@ -0,0 +1,26 @@ +{ + "name": "web", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "eslint" + }, + "dependencies": { + "next": "16.2.6", + "react": "19.2.4", + "react-dom": "19.2.4" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "16.2.6", + "tailwindcss": "^4", + "typescript": "^5" + } +} diff --git a/web/postcss.config.mjs b/web/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/web/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/web/public/file.svg b/web/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/web/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/globe.svg b/web/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/web/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/next.svg b/web/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/web/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/vercel.svg b/web/public/vercel.svg new file mode 100644 index 0000000..7705396 --- /dev/null +++ b/web/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/window.svg b/web/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/web/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/tsconfig.json b/web/tsconfig.json new file mode 100644 index 0000000..3a13f90 --- /dev/null +++ b/web/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts", + "**/*.mts" + ], + "exclude": ["node_modules"] +} From 3d7792ab94365bd9a2ae4ca64b3d8282ab940741 Mon Sep 17 00:00:00 2001 From: Harsh Pandhe Date: Sun, 24 May 2026 19:24:40 +0530 Subject: [PATCH 09/21] =?UTF-8?q?feat(p78):=20map-first=20corridor=20input?= =?UTF-8?q?=20=E2=80=94=20drop=20two=20pins,=20get=20an=20alignment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit web/app/CorridorMap.tsx — Leaflet/OpenStreetMap widget in a client-only dynamic import (Leaflet touches window on import): - First click sets the lower terminal (green pin). - Second click sets the upper terminal (red pin). - Third click restarts and reseeds the lower terminal. - Both pins are draggable for fine-tuning. - Indigo polyline shows the corridor between the two terminals. - Preset switch / number-input edits fly the map to the new midpoint. SVG-encoded markers (no asset 404s from Leaflet's default icons being tree-shaken oddly inside Next.js). Engineer no longer needs to type coordinates — but the lon/lat inputs stay as a fallback for paste-from-Google-Earth flows. Deps added: leaflet, react-leaflet, @types/leaflet. Lint clean (0 errors). --- web/app/CorridorMap.tsx | 159 ++++++++++++++++++++++++++++++++++++++++ web/app/page.tsx | 17 +++++ web/package-lock.json | 46 +++++++++++- web/package.json | 5 +- 4 files changed, 225 insertions(+), 2 deletions(-) create mode 100644 web/app/CorridorMap.tsx diff --git a/web/app/CorridorMap.tsx b/web/app/CorridorMap.tsx new file mode 100644 index 0000000..63b3ef5 --- /dev/null +++ b/web/app/CorridorMap.tsx @@ -0,0 +1,159 @@ +"use client"; + +import "leaflet/dist/leaflet.css"; + +import { useEffect, useMemo, useRef } from "react"; +import { + MapContainer, + Marker, + Polyline, + TileLayer, + useMapEvents, +} from "react-leaflet"; +import L from "leaflet"; + +/** + * P78 — Map-first corridor input. + * + * Drop two pins, get a corridor. First click sets the lower terminal, + * second click sets the upper terminal, third resets and starts over. + * + * Renders a Leaflet map with OpenStreetMap tiles. The parent owns the + * `[lon, lat]` state for both endpoints and gets called back whenever + * a marker is set/moved. Markers are draggable so the engineer can + * fine-tune after the initial drop. + */ + +type LonLat = [number, number]; // [lon, lat] to match the API order + +type Props = { + start: LonLat; + end: LonLat; + onChange: (start: LonLat, end: LonLat) => void; + /** Optional center override; defaults to the midpoint of {start, end}. */ + initialCenter?: LonLat; + height?: number | string; +}; + +// Default Leaflet markers ship as images bundled with the npm package +// but get tree-shaken oddly inside Next.js — wire up explicit icons. +function makeIcon(color: "green" | "blue") { + const fill = color === "green" ? "#16a34a" : "#dc2626"; + const svg = encodeURIComponent( + `` + ); + return L.icon({ + iconUrl: `data:image/svg+xml;charset=UTF-8,${svg}`, + iconSize: [32, 42], + iconAnchor: [16, 42], + popupAnchor: [0, -38], + }); +} + +const ICON_START = typeof window !== "undefined" ? makeIcon("green") : null; +const ICON_END = typeof window !== "undefined" ? makeIcon("blue") : null; + +function ClickHandler({ + start, + end, + onChange, + clickPhaseRef, +}: { + start: LonLat; + end: LonLat; + onChange: (s: LonLat, e: LonLat) => void; + clickPhaseRef: React.MutableRefObject<0 | 1 | 2>; +}) { + useMapEvents({ + click(evt) { + const lonlat: LonLat = [evt.latlng.lng, evt.latlng.lat]; + // Phase 0 -> set start; 1 -> set end; 2 -> reset to a new start. + if (clickPhaseRef.current === 0) { + onChange(lonlat, end); + clickPhaseRef.current = 1; + } else if (clickPhaseRef.current === 1) { + onChange(start, lonlat); + clickPhaseRef.current = 2; + } else { + onChange(lonlat, end); + clickPhaseRef.current = 1; + } + }, + }); + return null; +} + +export default function CorridorMap({ + start, + end, + onChange, + initialCenter, + height = 360, +}: Props) { + const clickPhaseRef = useRef<0 | 1 | 2>(2); + + const center = useMemo<[number, number]>(() => { + const c = initialCenter ?? [(start[0] + end[0]) / 2, (start[1] + end[1]) / 2]; + return [c[1], c[0]]; // Leaflet expects [lat, lon] + }, [initialCenter, start, end]); + + // When the parent changes start/end (e.g. preset switch), recenter. + const mapRef = useRef(null); + useEffect(() => { + if (mapRef.current) { + mapRef.current.flyTo(center, mapRef.current.getZoom(), { duration: 0.5 }); + } + }, [center]); + + const startLatLon: [number, number] = [start[1], start[0]]; + const endLatLon: [number, number] = [end[1], end[0]]; + + return ( +
+ { if (m) mapRef.current = m; }} + > + + {ICON_START && ( + + )} + {ICON_END && ( + + )} + + + +
+ ); +} diff --git a/web/app/page.tsx b/web/app/page.tsx index 6d17ac5..128e7e2 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -1,5 +1,6 @@ "use client"; +import dynamic from "next/dynamic"; import { useState } from "react"; import { type CorridorJob, @@ -12,6 +13,9 @@ import { submitCorridor, } from "@/lib/api"; +// Leaflet touches `window` on import; load client-only. +const CorridorMap = dynamic(() => import("./CorridorMap"), { ssr: false }); + const PRESETS: Record = { bhimashankar: { name: "Bhimashankar (Maharashtra, India)", @@ -107,6 +111,19 @@ export default function Home() {

Corridor

+
+ setReq({ ...req, start: s, end: e })} + height={320} + /> +

+ Click the map to drop endpoints (1st = lower, 2nd = upper, 3rd = restart). + Drag the pins to fine-tune. +

+
+