A very performant and light (2mb in memory) link shortener and tracker. Written in Rust and React and uses Postgres/SQLite.

Init

nekomimi.pet c048377b

+4
.gitignore
···
··· 1 + /target 2 + **/node_modules 3 + node_modules 4 + .env
+216
API.md
···
··· 1 + # Link Shortener API Documentation 2 + 3 + ## Base URL 4 + `http://localhost:8080` 5 + 6 + ## Endpoints 7 + 8 + ### Health Check 9 + Check if the service and database are running. 10 + 11 + ```bash 12 + GET /health 13 + ``` 14 + 15 + Example: 16 + ```bash 17 + curl http://localhost:8080/health 18 + ``` 19 + 20 + Response (200 OK): 21 + ```json 22 + "Healthy" 23 + ``` 24 + 25 + Response (503 Service Unavailable): 26 + ```json 27 + "Database unavailable" 28 + ``` 29 + 30 + ### Create Short URL 31 + Create a new shortened URL with optional custom code. 32 + 33 + ```bash 34 + POST /api/shorten 35 + ``` 36 + 37 + Request Body: 38 + ```json 39 + { 40 + "url": string, // Required: The URL to shorten 41 + "custom_code": string, // Optional: Custom short code 42 + "source": string // Optional: Source of the request 43 + } 44 + ``` 45 + 46 + Examples: 47 + 48 + 1. Create with auto-generated code: 49 + ```bash 50 + curl -X POST http://localhost:8080/api/shorten \ 51 + -H "Content-Type: application/json" \ 52 + -d '{ 53 + "url": "https://example.com", 54 + "source": "curl-test" 55 + }' 56 + ``` 57 + 58 + Response (201 Created): 59 + ```json 60 + { 61 + "id": 1, 62 + "original_url": "https://example.com", 63 + "short_code": "Xa7Bc9", 64 + "created_at": "2024-03-01T12:34:56Z", 65 + "clicks": 0 66 + } 67 + ``` 68 + 69 + 2. Create with custom code: 70 + ```bash 71 + curl -X POST http://localhost:8080/api/shorten \ 72 + -H "Content-Type: application/json" \ 73 + -d '{ 74 + "url": "https://example.com", 75 + "custom_code": "example", 76 + "source": "curl-test" 77 + }' 78 + ``` 79 + 80 + Response (201 Created): 81 + ```json 82 + { 83 + "id": 2, 84 + "original_url": "https://example.com", 85 + "short_code": "example", 86 + "created_at": "2024-03-01T12:34:56Z", 87 + "clicks": 0 88 + } 89 + ``` 90 + 91 + Error Responses: 92 + 93 + Invalid URL (400 Bad Request): 94 + ```json 95 + { 96 + "error": "URL must start with http:// or https://" 97 + } 98 + ``` 99 + 100 + Custom code taken (400 Bad Request): 101 + ```json 102 + { 103 + "error": "Custom code already taken" 104 + } 105 + ``` 106 + 107 + Invalid custom code (400 Bad Request): 108 + ```json 109 + { 110 + "error": "Custom code must be 1-32 characters long and contain only letters, numbers, underscores, and hyphens" 111 + } 112 + ``` 113 + 114 + ### Get All Links 115 + Retrieve all shortened URLs. 116 + 117 + ```bash 118 + GET /api/links 119 + ``` 120 + 121 + Example: 122 + ```bash 123 + curl http://localhost:8080/api/links 124 + ``` 125 + 126 + Response (200 OK): 127 + ```json 128 + [ 129 + { 130 + "id": 1, 131 + "original_url": "https://example.com", 132 + "short_code": "Xa7Bc9", 133 + "created_at": "2024-03-01T12:34:56Z", 134 + "clicks": 5 135 + }, 136 + { 137 + "id": 2, 138 + "original_url": "https://example.org", 139 + "short_code": "example", 140 + "created_at": "2024-03-01T12:35:00Z", 141 + "clicks": 3 142 + } 143 + ] 144 + ``` 145 + 146 + ### Redirect to Original URL 147 + Use the shortened URL to redirect to the original URL. 148 + 149 + ```bash 150 + GET /{short_code} 151 + ``` 152 + 153 + Example: 154 + ```bash 155 + curl -i http://localhost:8080/example 156 + ``` 157 + 158 + Response (307 Temporary Redirect): 159 + ```http 160 + HTTP/1.1 307 Temporary Redirect 161 + Location: https://example.com 162 + ``` 163 + 164 + Error Response (404 Not Found): 165 + ```json 166 + { 167 + "error": "Not found" 168 + } 169 + ``` 170 + 171 + ## Custom Code Rules 172 + 173 + 1. Length: 1-32 characters 174 + 2. Allowed characters: letters, numbers, underscores, and hyphens 175 + 3. Case-sensitive 176 + 4. Cannot use reserved words: ["api", "health", "admin", "static", "assets"] 177 + 178 + ## Rate Limiting 179 + 180 + Currently, no rate limiting is implemented. 181 + 182 + ## Notes 183 + 184 + 1. All timestamps are in UTC 185 + 2. Click counts are incremented on successful redirects 186 + 3. Source tracking is optional but recommended for analytics 187 + 4. Custom codes are case-sensitive 188 + 5. URLs must include protocol (http:// or https://) 189 + 190 + ## Error Codes 191 + 192 + - 200: Success 193 + - 201: Created 194 + - 307: Temporary Redirect 195 + - 400: Bad Request (invalid input) 196 + - 404: Not Found 197 + - 503: Service Unavailable 198 + 199 + ## Database Schema 200 + 201 + ```sql 202 + CREATE TABLE links ( 203 + id SERIAL PRIMARY KEY, 204 + original_url TEXT NOT NULL, 205 + short_code VARCHAR(8) NOT NULL UNIQUE, 206 + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), 207 + clicks BIGINT NOT NULL DEFAULT 0 208 + ); 209 + 210 + CREATE TABLE clicks ( 211 + id SERIAL PRIMARY KEY, 212 + link_id INTEGER REFERENCES links(id), 213 + source TEXT, 214 + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() 215 + ); 216 + ```
+2962
Cargo.lock
···
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "SimpleLink" 7 + version = "0.1.0" 8 + dependencies = [ 9 + "actix-cors", 10 + "actix-web", 11 + "anyhow", 12 + "base62", 13 + "chrono", 14 + "clap", 15 + "dotenv", 16 + "lazy_static", 17 + "regex", 18 + "serde", 19 + "serde_json", 20 + "sqlx", 21 + "thiserror", 22 + "tokio", 23 + "tracing", 24 + "tracing-subscriber", 25 + "uuid", 26 + ] 27 + 28 + [[package]] 29 + name = "actix-codec" 30 + version = "0.5.2" 31 + source = "registry+https://github.com/rust-lang/crates.io-index" 32 + checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" 33 + dependencies = [ 34 + "bitflags", 35 + "bytes", 36 + "futures-core", 37 + "futures-sink", 38 + "memchr", 39 + "pin-project-lite", 40 + "tokio", 41 + "tokio-util", 42 + "tracing", 43 + ] 44 + 45 + [[package]] 46 + name = "actix-cors" 47 + version = "0.6.5" 48 + source = "registry+https://github.com/rust-lang/crates.io-index" 49 + checksum = "0346d8c1f762b41b458ed3145eea914966bb9ad20b9be0d6d463b20d45586370" 50 + dependencies = [ 51 + "actix-utils", 52 + "actix-web", 53 + "derive_more", 54 + "futures-util", 55 + "log", 56 + "once_cell", 57 + "smallvec", 58 + ] 59 + 60 + [[package]] 61 + name = "actix-http" 62 + version = "3.9.0" 63 + source = "registry+https://github.com/rust-lang/crates.io-index" 64 + checksum = "d48f96fc3003717aeb9856ca3d02a8c7de502667ad76eeacd830b48d2e91fac4" 65 + dependencies = [ 66 + "actix-codec", 67 + "actix-rt", 68 + "actix-service", 69 + "actix-utils", 70 + "ahash", 71 + "base64 0.22.1", 72 + "bitflags", 73 + "brotli", 74 + "bytes", 75 + "bytestring", 76 + "derive_more", 77 + "encoding_rs", 78 + "flate2", 79 + "futures-core", 80 + "h2", 81 + "http", 82 + "httparse", 83 + "httpdate", 84 + "itoa", 85 + "language-tags", 86 + "local-channel", 87 + "mime", 88 + "percent-encoding", 89 + "pin-project-lite", 90 + "rand", 91 + "sha1", 92 + "smallvec", 93 + "tokio", 94 + "tokio-util", 95 + "tracing", 96 + "zstd", 97 + ] 98 + 99 + [[package]] 100 + name = "actix-macros" 101 + version = "0.2.4" 102 + source = "registry+https://github.com/rust-lang/crates.io-index" 103 + checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" 104 + dependencies = [ 105 + "quote", 106 + "syn 2.0.96", 107 + ] 108 + 109 + [[package]] 110 + name = "actix-router" 111 + version = "0.5.3" 112 + source = "registry+https://github.com/rust-lang/crates.io-index" 113 + checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" 114 + dependencies = [ 115 + "bytestring", 116 + "cfg-if", 117 + "http", 118 + "regex", 119 + "regex-lite", 120 + "serde", 121 + "tracing", 122 + ] 123 + 124 + [[package]] 125 + name = "actix-rt" 126 + version = "2.10.0" 127 + source = "registry+https://github.com/rust-lang/crates.io-index" 128 + checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" 129 + dependencies = [ 130 + "futures-core", 131 + "tokio", 132 + ] 133 + 134 + [[package]] 135 + name = "actix-server" 136 + version = "2.5.0" 137 + source = "registry+https://github.com/rust-lang/crates.io-index" 138 + checksum = "7ca2549781d8dd6d75c40cf6b6051260a2cc2f3c62343d761a969a0640646894" 139 + dependencies = [ 140 + "actix-rt", 141 + "actix-service", 142 + "actix-utils", 143 + "futures-core", 144 + "futures-util", 145 + "mio", 146 + "socket2", 147 + "tokio", 148 + "tracing", 149 + ] 150 + 151 + [[package]] 152 + name = "actix-service" 153 + version = "2.0.2" 154 + source = "registry+https://github.com/rust-lang/crates.io-index" 155 + checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" 156 + dependencies = [ 157 + "futures-core", 158 + "paste", 159 + "pin-project-lite", 160 + ] 161 + 162 + [[package]] 163 + name = "actix-utils" 164 + version = "3.0.1" 165 + source = "registry+https://github.com/rust-lang/crates.io-index" 166 + checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" 167 + dependencies = [ 168 + "local-waker", 169 + "pin-project-lite", 170 + ] 171 + 172 + [[package]] 173 + name = "actix-web" 174 + version = "4.9.0" 175 + source = "registry+https://github.com/rust-lang/crates.io-index" 176 + checksum = "9180d76e5cc7ccbc4d60a506f2c727730b154010262df5b910eb17dbe4b8cb38" 177 + dependencies = [ 178 + "actix-codec", 179 + "actix-http", 180 + "actix-macros", 181 + "actix-router", 182 + "actix-rt", 183 + "actix-server", 184 + "actix-service", 185 + "actix-utils", 186 + "actix-web-codegen", 187 + "ahash", 188 + "bytes", 189 + "bytestring", 190 + "cfg-if", 191 + "cookie", 192 + "derive_more", 193 + "encoding_rs", 194 + "futures-core", 195 + "futures-util", 196 + "impl-more", 197 + "itoa", 198 + "language-tags", 199 + "log", 200 + "mime", 201 + "once_cell", 202 + "pin-project-lite", 203 + "regex", 204 + "regex-lite", 205 + "serde", 206 + "serde_json", 207 + "serde_urlencoded", 208 + "smallvec", 209 + "socket2", 210 + "time", 211 + "url", 212 + ] 213 + 214 + [[package]] 215 + name = "actix-web-codegen" 216 + version = "4.3.0" 217 + source = "registry+https://github.com/rust-lang/crates.io-index" 218 + checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" 219 + dependencies = [ 220 + "actix-router", 221 + "proc-macro2", 222 + "quote", 223 + "syn 2.0.96", 224 + ] 225 + 226 + [[package]] 227 + name = "addr2line" 228 + version = "0.24.2" 229 + source = "registry+https://github.com/rust-lang/crates.io-index" 230 + checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 231 + dependencies = [ 232 + "gimli", 233 + ] 234 + 235 + [[package]] 236 + name = "adler2" 237 + version = "2.0.0" 238 + source = "registry+https://github.com/rust-lang/crates.io-index" 239 + checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 240 + 241 + [[package]] 242 + name = "ahash" 243 + version = "0.8.11" 244 + source = "registry+https://github.com/rust-lang/crates.io-index" 245 + checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 246 + dependencies = [ 247 + "cfg-if", 248 + "getrandom", 249 + "once_cell", 250 + "version_check", 251 + "zerocopy", 252 + ] 253 + 254 + [[package]] 255 + name = "aho-corasick" 256 + version = "1.1.3" 257 + source = "registry+https://github.com/rust-lang/crates.io-index" 258 + checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 259 + dependencies = [ 260 + "memchr", 261 + ] 262 + 263 + [[package]] 264 + name = "alloc-no-stdlib" 265 + version = "2.0.4" 266 + source = "registry+https://github.com/rust-lang/crates.io-index" 267 + checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 268 + 269 + [[package]] 270 + name = "alloc-stdlib" 271 + version = "0.2.2" 272 + source = "registry+https://github.com/rust-lang/crates.io-index" 273 + checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 274 + dependencies = [ 275 + "alloc-no-stdlib", 276 + ] 277 + 278 + [[package]] 279 + name = "allocator-api2" 280 + version = "0.2.21" 281 + source = "registry+https://github.com/rust-lang/crates.io-index" 282 + checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 283 + 284 + [[package]] 285 + name = "android-tzdata" 286 + version = "0.1.1" 287 + source = "registry+https://github.com/rust-lang/crates.io-index" 288 + checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 289 + 290 + [[package]] 291 + name = "android_system_properties" 292 + version = "0.1.5" 293 + source = "registry+https://github.com/rust-lang/crates.io-index" 294 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 295 + dependencies = [ 296 + "libc", 297 + ] 298 + 299 + [[package]] 300 + name = "anstream" 301 + version = "0.6.18" 302 + source = "registry+https://github.com/rust-lang/crates.io-index" 303 + checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 304 + dependencies = [ 305 + "anstyle", 306 + "anstyle-parse", 307 + "anstyle-query", 308 + "anstyle-wincon", 309 + "colorchoice", 310 + "is_terminal_polyfill", 311 + "utf8parse", 312 + ] 313 + 314 + [[package]] 315 + name = "anstyle" 316 + version = "1.0.10" 317 + source = "registry+https://github.com/rust-lang/crates.io-index" 318 + checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 319 + 320 + [[package]] 321 + name = "anstyle-parse" 322 + version = "0.2.6" 323 + source = "registry+https://github.com/rust-lang/crates.io-index" 324 + checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 325 + dependencies = [ 326 + "utf8parse", 327 + ] 328 + 329 + [[package]] 330 + name = "anstyle-query" 331 + version = "1.1.2" 332 + source = "registry+https://github.com/rust-lang/crates.io-index" 333 + checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 334 + dependencies = [ 335 + "windows-sys 0.59.0", 336 + ] 337 + 338 + [[package]] 339 + name = "anstyle-wincon" 340 + version = "3.0.7" 341 + source = "registry+https://github.com/rust-lang/crates.io-index" 342 + checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" 343 + dependencies = [ 344 + "anstyle", 345 + "once_cell", 346 + "windows-sys 0.59.0", 347 + ] 348 + 349 + [[package]] 350 + name = "anyhow" 351 + version = "1.0.95" 352 + source = "registry+https://github.com/rust-lang/crates.io-index" 353 + checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" 354 + 355 + [[package]] 356 + name = "atoi" 357 + version = "2.0.0" 358 + source = "registry+https://github.com/rust-lang/crates.io-index" 359 + checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 360 + dependencies = [ 361 + "num-traits", 362 + ] 363 + 364 + [[package]] 365 + name = "autocfg" 366 + version = "1.4.0" 367 + source = "registry+https://github.com/rust-lang/crates.io-index" 368 + checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 369 + 370 + [[package]] 371 + name = "backtrace" 372 + version = "0.3.74" 373 + source = "registry+https://github.com/rust-lang/crates.io-index" 374 + checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 375 + dependencies = [ 376 + "addr2line", 377 + "cfg-if", 378 + "libc", 379 + "miniz_oxide", 380 + "object", 381 + "rustc-demangle", 382 + "windows-targets 0.52.6", 383 + ] 384 + 385 + [[package]] 386 + name = "base62" 387 + version = "2.2.1" 388 + source = "registry+https://github.com/rust-lang/crates.io-index" 389 + checksum = "10e52a7bcb1d6beebee21fb5053af9e3cbb7a7ed1a4909e534040e676437ab1f" 390 + dependencies = [ 391 + "rustversion", 392 + ] 393 + 394 + [[package]] 395 + name = "base64" 396 + version = "0.21.7" 397 + source = "registry+https://github.com/rust-lang/crates.io-index" 398 + checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 399 + 400 + [[package]] 401 + name = "base64" 402 + version = "0.22.1" 403 + source = "registry+https://github.com/rust-lang/crates.io-index" 404 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 405 + 406 + [[package]] 407 + name = "base64ct" 408 + version = "1.6.0" 409 + source = "registry+https://github.com/rust-lang/crates.io-index" 410 + checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 411 + 412 + [[package]] 413 + name = "bitflags" 414 + version = "2.8.0" 415 + source = "registry+https://github.com/rust-lang/crates.io-index" 416 + checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 417 + dependencies = [ 418 + "serde", 419 + ] 420 + 421 + [[package]] 422 + name = "block-buffer" 423 + version = "0.10.4" 424 + source = "registry+https://github.com/rust-lang/crates.io-index" 425 + checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 426 + dependencies = [ 427 + "generic-array", 428 + ] 429 + 430 + [[package]] 431 + name = "brotli" 432 + version = "6.0.0" 433 + source = "registry+https://github.com/rust-lang/crates.io-index" 434 + checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" 435 + dependencies = [ 436 + "alloc-no-stdlib", 437 + "alloc-stdlib", 438 + "brotli-decompressor", 439 + ] 440 + 441 + [[package]] 442 + name = "brotli-decompressor" 443 + version = "4.0.2" 444 + source = "registry+https://github.com/rust-lang/crates.io-index" 445 + checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" 446 + dependencies = [ 447 + "alloc-no-stdlib", 448 + "alloc-stdlib", 449 + ] 450 + 451 + [[package]] 452 + name = "bumpalo" 453 + version = "3.16.0" 454 + source = "registry+https://github.com/rust-lang/crates.io-index" 455 + checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 456 + 457 + [[package]] 458 + name = "byteorder" 459 + version = "1.5.0" 460 + source = "registry+https://github.com/rust-lang/crates.io-index" 461 + checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 462 + 463 + [[package]] 464 + name = "bytes" 465 + version = "1.9.0" 466 + source = "registry+https://github.com/rust-lang/crates.io-index" 467 + checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" 468 + 469 + [[package]] 470 + name = "bytestring" 471 + version = "1.4.0" 472 + source = "registry+https://github.com/rust-lang/crates.io-index" 473 + checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" 474 + dependencies = [ 475 + "bytes", 476 + ] 477 + 478 + [[package]] 479 + name = "cc" 480 + version = "1.2.10" 481 + source = "registry+https://github.com/rust-lang/crates.io-index" 482 + checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" 483 + dependencies = [ 484 + "jobserver", 485 + "libc", 486 + "shlex", 487 + ] 488 + 489 + [[package]] 490 + name = "cfg-if" 491 + version = "1.0.0" 492 + source = "registry+https://github.com/rust-lang/crates.io-index" 493 + checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 494 + 495 + [[package]] 496 + name = "chrono" 497 + version = "0.4.39" 498 + source = "registry+https://github.com/rust-lang/crates.io-index" 499 + checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" 500 + dependencies = [ 501 + "android-tzdata", 502 + "iana-time-zone", 503 + "js-sys", 504 + "num-traits", 505 + "serde", 506 + "wasm-bindgen", 507 + "windows-targets 0.52.6", 508 + ] 509 + 510 + [[package]] 511 + name = "clap" 512 + version = "4.5.27" 513 + source = "registry+https://github.com/rust-lang/crates.io-index" 514 + checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" 515 + dependencies = [ 516 + "clap_builder", 517 + "clap_derive", 518 + ] 519 + 520 + [[package]] 521 + name = "clap_builder" 522 + version = "4.5.27" 523 + source = "registry+https://github.com/rust-lang/crates.io-index" 524 + checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" 525 + dependencies = [ 526 + "anstream", 527 + "anstyle", 528 + "clap_lex", 529 + "strsim", 530 + ] 531 + 532 + [[package]] 533 + name = "clap_derive" 534 + version = "4.5.24" 535 + source = "registry+https://github.com/rust-lang/crates.io-index" 536 + checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" 537 + dependencies = [ 538 + "heck 0.5.0", 539 + "proc-macro2", 540 + "quote", 541 + "syn 2.0.96", 542 + ] 543 + 544 + [[package]] 545 + name = "clap_lex" 546 + version = "0.7.4" 547 + source = "registry+https://github.com/rust-lang/crates.io-index" 548 + checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 549 + 550 + [[package]] 551 + name = "colorchoice" 552 + version = "1.0.3" 553 + source = "registry+https://github.com/rust-lang/crates.io-index" 554 + checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 555 + 556 + [[package]] 557 + name = "const-oid" 558 + version = "0.9.6" 559 + source = "registry+https://github.com/rust-lang/crates.io-index" 560 + checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 561 + 562 + [[package]] 563 + name = "convert_case" 564 + version = "0.4.0" 565 + source = "registry+https://github.com/rust-lang/crates.io-index" 566 + checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 567 + 568 + [[package]] 569 + name = "cookie" 570 + version = "0.16.2" 571 + source = "registry+https://github.com/rust-lang/crates.io-index" 572 + checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" 573 + dependencies = [ 574 + "percent-encoding", 575 + "time", 576 + "version_check", 577 + ] 578 + 579 + [[package]] 580 + name = "core-foundation" 581 + version = "0.9.4" 582 + source = "registry+https://github.com/rust-lang/crates.io-index" 583 + checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 584 + dependencies = [ 585 + "core-foundation-sys", 586 + "libc", 587 + ] 588 + 589 + [[package]] 590 + name = "core-foundation-sys" 591 + version = "0.8.7" 592 + source = "registry+https://github.com/rust-lang/crates.io-index" 593 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 594 + 595 + [[package]] 596 + name = "cpufeatures" 597 + version = "0.2.17" 598 + source = "registry+https://github.com/rust-lang/crates.io-index" 599 + checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 600 + dependencies = [ 601 + "libc", 602 + ] 603 + 604 + [[package]] 605 + name = "crc" 606 + version = "3.2.1" 607 + source = "registry+https://github.com/rust-lang/crates.io-index" 608 + checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" 609 + dependencies = [ 610 + "crc-catalog", 611 + ] 612 + 613 + [[package]] 614 + name = "crc-catalog" 615 + version = "2.4.0" 616 + source = "registry+https://github.com/rust-lang/crates.io-index" 617 + checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" 618 + 619 + [[package]] 620 + name = "crc32fast" 621 + version = "1.4.2" 622 + source = "registry+https://github.com/rust-lang/crates.io-index" 623 + checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 624 + dependencies = [ 625 + "cfg-if", 626 + ] 627 + 628 + [[package]] 629 + name = "crossbeam-queue" 630 + version = "0.3.12" 631 + source = "registry+https://github.com/rust-lang/crates.io-index" 632 + checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" 633 + dependencies = [ 634 + "crossbeam-utils", 635 + ] 636 + 637 + [[package]] 638 + name = "crossbeam-utils" 639 + version = "0.8.21" 640 + source = "registry+https://github.com/rust-lang/crates.io-index" 641 + checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 642 + 643 + [[package]] 644 + name = "crypto-common" 645 + version = "0.1.6" 646 + source = "registry+https://github.com/rust-lang/crates.io-index" 647 + checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 648 + dependencies = [ 649 + "generic-array", 650 + "typenum", 651 + ] 652 + 653 + [[package]] 654 + name = "der" 655 + version = "0.7.9" 656 + source = "registry+https://github.com/rust-lang/crates.io-index" 657 + checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" 658 + dependencies = [ 659 + "const-oid", 660 + "pem-rfc7468", 661 + "zeroize", 662 + ] 663 + 664 + [[package]] 665 + name = "deranged" 666 + version = "0.3.11" 667 + source = "registry+https://github.com/rust-lang/crates.io-index" 668 + checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 669 + dependencies = [ 670 + "powerfmt", 671 + ] 672 + 673 + [[package]] 674 + name = "derive_more" 675 + version = "0.99.18" 676 + source = "registry+https://github.com/rust-lang/crates.io-index" 677 + checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" 678 + dependencies = [ 679 + "convert_case", 680 + "proc-macro2", 681 + "quote", 682 + "rustc_version", 683 + "syn 2.0.96", 684 + ] 685 + 686 + [[package]] 687 + name = "digest" 688 + version = "0.10.7" 689 + source = "registry+https://github.com/rust-lang/crates.io-index" 690 + checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 691 + dependencies = [ 692 + "block-buffer", 693 + "const-oid", 694 + "crypto-common", 695 + "subtle", 696 + ] 697 + 698 + [[package]] 699 + name = "displaydoc" 700 + version = "0.2.5" 701 + source = "registry+https://github.com/rust-lang/crates.io-index" 702 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 703 + dependencies = [ 704 + "proc-macro2", 705 + "quote", 706 + "syn 2.0.96", 707 + ] 708 + 709 + [[package]] 710 + name = "dotenv" 711 + version = "0.15.0" 712 + source = "registry+https://github.com/rust-lang/crates.io-index" 713 + checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" 714 + 715 + [[package]] 716 + name = "dotenvy" 717 + version = "0.15.7" 718 + source = "registry+https://github.com/rust-lang/crates.io-index" 719 + checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" 720 + 721 + [[package]] 722 + name = "either" 723 + version = "1.13.0" 724 + source = "registry+https://github.com/rust-lang/crates.io-index" 725 + checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 726 + dependencies = [ 727 + "serde", 728 + ] 729 + 730 + [[package]] 731 + name = "encoding_rs" 732 + version = "0.8.35" 733 + source = "registry+https://github.com/rust-lang/crates.io-index" 734 + checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 735 + dependencies = [ 736 + "cfg-if", 737 + ] 738 + 739 + [[package]] 740 + name = "equivalent" 741 + version = "1.0.1" 742 + source = "registry+https://github.com/rust-lang/crates.io-index" 743 + checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 744 + 745 + [[package]] 746 + name = "errno" 747 + version = "0.3.10" 748 + source = "registry+https://github.com/rust-lang/crates.io-index" 749 + checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 750 + dependencies = [ 751 + "libc", 752 + "windows-sys 0.59.0", 753 + ] 754 + 755 + [[package]] 756 + name = "etcetera" 757 + version = "0.8.0" 758 + source = "registry+https://github.com/rust-lang/crates.io-index" 759 + checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" 760 + dependencies = [ 761 + "cfg-if", 762 + "home", 763 + "windows-sys 0.48.0", 764 + ] 765 + 766 + [[package]] 767 + name = "event-listener" 768 + version = "2.5.3" 769 + source = "registry+https://github.com/rust-lang/crates.io-index" 770 + checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" 771 + 772 + [[package]] 773 + name = "fastrand" 774 + version = "2.3.0" 775 + source = "registry+https://github.com/rust-lang/crates.io-index" 776 + checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 777 + 778 + [[package]] 779 + name = "flate2" 780 + version = "1.0.35" 781 + source = "registry+https://github.com/rust-lang/crates.io-index" 782 + checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" 783 + dependencies = [ 784 + "crc32fast", 785 + "miniz_oxide", 786 + ] 787 + 788 + [[package]] 789 + name = "flume" 790 + version = "0.11.1" 791 + source = "registry+https://github.com/rust-lang/crates.io-index" 792 + checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" 793 + dependencies = [ 794 + "futures-core", 795 + "futures-sink", 796 + "spin", 797 + ] 798 + 799 + [[package]] 800 + name = "fnv" 801 + version = "1.0.7" 802 + source = "registry+https://github.com/rust-lang/crates.io-index" 803 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 804 + 805 + [[package]] 806 + name = "foreign-types" 807 + version = "0.3.2" 808 + source = "registry+https://github.com/rust-lang/crates.io-index" 809 + checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 810 + dependencies = [ 811 + "foreign-types-shared", 812 + ] 813 + 814 + [[package]] 815 + name = "foreign-types-shared" 816 + version = "0.1.1" 817 + source = "registry+https://github.com/rust-lang/crates.io-index" 818 + checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 819 + 820 + [[package]] 821 + name = "form_urlencoded" 822 + version = "1.2.1" 823 + source = "registry+https://github.com/rust-lang/crates.io-index" 824 + checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 825 + dependencies = [ 826 + "percent-encoding", 827 + ] 828 + 829 + [[package]] 830 + name = "futures-channel" 831 + version = "0.3.31" 832 + source = "registry+https://github.com/rust-lang/crates.io-index" 833 + checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 834 + dependencies = [ 835 + "futures-core", 836 + "futures-sink", 837 + ] 838 + 839 + [[package]] 840 + name = "futures-core" 841 + version = "0.3.31" 842 + source = "registry+https://github.com/rust-lang/crates.io-index" 843 + checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 844 + 845 + [[package]] 846 + name = "futures-executor" 847 + version = "0.3.31" 848 + source = "registry+https://github.com/rust-lang/crates.io-index" 849 + checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 850 + dependencies = [ 851 + "futures-core", 852 + "futures-task", 853 + "futures-util", 854 + ] 855 + 856 + [[package]] 857 + name = "futures-intrusive" 858 + version = "0.5.0" 859 + source = "registry+https://github.com/rust-lang/crates.io-index" 860 + checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" 861 + dependencies = [ 862 + "futures-core", 863 + "lock_api", 864 + "parking_lot", 865 + ] 866 + 867 + [[package]] 868 + name = "futures-io" 869 + version = "0.3.31" 870 + source = "registry+https://github.com/rust-lang/crates.io-index" 871 + checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 872 + 873 + [[package]] 874 + name = "futures-sink" 875 + version = "0.3.31" 876 + source = "registry+https://github.com/rust-lang/crates.io-index" 877 + checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 878 + 879 + [[package]] 880 + name = "futures-task" 881 + version = "0.3.31" 882 + source = "registry+https://github.com/rust-lang/crates.io-index" 883 + checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 884 + 885 + [[package]] 886 + name = "futures-util" 887 + version = "0.3.31" 888 + source = "registry+https://github.com/rust-lang/crates.io-index" 889 + checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 890 + dependencies = [ 891 + "futures-core", 892 + "futures-io", 893 + "futures-sink", 894 + "futures-task", 895 + "memchr", 896 + "pin-project-lite", 897 + "pin-utils", 898 + "slab", 899 + ] 900 + 901 + [[package]] 902 + name = "generic-array" 903 + version = "0.14.7" 904 + source = "registry+https://github.com/rust-lang/crates.io-index" 905 + checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 906 + dependencies = [ 907 + "typenum", 908 + "version_check", 909 + ] 910 + 911 + [[package]] 912 + name = "getrandom" 913 + version = "0.2.15" 914 + source = "registry+https://github.com/rust-lang/crates.io-index" 915 + checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 916 + dependencies = [ 917 + "cfg-if", 918 + "libc", 919 + "wasi", 920 + ] 921 + 922 + [[package]] 923 + name = "gimli" 924 + version = "0.31.1" 925 + source = "registry+https://github.com/rust-lang/crates.io-index" 926 + checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 927 + 928 + [[package]] 929 + name = "h2" 930 + version = "0.3.26" 931 + source = "registry+https://github.com/rust-lang/crates.io-index" 932 + checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 933 + dependencies = [ 934 + "bytes", 935 + "fnv", 936 + "futures-core", 937 + "futures-sink", 938 + "futures-util", 939 + "http", 940 + "indexmap", 941 + "slab", 942 + "tokio", 943 + "tokio-util", 944 + "tracing", 945 + ] 946 + 947 + [[package]] 948 + name = "hashbrown" 949 + version = "0.14.5" 950 + source = "registry+https://github.com/rust-lang/crates.io-index" 951 + checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 952 + dependencies = [ 953 + "ahash", 954 + "allocator-api2", 955 + ] 956 + 957 + [[package]] 958 + name = "hashbrown" 959 + version = "0.15.2" 960 + source = "registry+https://github.com/rust-lang/crates.io-index" 961 + checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 962 + 963 + [[package]] 964 + name = "hashlink" 965 + version = "0.8.4" 966 + source = "registry+https://github.com/rust-lang/crates.io-index" 967 + checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" 968 + dependencies = [ 969 + "hashbrown 0.14.5", 970 + ] 971 + 972 + [[package]] 973 + name = "heck" 974 + version = "0.4.1" 975 + source = "registry+https://github.com/rust-lang/crates.io-index" 976 + checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 977 + dependencies = [ 978 + "unicode-segmentation", 979 + ] 980 + 981 + [[package]] 982 + name = "heck" 983 + version = "0.5.0" 984 + source = "registry+https://github.com/rust-lang/crates.io-index" 985 + checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 986 + 987 + [[package]] 988 + name = "hex" 989 + version = "0.4.3" 990 + source = "registry+https://github.com/rust-lang/crates.io-index" 991 + checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 992 + 993 + [[package]] 994 + name = "hkdf" 995 + version = "0.12.4" 996 + source = "registry+https://github.com/rust-lang/crates.io-index" 997 + checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" 998 + dependencies = [ 999 + "hmac", 1000 + ] 1001 + 1002 + [[package]] 1003 + name = "hmac" 1004 + version = "0.12.1" 1005 + source = "registry+https://github.com/rust-lang/crates.io-index" 1006 + checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 1007 + dependencies = [ 1008 + "digest", 1009 + ] 1010 + 1011 + [[package]] 1012 + name = "home" 1013 + version = "0.5.11" 1014 + source = "registry+https://github.com/rust-lang/crates.io-index" 1015 + checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 1016 + dependencies = [ 1017 + "windows-sys 0.59.0", 1018 + ] 1019 + 1020 + [[package]] 1021 + name = "http" 1022 + version = "0.2.12" 1023 + source = "registry+https://github.com/rust-lang/crates.io-index" 1024 + checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 1025 + dependencies = [ 1026 + "bytes", 1027 + "fnv", 1028 + "itoa", 1029 + ] 1030 + 1031 + [[package]] 1032 + name = "httparse" 1033 + version = "1.9.5" 1034 + source = "registry+https://github.com/rust-lang/crates.io-index" 1035 + checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" 1036 + 1037 + [[package]] 1038 + name = "httpdate" 1039 + version = "1.0.3" 1040 + source = "registry+https://github.com/rust-lang/crates.io-index" 1041 + checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 1042 + 1043 + [[package]] 1044 + name = "iana-time-zone" 1045 + version = "0.1.61" 1046 + source = "registry+https://github.com/rust-lang/crates.io-index" 1047 + checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" 1048 + dependencies = [ 1049 + "android_system_properties", 1050 + "core-foundation-sys", 1051 + "iana-time-zone-haiku", 1052 + "js-sys", 1053 + "wasm-bindgen", 1054 + "windows-core", 1055 + ] 1056 + 1057 + [[package]] 1058 + name = "iana-time-zone-haiku" 1059 + version = "0.1.2" 1060 + source = "registry+https://github.com/rust-lang/crates.io-index" 1061 + checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1062 + dependencies = [ 1063 + "cc", 1064 + ] 1065 + 1066 + [[package]] 1067 + name = "icu_collections" 1068 + version = "1.5.0" 1069 + source = "registry+https://github.com/rust-lang/crates.io-index" 1070 + checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 1071 + dependencies = [ 1072 + "displaydoc", 1073 + "yoke", 1074 + "zerofrom", 1075 + "zerovec", 1076 + ] 1077 + 1078 + [[package]] 1079 + name = "icu_locid" 1080 + version = "1.5.0" 1081 + source = "registry+https://github.com/rust-lang/crates.io-index" 1082 + checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 1083 + dependencies = [ 1084 + "displaydoc", 1085 + "litemap", 1086 + "tinystr", 1087 + "writeable", 1088 + "zerovec", 1089 + ] 1090 + 1091 + [[package]] 1092 + name = "icu_locid_transform" 1093 + version = "1.5.0" 1094 + source = "registry+https://github.com/rust-lang/crates.io-index" 1095 + checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 1096 + dependencies = [ 1097 + "displaydoc", 1098 + "icu_locid", 1099 + "icu_locid_transform_data", 1100 + "icu_provider", 1101 + "tinystr", 1102 + "zerovec", 1103 + ] 1104 + 1105 + [[package]] 1106 + name = "icu_locid_transform_data" 1107 + version = "1.5.0" 1108 + source = "registry+https://github.com/rust-lang/crates.io-index" 1109 + checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 1110 + 1111 + [[package]] 1112 + name = "icu_normalizer" 1113 + version = "1.5.0" 1114 + source = "registry+https://github.com/rust-lang/crates.io-index" 1115 + checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 1116 + dependencies = [ 1117 + "displaydoc", 1118 + "icu_collections", 1119 + "icu_normalizer_data", 1120 + "icu_properties", 1121 + "icu_provider", 1122 + "smallvec", 1123 + "utf16_iter", 1124 + "utf8_iter", 1125 + "write16", 1126 + "zerovec", 1127 + ] 1128 + 1129 + [[package]] 1130 + name = "icu_normalizer_data" 1131 + version = "1.5.0" 1132 + source = "registry+https://github.com/rust-lang/crates.io-index" 1133 + checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 1134 + 1135 + [[package]] 1136 + name = "icu_properties" 1137 + version = "1.5.1" 1138 + source = "registry+https://github.com/rust-lang/crates.io-index" 1139 + checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 1140 + dependencies = [ 1141 + "displaydoc", 1142 + "icu_collections", 1143 + "icu_locid_transform", 1144 + "icu_properties_data", 1145 + "icu_provider", 1146 + "tinystr", 1147 + "zerovec", 1148 + ] 1149 + 1150 + [[package]] 1151 + name = "icu_properties_data" 1152 + version = "1.5.0" 1153 + source = "registry+https://github.com/rust-lang/crates.io-index" 1154 + checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 1155 + 1156 + [[package]] 1157 + name = "icu_provider" 1158 + version = "1.5.0" 1159 + source = "registry+https://github.com/rust-lang/crates.io-index" 1160 + checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 1161 + dependencies = [ 1162 + "displaydoc", 1163 + "icu_locid", 1164 + "icu_provider_macros", 1165 + "stable_deref_trait", 1166 + "tinystr", 1167 + "writeable", 1168 + "yoke", 1169 + "zerofrom", 1170 + "zerovec", 1171 + ] 1172 + 1173 + [[package]] 1174 + name = "icu_provider_macros" 1175 + version = "1.5.0" 1176 + source = "registry+https://github.com/rust-lang/crates.io-index" 1177 + checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 1178 + dependencies = [ 1179 + "proc-macro2", 1180 + "quote", 1181 + "syn 2.0.96", 1182 + ] 1183 + 1184 + [[package]] 1185 + name = "idna" 1186 + version = "1.0.3" 1187 + source = "registry+https://github.com/rust-lang/crates.io-index" 1188 + checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1189 + dependencies = [ 1190 + "idna_adapter", 1191 + "smallvec", 1192 + "utf8_iter", 1193 + ] 1194 + 1195 + [[package]] 1196 + name = "idna_adapter" 1197 + version = "1.2.0" 1198 + source = "registry+https://github.com/rust-lang/crates.io-index" 1199 + checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 1200 + dependencies = [ 1201 + "icu_normalizer", 1202 + "icu_properties", 1203 + ] 1204 + 1205 + [[package]] 1206 + name = "impl-more" 1207 + version = "0.1.9" 1208 + source = "registry+https://github.com/rust-lang/crates.io-index" 1209 + checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" 1210 + 1211 + [[package]] 1212 + name = "indexmap" 1213 + version = "2.7.1" 1214 + source = "registry+https://github.com/rust-lang/crates.io-index" 1215 + checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" 1216 + dependencies = [ 1217 + "equivalent", 1218 + "hashbrown 0.15.2", 1219 + ] 1220 + 1221 + [[package]] 1222 + name = "is_terminal_polyfill" 1223 + version = "1.70.1" 1224 + source = "registry+https://github.com/rust-lang/crates.io-index" 1225 + checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 1226 + 1227 + [[package]] 1228 + name = "itoa" 1229 + version = "1.0.14" 1230 + source = "registry+https://github.com/rust-lang/crates.io-index" 1231 + checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 1232 + 1233 + [[package]] 1234 + name = "jobserver" 1235 + version = "0.1.32" 1236 + source = "registry+https://github.com/rust-lang/crates.io-index" 1237 + checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" 1238 + dependencies = [ 1239 + "libc", 1240 + ] 1241 + 1242 + [[package]] 1243 + name = "js-sys" 1244 + version = "0.3.77" 1245 + source = "registry+https://github.com/rust-lang/crates.io-index" 1246 + checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 1247 + dependencies = [ 1248 + "once_cell", 1249 + "wasm-bindgen", 1250 + ] 1251 + 1252 + [[package]] 1253 + name = "language-tags" 1254 + version = "0.3.2" 1255 + source = "registry+https://github.com/rust-lang/crates.io-index" 1256 + checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" 1257 + 1258 + [[package]] 1259 + name = "lazy_static" 1260 + version = "1.5.0" 1261 + source = "registry+https://github.com/rust-lang/crates.io-index" 1262 + checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1263 + dependencies = [ 1264 + "spin", 1265 + ] 1266 + 1267 + [[package]] 1268 + name = "libc" 1269 + version = "0.2.169" 1270 + source = "registry+https://github.com/rust-lang/crates.io-index" 1271 + checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 1272 + 1273 + [[package]] 1274 + name = "libm" 1275 + version = "0.2.11" 1276 + source = "registry+https://github.com/rust-lang/crates.io-index" 1277 + checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" 1278 + 1279 + [[package]] 1280 + name = "libsqlite3-sys" 1281 + version = "0.27.0" 1282 + source = "registry+https://github.com/rust-lang/crates.io-index" 1283 + checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" 1284 + dependencies = [ 1285 + "cc", 1286 + "pkg-config", 1287 + "vcpkg", 1288 + ] 1289 + 1290 + [[package]] 1291 + name = "linux-raw-sys" 1292 + version = "0.4.15" 1293 + source = "registry+https://github.com/rust-lang/crates.io-index" 1294 + checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 1295 + 1296 + [[package]] 1297 + name = "litemap" 1298 + version = "0.7.4" 1299 + source = "registry+https://github.com/rust-lang/crates.io-index" 1300 + checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" 1301 + 1302 + [[package]] 1303 + name = "local-channel" 1304 + version = "0.1.5" 1305 + source = "registry+https://github.com/rust-lang/crates.io-index" 1306 + checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" 1307 + dependencies = [ 1308 + "futures-core", 1309 + "futures-sink", 1310 + "local-waker", 1311 + ] 1312 + 1313 + [[package]] 1314 + name = "local-waker" 1315 + version = "0.1.4" 1316 + source = "registry+https://github.com/rust-lang/crates.io-index" 1317 + checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" 1318 + 1319 + [[package]] 1320 + name = "lock_api" 1321 + version = "0.4.12" 1322 + source = "registry+https://github.com/rust-lang/crates.io-index" 1323 + checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1324 + dependencies = [ 1325 + "autocfg", 1326 + "scopeguard", 1327 + ] 1328 + 1329 + [[package]] 1330 + name = "log" 1331 + version = "0.4.25" 1332 + source = "registry+https://github.com/rust-lang/crates.io-index" 1333 + checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" 1334 + 1335 + [[package]] 1336 + name = "md-5" 1337 + version = "0.10.6" 1338 + source = "registry+https://github.com/rust-lang/crates.io-index" 1339 + checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 1340 + dependencies = [ 1341 + "cfg-if", 1342 + "digest", 1343 + ] 1344 + 1345 + [[package]] 1346 + name = "memchr" 1347 + version = "2.7.4" 1348 + source = "registry+https://github.com/rust-lang/crates.io-index" 1349 + checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1350 + 1351 + [[package]] 1352 + name = "mime" 1353 + version = "0.3.17" 1354 + source = "registry+https://github.com/rust-lang/crates.io-index" 1355 + checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1356 + 1357 + [[package]] 1358 + name = "minimal-lexical" 1359 + version = "0.2.1" 1360 + source = "registry+https://github.com/rust-lang/crates.io-index" 1361 + checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1362 + 1363 + [[package]] 1364 + name = "miniz_oxide" 1365 + version = "0.8.3" 1366 + source = "registry+https://github.com/rust-lang/crates.io-index" 1367 + checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" 1368 + dependencies = [ 1369 + "adler2", 1370 + ] 1371 + 1372 + [[package]] 1373 + name = "mio" 1374 + version = "1.0.3" 1375 + source = "registry+https://github.com/rust-lang/crates.io-index" 1376 + checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 1377 + dependencies = [ 1378 + "libc", 1379 + "log", 1380 + "wasi", 1381 + "windows-sys 0.52.0", 1382 + ] 1383 + 1384 + [[package]] 1385 + name = "native-tls" 1386 + version = "0.2.12" 1387 + source = "registry+https://github.com/rust-lang/crates.io-index" 1388 + checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" 1389 + dependencies = [ 1390 + "libc", 1391 + "log", 1392 + "openssl", 1393 + "openssl-probe", 1394 + "openssl-sys", 1395 + "schannel", 1396 + "security-framework", 1397 + "security-framework-sys", 1398 + "tempfile", 1399 + ] 1400 + 1401 + [[package]] 1402 + name = "nom" 1403 + version = "7.1.3" 1404 + source = "registry+https://github.com/rust-lang/crates.io-index" 1405 + checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1406 + dependencies = [ 1407 + "memchr", 1408 + "minimal-lexical", 1409 + ] 1410 + 1411 + [[package]] 1412 + name = "nu-ansi-term" 1413 + version = "0.46.0" 1414 + source = "registry+https://github.com/rust-lang/crates.io-index" 1415 + checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1416 + dependencies = [ 1417 + "overload", 1418 + "winapi", 1419 + ] 1420 + 1421 + [[package]] 1422 + name = "num-bigint-dig" 1423 + version = "0.8.4" 1424 + source = "registry+https://github.com/rust-lang/crates.io-index" 1425 + checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" 1426 + dependencies = [ 1427 + "byteorder", 1428 + "lazy_static", 1429 + "libm", 1430 + "num-integer", 1431 + "num-iter", 1432 + "num-traits", 1433 + "rand", 1434 + "smallvec", 1435 + "zeroize", 1436 + ] 1437 + 1438 + [[package]] 1439 + name = "num-conv" 1440 + version = "0.1.0" 1441 + source = "registry+https://github.com/rust-lang/crates.io-index" 1442 + checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1443 + 1444 + [[package]] 1445 + name = "num-integer" 1446 + version = "0.1.46" 1447 + source = "registry+https://github.com/rust-lang/crates.io-index" 1448 + checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1449 + dependencies = [ 1450 + "num-traits", 1451 + ] 1452 + 1453 + [[package]] 1454 + name = "num-iter" 1455 + version = "0.1.45" 1456 + source = "registry+https://github.com/rust-lang/crates.io-index" 1457 + checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" 1458 + dependencies = [ 1459 + "autocfg", 1460 + "num-integer", 1461 + "num-traits", 1462 + ] 1463 + 1464 + [[package]] 1465 + name = "num-traits" 1466 + version = "0.2.19" 1467 + source = "registry+https://github.com/rust-lang/crates.io-index" 1468 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1469 + dependencies = [ 1470 + "autocfg", 1471 + "libm", 1472 + ] 1473 + 1474 + [[package]] 1475 + name = "object" 1476 + version = "0.36.7" 1477 + source = "registry+https://github.com/rust-lang/crates.io-index" 1478 + checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1479 + dependencies = [ 1480 + "memchr", 1481 + ] 1482 + 1483 + [[package]] 1484 + name = "once_cell" 1485 + version = "1.20.2" 1486 + source = "registry+https://github.com/rust-lang/crates.io-index" 1487 + checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 1488 + 1489 + [[package]] 1490 + name = "openssl" 1491 + version = "0.10.68" 1492 + source = "registry+https://github.com/rust-lang/crates.io-index" 1493 + checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" 1494 + dependencies = [ 1495 + "bitflags", 1496 + "cfg-if", 1497 + "foreign-types", 1498 + "libc", 1499 + "once_cell", 1500 + "openssl-macros", 1501 + "openssl-sys", 1502 + ] 1503 + 1504 + [[package]] 1505 + name = "openssl-macros" 1506 + version = "0.1.1" 1507 + source = "registry+https://github.com/rust-lang/crates.io-index" 1508 + checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1509 + dependencies = [ 1510 + "proc-macro2", 1511 + "quote", 1512 + "syn 2.0.96", 1513 + ] 1514 + 1515 + [[package]] 1516 + name = "openssl-probe" 1517 + version = "0.1.6" 1518 + source = "registry+https://github.com/rust-lang/crates.io-index" 1519 + checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 1520 + 1521 + [[package]] 1522 + name = "openssl-sys" 1523 + version = "0.9.104" 1524 + source = "registry+https://github.com/rust-lang/crates.io-index" 1525 + checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" 1526 + dependencies = [ 1527 + "cc", 1528 + "libc", 1529 + "pkg-config", 1530 + "vcpkg", 1531 + ] 1532 + 1533 + [[package]] 1534 + name = "overload" 1535 + version = "0.1.1" 1536 + source = "registry+https://github.com/rust-lang/crates.io-index" 1537 + checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1538 + 1539 + [[package]] 1540 + name = "parking_lot" 1541 + version = "0.12.3" 1542 + source = "registry+https://github.com/rust-lang/crates.io-index" 1543 + checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1544 + dependencies = [ 1545 + "lock_api", 1546 + "parking_lot_core", 1547 + ] 1548 + 1549 + [[package]] 1550 + name = "parking_lot_core" 1551 + version = "0.9.10" 1552 + source = "registry+https://github.com/rust-lang/crates.io-index" 1553 + checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1554 + dependencies = [ 1555 + "cfg-if", 1556 + "libc", 1557 + "redox_syscall", 1558 + "smallvec", 1559 + "windows-targets 0.52.6", 1560 + ] 1561 + 1562 + [[package]] 1563 + name = "paste" 1564 + version = "1.0.15" 1565 + source = "registry+https://github.com/rust-lang/crates.io-index" 1566 + checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 1567 + 1568 + [[package]] 1569 + name = "pem-rfc7468" 1570 + version = "0.7.0" 1571 + source = "registry+https://github.com/rust-lang/crates.io-index" 1572 + checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 1573 + dependencies = [ 1574 + "base64ct", 1575 + ] 1576 + 1577 + [[package]] 1578 + name = "percent-encoding" 1579 + version = "2.3.1" 1580 + source = "registry+https://github.com/rust-lang/crates.io-index" 1581 + checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1582 + 1583 + [[package]] 1584 + name = "pin-project-lite" 1585 + version = "0.2.16" 1586 + source = "registry+https://github.com/rust-lang/crates.io-index" 1587 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1588 + 1589 + [[package]] 1590 + name = "pin-utils" 1591 + version = "0.1.0" 1592 + source = "registry+https://github.com/rust-lang/crates.io-index" 1593 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1594 + 1595 + [[package]] 1596 + name = "pkcs1" 1597 + version = "0.7.5" 1598 + source = "registry+https://github.com/rust-lang/crates.io-index" 1599 + checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 1600 + dependencies = [ 1601 + "der", 1602 + "pkcs8", 1603 + "spki", 1604 + ] 1605 + 1606 + [[package]] 1607 + name = "pkcs8" 1608 + version = "0.10.2" 1609 + source = "registry+https://github.com/rust-lang/crates.io-index" 1610 + checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 1611 + dependencies = [ 1612 + "der", 1613 + "spki", 1614 + ] 1615 + 1616 + [[package]] 1617 + name = "pkg-config" 1618 + version = "0.3.31" 1619 + source = "registry+https://github.com/rust-lang/crates.io-index" 1620 + checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 1621 + 1622 + [[package]] 1623 + name = "powerfmt" 1624 + version = "0.2.0" 1625 + source = "registry+https://github.com/rust-lang/crates.io-index" 1626 + checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1627 + 1628 + [[package]] 1629 + name = "ppv-lite86" 1630 + version = "0.2.20" 1631 + source = "registry+https://github.com/rust-lang/crates.io-index" 1632 + checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 1633 + dependencies = [ 1634 + "zerocopy", 1635 + ] 1636 + 1637 + [[package]] 1638 + name = "proc-macro2" 1639 + version = "1.0.93" 1640 + source = "registry+https://github.com/rust-lang/crates.io-index" 1641 + checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 1642 + dependencies = [ 1643 + "unicode-ident", 1644 + ] 1645 + 1646 + [[package]] 1647 + name = "quote" 1648 + version = "1.0.38" 1649 + source = "registry+https://github.com/rust-lang/crates.io-index" 1650 + checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 1651 + dependencies = [ 1652 + "proc-macro2", 1653 + ] 1654 + 1655 + [[package]] 1656 + name = "rand" 1657 + version = "0.8.5" 1658 + source = "registry+https://github.com/rust-lang/crates.io-index" 1659 + checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1660 + dependencies = [ 1661 + "libc", 1662 + "rand_chacha", 1663 + "rand_core", 1664 + ] 1665 + 1666 + [[package]] 1667 + name = "rand_chacha" 1668 + version = "0.3.1" 1669 + source = "registry+https://github.com/rust-lang/crates.io-index" 1670 + checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1671 + dependencies = [ 1672 + "ppv-lite86", 1673 + "rand_core", 1674 + ] 1675 + 1676 + [[package]] 1677 + name = "rand_core" 1678 + version = "0.6.4" 1679 + source = "registry+https://github.com/rust-lang/crates.io-index" 1680 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1681 + dependencies = [ 1682 + "getrandom", 1683 + ] 1684 + 1685 + [[package]] 1686 + name = "redox_syscall" 1687 + version = "0.5.8" 1688 + source = "registry+https://github.com/rust-lang/crates.io-index" 1689 + checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" 1690 + dependencies = [ 1691 + "bitflags", 1692 + ] 1693 + 1694 + [[package]] 1695 + name = "regex" 1696 + version = "1.11.1" 1697 + source = "registry+https://github.com/rust-lang/crates.io-index" 1698 + checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1699 + dependencies = [ 1700 + "aho-corasick", 1701 + "memchr", 1702 + "regex-automata", 1703 + "regex-syntax", 1704 + ] 1705 + 1706 + [[package]] 1707 + name = "regex-automata" 1708 + version = "0.4.9" 1709 + source = "registry+https://github.com/rust-lang/crates.io-index" 1710 + checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1711 + dependencies = [ 1712 + "aho-corasick", 1713 + "memchr", 1714 + "regex-syntax", 1715 + ] 1716 + 1717 + [[package]] 1718 + name = "regex-lite" 1719 + version = "0.1.6" 1720 + source = "registry+https://github.com/rust-lang/crates.io-index" 1721 + checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" 1722 + 1723 + [[package]] 1724 + name = "regex-syntax" 1725 + version = "0.8.5" 1726 + source = "registry+https://github.com/rust-lang/crates.io-index" 1727 + checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1728 + 1729 + [[package]] 1730 + name = "rsa" 1731 + version = "0.9.7" 1732 + source = "registry+https://github.com/rust-lang/crates.io-index" 1733 + checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" 1734 + dependencies = [ 1735 + "const-oid", 1736 + "digest", 1737 + "num-bigint-dig", 1738 + "num-integer", 1739 + "num-traits", 1740 + "pkcs1", 1741 + "pkcs8", 1742 + "rand_core", 1743 + "signature", 1744 + "spki", 1745 + "subtle", 1746 + "zeroize", 1747 + ] 1748 + 1749 + [[package]] 1750 + name = "rustc-demangle" 1751 + version = "0.1.24" 1752 + source = "registry+https://github.com/rust-lang/crates.io-index" 1753 + checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1754 + 1755 + [[package]] 1756 + name = "rustc_version" 1757 + version = "0.4.1" 1758 + source = "registry+https://github.com/rust-lang/crates.io-index" 1759 + checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 1760 + dependencies = [ 1761 + "semver", 1762 + ] 1763 + 1764 + [[package]] 1765 + name = "rustix" 1766 + version = "0.38.44" 1767 + source = "registry+https://github.com/rust-lang/crates.io-index" 1768 + checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 1769 + dependencies = [ 1770 + "bitflags", 1771 + "errno", 1772 + "libc", 1773 + "linux-raw-sys", 1774 + "windows-sys 0.59.0", 1775 + ] 1776 + 1777 + [[package]] 1778 + name = "rustversion" 1779 + version = "1.0.19" 1780 + source = "registry+https://github.com/rust-lang/crates.io-index" 1781 + checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" 1782 + 1783 + [[package]] 1784 + name = "ryu" 1785 + version = "1.0.18" 1786 + source = "registry+https://github.com/rust-lang/crates.io-index" 1787 + checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 1788 + 1789 + [[package]] 1790 + name = "schannel" 1791 + version = "0.1.27" 1792 + source = "registry+https://github.com/rust-lang/crates.io-index" 1793 + checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 1794 + dependencies = [ 1795 + "windows-sys 0.59.0", 1796 + ] 1797 + 1798 + [[package]] 1799 + name = "scopeguard" 1800 + version = "1.2.0" 1801 + source = "registry+https://github.com/rust-lang/crates.io-index" 1802 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1803 + 1804 + [[package]] 1805 + name = "security-framework" 1806 + version = "2.11.1" 1807 + source = "registry+https://github.com/rust-lang/crates.io-index" 1808 + checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1809 + dependencies = [ 1810 + "bitflags", 1811 + "core-foundation", 1812 + "core-foundation-sys", 1813 + "libc", 1814 + "security-framework-sys", 1815 + ] 1816 + 1817 + [[package]] 1818 + name = "security-framework-sys" 1819 + version = "2.14.0" 1820 + source = "registry+https://github.com/rust-lang/crates.io-index" 1821 + checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 1822 + dependencies = [ 1823 + "core-foundation-sys", 1824 + "libc", 1825 + ] 1826 + 1827 + [[package]] 1828 + name = "semver" 1829 + version = "1.0.25" 1830 + source = "registry+https://github.com/rust-lang/crates.io-index" 1831 + checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" 1832 + 1833 + [[package]] 1834 + name = "serde" 1835 + version = "1.0.217" 1836 + source = "registry+https://github.com/rust-lang/crates.io-index" 1837 + checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 1838 + dependencies = [ 1839 + "serde_derive", 1840 + ] 1841 + 1842 + [[package]] 1843 + name = "serde_derive" 1844 + version = "1.0.217" 1845 + source = "registry+https://github.com/rust-lang/crates.io-index" 1846 + checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 1847 + dependencies = [ 1848 + "proc-macro2", 1849 + "quote", 1850 + "syn 2.0.96", 1851 + ] 1852 + 1853 + [[package]] 1854 + name = "serde_json" 1855 + version = "1.0.137" 1856 + source = "registry+https://github.com/rust-lang/crates.io-index" 1857 + checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" 1858 + dependencies = [ 1859 + "itoa", 1860 + "memchr", 1861 + "ryu", 1862 + "serde", 1863 + ] 1864 + 1865 + [[package]] 1866 + name = "serde_urlencoded" 1867 + version = "0.7.1" 1868 + source = "registry+https://github.com/rust-lang/crates.io-index" 1869 + checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1870 + dependencies = [ 1871 + "form_urlencoded", 1872 + "itoa", 1873 + "ryu", 1874 + "serde", 1875 + ] 1876 + 1877 + [[package]] 1878 + name = "sha1" 1879 + version = "0.10.6" 1880 + source = "registry+https://github.com/rust-lang/crates.io-index" 1881 + checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1882 + dependencies = [ 1883 + "cfg-if", 1884 + "cpufeatures", 1885 + "digest", 1886 + ] 1887 + 1888 + [[package]] 1889 + name = "sha2" 1890 + version = "0.10.8" 1891 + source = "registry+https://github.com/rust-lang/crates.io-index" 1892 + checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1893 + dependencies = [ 1894 + "cfg-if", 1895 + "cpufeatures", 1896 + "digest", 1897 + ] 1898 + 1899 + [[package]] 1900 + name = "sharded-slab" 1901 + version = "0.1.7" 1902 + source = "registry+https://github.com/rust-lang/crates.io-index" 1903 + checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1904 + dependencies = [ 1905 + "lazy_static", 1906 + ] 1907 + 1908 + [[package]] 1909 + name = "shlex" 1910 + version = "1.3.0" 1911 + source = "registry+https://github.com/rust-lang/crates.io-index" 1912 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1913 + 1914 + [[package]] 1915 + name = "signal-hook-registry" 1916 + version = "1.4.2" 1917 + source = "registry+https://github.com/rust-lang/crates.io-index" 1918 + checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 1919 + dependencies = [ 1920 + "libc", 1921 + ] 1922 + 1923 + [[package]] 1924 + name = "signature" 1925 + version = "2.2.0" 1926 + source = "registry+https://github.com/rust-lang/crates.io-index" 1927 + checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 1928 + dependencies = [ 1929 + "digest", 1930 + "rand_core", 1931 + ] 1932 + 1933 + [[package]] 1934 + name = "slab" 1935 + version = "0.4.9" 1936 + source = "registry+https://github.com/rust-lang/crates.io-index" 1937 + checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1938 + dependencies = [ 1939 + "autocfg", 1940 + ] 1941 + 1942 + [[package]] 1943 + name = "smallvec" 1944 + version = "1.13.2" 1945 + source = "registry+https://github.com/rust-lang/crates.io-index" 1946 + checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1947 + 1948 + [[package]] 1949 + name = "socket2" 1950 + version = "0.5.8" 1951 + source = "registry+https://github.com/rust-lang/crates.io-index" 1952 + checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" 1953 + dependencies = [ 1954 + "libc", 1955 + "windows-sys 0.52.0", 1956 + ] 1957 + 1958 + [[package]] 1959 + name = "spin" 1960 + version = "0.9.8" 1961 + source = "registry+https://github.com/rust-lang/crates.io-index" 1962 + checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1963 + dependencies = [ 1964 + "lock_api", 1965 + ] 1966 + 1967 + [[package]] 1968 + name = "spki" 1969 + version = "0.7.3" 1970 + source = "registry+https://github.com/rust-lang/crates.io-index" 1971 + checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 1972 + dependencies = [ 1973 + "base64ct", 1974 + "der", 1975 + ] 1976 + 1977 + [[package]] 1978 + name = "sqlformat" 1979 + version = "0.2.6" 1980 + source = "registry+https://github.com/rust-lang/crates.io-index" 1981 + checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" 1982 + dependencies = [ 1983 + "nom", 1984 + "unicode_categories", 1985 + ] 1986 + 1987 + [[package]] 1988 + name = "sqlx" 1989 + version = "0.7.4" 1990 + source = "registry+https://github.com/rust-lang/crates.io-index" 1991 + checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" 1992 + dependencies = [ 1993 + "sqlx-core", 1994 + "sqlx-macros", 1995 + "sqlx-mysql", 1996 + "sqlx-postgres", 1997 + "sqlx-sqlite", 1998 + ] 1999 + 2000 + [[package]] 2001 + name = "sqlx-core" 2002 + version = "0.7.4" 2003 + source = "registry+https://github.com/rust-lang/crates.io-index" 2004 + checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" 2005 + dependencies = [ 2006 + "ahash", 2007 + "atoi", 2008 + "byteorder", 2009 + "bytes", 2010 + "chrono", 2011 + "crc", 2012 + "crossbeam-queue", 2013 + "either", 2014 + "event-listener", 2015 + "futures-channel", 2016 + "futures-core", 2017 + "futures-intrusive", 2018 + "futures-io", 2019 + "futures-util", 2020 + "hashlink", 2021 + "hex", 2022 + "indexmap", 2023 + "log", 2024 + "memchr", 2025 + "native-tls", 2026 + "once_cell", 2027 + "paste", 2028 + "percent-encoding", 2029 + "serde", 2030 + "serde_json", 2031 + "sha2", 2032 + "smallvec", 2033 + "sqlformat", 2034 + "thiserror", 2035 + "tokio", 2036 + "tokio-stream", 2037 + "tracing", 2038 + "url", 2039 + "uuid", 2040 + ] 2041 + 2042 + [[package]] 2043 + name = "sqlx-macros" 2044 + version = "0.7.4" 2045 + source = "registry+https://github.com/rust-lang/crates.io-index" 2046 + checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" 2047 + dependencies = [ 2048 + "proc-macro2", 2049 + "quote", 2050 + "sqlx-core", 2051 + "sqlx-macros-core", 2052 + "syn 1.0.109", 2053 + ] 2054 + 2055 + [[package]] 2056 + name = "sqlx-macros-core" 2057 + version = "0.7.4" 2058 + source = "registry+https://github.com/rust-lang/crates.io-index" 2059 + checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" 2060 + dependencies = [ 2061 + "dotenvy", 2062 + "either", 2063 + "heck 0.4.1", 2064 + "hex", 2065 + "once_cell", 2066 + "proc-macro2", 2067 + "quote", 2068 + "serde", 2069 + "serde_json", 2070 + "sha2", 2071 + "sqlx-core", 2072 + "sqlx-mysql", 2073 + "sqlx-postgres", 2074 + "sqlx-sqlite", 2075 + "syn 1.0.109", 2076 + "tempfile", 2077 + "tokio", 2078 + "url", 2079 + ] 2080 + 2081 + [[package]] 2082 + name = "sqlx-mysql" 2083 + version = "0.7.4" 2084 + source = "registry+https://github.com/rust-lang/crates.io-index" 2085 + checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" 2086 + dependencies = [ 2087 + "atoi", 2088 + "base64 0.21.7", 2089 + "bitflags", 2090 + "byteorder", 2091 + "bytes", 2092 + "chrono", 2093 + "crc", 2094 + "digest", 2095 + "dotenvy", 2096 + "either", 2097 + "futures-channel", 2098 + "futures-core", 2099 + "futures-io", 2100 + "futures-util", 2101 + "generic-array", 2102 + "hex", 2103 + "hkdf", 2104 + "hmac", 2105 + "itoa", 2106 + "log", 2107 + "md-5", 2108 + "memchr", 2109 + "once_cell", 2110 + "percent-encoding", 2111 + "rand", 2112 + "rsa", 2113 + "serde", 2114 + "sha1", 2115 + "sha2", 2116 + "smallvec", 2117 + "sqlx-core", 2118 + "stringprep", 2119 + "thiserror", 2120 + "tracing", 2121 + "uuid", 2122 + "whoami", 2123 + ] 2124 + 2125 + [[package]] 2126 + name = "sqlx-postgres" 2127 + version = "0.7.4" 2128 + source = "registry+https://github.com/rust-lang/crates.io-index" 2129 + checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" 2130 + dependencies = [ 2131 + "atoi", 2132 + "base64 0.21.7", 2133 + "bitflags", 2134 + "byteorder", 2135 + "chrono", 2136 + "crc", 2137 + "dotenvy", 2138 + "etcetera", 2139 + "futures-channel", 2140 + "futures-core", 2141 + "futures-io", 2142 + "futures-util", 2143 + "hex", 2144 + "hkdf", 2145 + "hmac", 2146 + "home", 2147 + "itoa", 2148 + "log", 2149 + "md-5", 2150 + "memchr", 2151 + "once_cell", 2152 + "rand", 2153 + "serde", 2154 + "serde_json", 2155 + "sha2", 2156 + "smallvec", 2157 + "sqlx-core", 2158 + "stringprep", 2159 + "thiserror", 2160 + "tracing", 2161 + "uuid", 2162 + "whoami", 2163 + ] 2164 + 2165 + [[package]] 2166 + name = "sqlx-sqlite" 2167 + version = "0.7.4" 2168 + source = "registry+https://github.com/rust-lang/crates.io-index" 2169 + checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" 2170 + dependencies = [ 2171 + "atoi", 2172 + "chrono", 2173 + "flume", 2174 + "futures-channel", 2175 + "futures-core", 2176 + "futures-executor", 2177 + "futures-intrusive", 2178 + "futures-util", 2179 + "libsqlite3-sys", 2180 + "log", 2181 + "percent-encoding", 2182 + "serde", 2183 + "sqlx-core", 2184 + "tracing", 2185 + "url", 2186 + "urlencoding", 2187 + "uuid", 2188 + ] 2189 + 2190 + [[package]] 2191 + name = "stable_deref_trait" 2192 + version = "1.2.0" 2193 + source = "registry+https://github.com/rust-lang/crates.io-index" 2194 + checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2195 + 2196 + [[package]] 2197 + name = "stringprep" 2198 + version = "0.1.5" 2199 + source = "registry+https://github.com/rust-lang/crates.io-index" 2200 + checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" 2201 + dependencies = [ 2202 + "unicode-bidi", 2203 + "unicode-normalization", 2204 + "unicode-properties", 2205 + ] 2206 + 2207 + [[package]] 2208 + name = "strsim" 2209 + version = "0.11.1" 2210 + source = "registry+https://github.com/rust-lang/crates.io-index" 2211 + checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 2212 + 2213 + [[package]] 2214 + name = "subtle" 2215 + version = "2.6.1" 2216 + source = "registry+https://github.com/rust-lang/crates.io-index" 2217 + checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 2218 + 2219 + [[package]] 2220 + name = "syn" 2221 + version = "1.0.109" 2222 + source = "registry+https://github.com/rust-lang/crates.io-index" 2223 + checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 2224 + dependencies = [ 2225 + "proc-macro2", 2226 + "quote", 2227 + "unicode-ident", 2228 + ] 2229 + 2230 + [[package]] 2231 + name = "syn" 2232 + version = "2.0.96" 2233 + source = "registry+https://github.com/rust-lang/crates.io-index" 2234 + checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" 2235 + dependencies = [ 2236 + "proc-macro2", 2237 + "quote", 2238 + "unicode-ident", 2239 + ] 2240 + 2241 + [[package]] 2242 + name = "synstructure" 2243 + version = "0.13.1" 2244 + source = "registry+https://github.com/rust-lang/crates.io-index" 2245 + checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 2246 + dependencies = [ 2247 + "proc-macro2", 2248 + "quote", 2249 + "syn 2.0.96", 2250 + ] 2251 + 2252 + [[package]] 2253 + name = "tempfile" 2254 + version = "3.15.0" 2255 + source = "registry+https://github.com/rust-lang/crates.io-index" 2256 + checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" 2257 + dependencies = [ 2258 + "cfg-if", 2259 + "fastrand", 2260 + "getrandom", 2261 + "once_cell", 2262 + "rustix", 2263 + "windows-sys 0.59.0", 2264 + ] 2265 + 2266 + [[package]] 2267 + name = "thiserror" 2268 + version = "1.0.69" 2269 + source = "registry+https://github.com/rust-lang/crates.io-index" 2270 + checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 2271 + dependencies = [ 2272 + "thiserror-impl", 2273 + ] 2274 + 2275 + [[package]] 2276 + name = "thiserror-impl" 2277 + version = "1.0.69" 2278 + source = "registry+https://github.com/rust-lang/crates.io-index" 2279 + checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 2280 + dependencies = [ 2281 + "proc-macro2", 2282 + "quote", 2283 + "syn 2.0.96", 2284 + ] 2285 + 2286 + [[package]] 2287 + name = "thread_local" 2288 + version = "1.1.8" 2289 + source = "registry+https://github.com/rust-lang/crates.io-index" 2290 + checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 2291 + dependencies = [ 2292 + "cfg-if", 2293 + "once_cell", 2294 + ] 2295 + 2296 + [[package]] 2297 + name = "time" 2298 + version = "0.3.37" 2299 + source = "registry+https://github.com/rust-lang/crates.io-index" 2300 + checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" 2301 + dependencies = [ 2302 + "deranged", 2303 + "itoa", 2304 + "num-conv", 2305 + "powerfmt", 2306 + "serde", 2307 + "time-core", 2308 + "time-macros", 2309 + ] 2310 + 2311 + [[package]] 2312 + name = "time-core" 2313 + version = "0.1.2" 2314 + source = "registry+https://github.com/rust-lang/crates.io-index" 2315 + checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 2316 + 2317 + [[package]] 2318 + name = "time-macros" 2319 + version = "0.2.19" 2320 + source = "registry+https://github.com/rust-lang/crates.io-index" 2321 + checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" 2322 + dependencies = [ 2323 + "num-conv", 2324 + "time-core", 2325 + ] 2326 + 2327 + [[package]] 2328 + name = "tinystr" 2329 + version = "0.7.6" 2330 + source = "registry+https://github.com/rust-lang/crates.io-index" 2331 + checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 2332 + dependencies = [ 2333 + "displaydoc", 2334 + "zerovec", 2335 + ] 2336 + 2337 + [[package]] 2338 + name = "tinyvec" 2339 + version = "1.8.1" 2340 + source = "registry+https://github.com/rust-lang/crates.io-index" 2341 + checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" 2342 + dependencies = [ 2343 + "tinyvec_macros", 2344 + ] 2345 + 2346 + [[package]] 2347 + name = "tinyvec_macros" 2348 + version = "0.1.1" 2349 + source = "registry+https://github.com/rust-lang/crates.io-index" 2350 + checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2351 + 2352 + [[package]] 2353 + name = "tokio" 2354 + version = "1.43.0" 2355 + source = "registry+https://github.com/rust-lang/crates.io-index" 2356 + checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" 2357 + dependencies = [ 2358 + "backtrace", 2359 + "bytes", 2360 + "libc", 2361 + "mio", 2362 + "parking_lot", 2363 + "pin-project-lite", 2364 + "signal-hook-registry", 2365 + "socket2", 2366 + "tokio-macros", 2367 + "windows-sys 0.52.0", 2368 + ] 2369 + 2370 + [[package]] 2371 + name = "tokio-macros" 2372 + version = "2.5.0" 2373 + source = "registry+https://github.com/rust-lang/crates.io-index" 2374 + checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 2375 + dependencies = [ 2376 + "proc-macro2", 2377 + "quote", 2378 + "syn 2.0.96", 2379 + ] 2380 + 2381 + [[package]] 2382 + name = "tokio-stream" 2383 + version = "0.1.17" 2384 + source = "registry+https://github.com/rust-lang/crates.io-index" 2385 + checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" 2386 + dependencies = [ 2387 + "futures-core", 2388 + "pin-project-lite", 2389 + "tokio", 2390 + ] 2391 + 2392 + [[package]] 2393 + name = "tokio-util" 2394 + version = "0.7.13" 2395 + source = "registry+https://github.com/rust-lang/crates.io-index" 2396 + checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" 2397 + dependencies = [ 2398 + "bytes", 2399 + "futures-core", 2400 + "futures-sink", 2401 + "pin-project-lite", 2402 + "tokio", 2403 + ] 2404 + 2405 + [[package]] 2406 + name = "tracing" 2407 + version = "0.1.41" 2408 + source = "registry+https://github.com/rust-lang/crates.io-index" 2409 + checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 2410 + dependencies = [ 2411 + "log", 2412 + "pin-project-lite", 2413 + "tracing-attributes", 2414 + "tracing-core", 2415 + ] 2416 + 2417 + [[package]] 2418 + name = "tracing-attributes" 2419 + version = "0.1.28" 2420 + source = "registry+https://github.com/rust-lang/crates.io-index" 2421 + checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 2422 + dependencies = [ 2423 + "proc-macro2", 2424 + "quote", 2425 + "syn 2.0.96", 2426 + ] 2427 + 2428 + [[package]] 2429 + name = "tracing-core" 2430 + version = "0.1.33" 2431 + source = "registry+https://github.com/rust-lang/crates.io-index" 2432 + checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 2433 + dependencies = [ 2434 + "once_cell", 2435 + "valuable", 2436 + ] 2437 + 2438 + [[package]] 2439 + name = "tracing-log" 2440 + version = "0.2.0" 2441 + source = "registry+https://github.com/rust-lang/crates.io-index" 2442 + checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 2443 + dependencies = [ 2444 + "log", 2445 + "once_cell", 2446 + "tracing-core", 2447 + ] 2448 + 2449 + [[package]] 2450 + name = "tracing-subscriber" 2451 + version = "0.3.19" 2452 + source = "registry+https://github.com/rust-lang/crates.io-index" 2453 + checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 2454 + dependencies = [ 2455 + "nu-ansi-term", 2456 + "sharded-slab", 2457 + "smallvec", 2458 + "thread_local", 2459 + "tracing-core", 2460 + "tracing-log", 2461 + ] 2462 + 2463 + [[package]] 2464 + name = "typenum" 2465 + version = "1.17.0" 2466 + source = "registry+https://github.com/rust-lang/crates.io-index" 2467 + checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 2468 + 2469 + [[package]] 2470 + name = "unicode-bidi" 2471 + version = "0.3.18" 2472 + source = "registry+https://github.com/rust-lang/crates.io-index" 2473 + checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 2474 + 2475 + [[package]] 2476 + name = "unicode-ident" 2477 + version = "1.0.15" 2478 + source = "registry+https://github.com/rust-lang/crates.io-index" 2479 + checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243" 2480 + 2481 + [[package]] 2482 + name = "unicode-normalization" 2483 + version = "0.1.24" 2484 + source = "registry+https://github.com/rust-lang/crates.io-index" 2485 + checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 2486 + dependencies = [ 2487 + "tinyvec", 2488 + ] 2489 + 2490 + [[package]] 2491 + name = "unicode-properties" 2492 + version = "0.1.3" 2493 + source = "registry+https://github.com/rust-lang/crates.io-index" 2494 + checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 2495 + 2496 + [[package]] 2497 + name = "unicode-segmentation" 2498 + version = "1.12.0" 2499 + source = "registry+https://github.com/rust-lang/crates.io-index" 2500 + checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 2501 + 2502 + [[package]] 2503 + name = "unicode_categories" 2504 + version = "0.1.1" 2505 + source = "registry+https://github.com/rust-lang/crates.io-index" 2506 + checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" 2507 + 2508 + [[package]] 2509 + name = "url" 2510 + version = "2.5.4" 2511 + source = "registry+https://github.com/rust-lang/crates.io-index" 2512 + checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 2513 + dependencies = [ 2514 + "form_urlencoded", 2515 + "idna", 2516 + "percent-encoding", 2517 + ] 2518 + 2519 + [[package]] 2520 + name = "urlencoding" 2521 + version = "2.1.3" 2522 + source = "registry+https://github.com/rust-lang/crates.io-index" 2523 + checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" 2524 + 2525 + [[package]] 2526 + name = "utf16_iter" 2527 + version = "1.0.5" 2528 + source = "registry+https://github.com/rust-lang/crates.io-index" 2529 + checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 2530 + 2531 + [[package]] 2532 + name = "utf8_iter" 2533 + version = "1.0.4" 2534 + source = "registry+https://github.com/rust-lang/crates.io-index" 2535 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2536 + 2537 + [[package]] 2538 + name = "utf8parse" 2539 + version = "0.2.2" 2540 + source = "registry+https://github.com/rust-lang/crates.io-index" 2541 + checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 2542 + 2543 + [[package]] 2544 + name = "uuid" 2545 + version = "1.12.1" 2546 + source = "registry+https://github.com/rust-lang/crates.io-index" 2547 + checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" 2548 + dependencies = [ 2549 + "getrandom", 2550 + "serde", 2551 + ] 2552 + 2553 + [[package]] 2554 + name = "valuable" 2555 + version = "0.1.1" 2556 + source = "registry+https://github.com/rust-lang/crates.io-index" 2557 + checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 2558 + 2559 + [[package]] 2560 + name = "vcpkg" 2561 + version = "0.2.15" 2562 + source = "registry+https://github.com/rust-lang/crates.io-index" 2563 + checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2564 + 2565 + [[package]] 2566 + name = "version_check" 2567 + version = "0.9.5" 2568 + source = "registry+https://github.com/rust-lang/crates.io-index" 2569 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2570 + 2571 + [[package]] 2572 + name = "wasi" 2573 + version = "0.11.0+wasi-snapshot-preview1" 2574 + source = "registry+https://github.com/rust-lang/crates.io-index" 2575 + checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2576 + 2577 + [[package]] 2578 + name = "wasite" 2579 + version = "0.1.0" 2580 + source = "registry+https://github.com/rust-lang/crates.io-index" 2581 + checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" 2582 + 2583 + [[package]] 2584 + name = "wasm-bindgen" 2585 + version = "0.2.100" 2586 + source = "registry+https://github.com/rust-lang/crates.io-index" 2587 + checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 2588 + dependencies = [ 2589 + "cfg-if", 2590 + "once_cell", 2591 + "rustversion", 2592 + "wasm-bindgen-macro", 2593 + ] 2594 + 2595 + [[package]] 2596 + name = "wasm-bindgen-backend" 2597 + version = "0.2.100" 2598 + source = "registry+https://github.com/rust-lang/crates.io-index" 2599 + checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 2600 + dependencies = [ 2601 + "bumpalo", 2602 + "log", 2603 + "proc-macro2", 2604 + "quote", 2605 + "syn 2.0.96", 2606 + "wasm-bindgen-shared", 2607 + ] 2608 + 2609 + [[package]] 2610 + name = "wasm-bindgen-macro" 2611 + version = "0.2.100" 2612 + source = "registry+https://github.com/rust-lang/crates.io-index" 2613 + checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 2614 + dependencies = [ 2615 + "quote", 2616 + "wasm-bindgen-macro-support", 2617 + ] 2618 + 2619 + [[package]] 2620 + name = "wasm-bindgen-macro-support" 2621 + version = "0.2.100" 2622 + source = "registry+https://github.com/rust-lang/crates.io-index" 2623 + checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 2624 + dependencies = [ 2625 + "proc-macro2", 2626 + "quote", 2627 + "syn 2.0.96", 2628 + "wasm-bindgen-backend", 2629 + "wasm-bindgen-shared", 2630 + ] 2631 + 2632 + [[package]] 2633 + name = "wasm-bindgen-shared" 2634 + version = "0.2.100" 2635 + source = "registry+https://github.com/rust-lang/crates.io-index" 2636 + checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 2637 + dependencies = [ 2638 + "unicode-ident", 2639 + ] 2640 + 2641 + [[package]] 2642 + name = "whoami" 2643 + version = "1.5.2" 2644 + source = "registry+https://github.com/rust-lang/crates.io-index" 2645 + checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" 2646 + dependencies = [ 2647 + "redox_syscall", 2648 + "wasite", 2649 + ] 2650 + 2651 + [[package]] 2652 + name = "winapi" 2653 + version = "0.3.9" 2654 + source = "registry+https://github.com/rust-lang/crates.io-index" 2655 + checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2656 + dependencies = [ 2657 + "winapi-i686-pc-windows-gnu", 2658 + "winapi-x86_64-pc-windows-gnu", 2659 + ] 2660 + 2661 + [[package]] 2662 + name = "winapi-i686-pc-windows-gnu" 2663 + version = "0.4.0" 2664 + source = "registry+https://github.com/rust-lang/crates.io-index" 2665 + checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2666 + 2667 + [[package]] 2668 + name = "winapi-x86_64-pc-windows-gnu" 2669 + version = "0.4.0" 2670 + source = "registry+https://github.com/rust-lang/crates.io-index" 2671 + checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2672 + 2673 + [[package]] 2674 + name = "windows-core" 2675 + version = "0.52.0" 2676 + source = "registry+https://github.com/rust-lang/crates.io-index" 2677 + checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 2678 + dependencies = [ 2679 + "windows-targets 0.52.6", 2680 + ] 2681 + 2682 + [[package]] 2683 + name = "windows-sys" 2684 + version = "0.48.0" 2685 + source = "registry+https://github.com/rust-lang/crates.io-index" 2686 + checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2687 + dependencies = [ 2688 + "windows-targets 0.48.5", 2689 + ] 2690 + 2691 + [[package]] 2692 + name = "windows-sys" 2693 + version = "0.52.0" 2694 + source = "registry+https://github.com/rust-lang/crates.io-index" 2695 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2696 + dependencies = [ 2697 + "windows-targets 0.52.6", 2698 + ] 2699 + 2700 + [[package]] 2701 + name = "windows-sys" 2702 + version = "0.59.0" 2703 + source = "registry+https://github.com/rust-lang/crates.io-index" 2704 + checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2705 + dependencies = [ 2706 + "windows-targets 0.52.6", 2707 + ] 2708 + 2709 + [[package]] 2710 + name = "windows-targets" 2711 + version = "0.48.5" 2712 + source = "registry+https://github.com/rust-lang/crates.io-index" 2713 + checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2714 + dependencies = [ 2715 + "windows_aarch64_gnullvm 0.48.5", 2716 + "windows_aarch64_msvc 0.48.5", 2717 + "windows_i686_gnu 0.48.5", 2718 + "windows_i686_msvc 0.48.5", 2719 + "windows_x86_64_gnu 0.48.5", 2720 + "windows_x86_64_gnullvm 0.48.5", 2721 + "windows_x86_64_msvc 0.48.5", 2722 + ] 2723 + 2724 + [[package]] 2725 + name = "windows-targets" 2726 + version = "0.52.6" 2727 + source = "registry+https://github.com/rust-lang/crates.io-index" 2728 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2729 + dependencies = [ 2730 + "windows_aarch64_gnullvm 0.52.6", 2731 + "windows_aarch64_msvc 0.52.6", 2732 + "windows_i686_gnu 0.52.6", 2733 + "windows_i686_gnullvm", 2734 + "windows_i686_msvc 0.52.6", 2735 + "windows_x86_64_gnu 0.52.6", 2736 + "windows_x86_64_gnullvm 0.52.6", 2737 + "windows_x86_64_msvc 0.52.6", 2738 + ] 2739 + 2740 + [[package]] 2741 + name = "windows_aarch64_gnullvm" 2742 + version = "0.48.5" 2743 + source = "registry+https://github.com/rust-lang/crates.io-index" 2744 + checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2745 + 2746 + [[package]] 2747 + name = "windows_aarch64_gnullvm" 2748 + version = "0.52.6" 2749 + source = "registry+https://github.com/rust-lang/crates.io-index" 2750 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2751 + 2752 + [[package]] 2753 + name = "windows_aarch64_msvc" 2754 + version = "0.48.5" 2755 + source = "registry+https://github.com/rust-lang/crates.io-index" 2756 + checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2757 + 2758 + [[package]] 2759 + name = "windows_aarch64_msvc" 2760 + version = "0.52.6" 2761 + source = "registry+https://github.com/rust-lang/crates.io-index" 2762 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2763 + 2764 + [[package]] 2765 + name = "windows_i686_gnu" 2766 + version = "0.48.5" 2767 + source = "registry+https://github.com/rust-lang/crates.io-index" 2768 + checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2769 + 2770 + [[package]] 2771 + name = "windows_i686_gnu" 2772 + version = "0.52.6" 2773 + source = "registry+https://github.com/rust-lang/crates.io-index" 2774 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2775 + 2776 + [[package]] 2777 + name = "windows_i686_gnullvm" 2778 + version = "0.52.6" 2779 + source = "registry+https://github.com/rust-lang/crates.io-index" 2780 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2781 + 2782 + [[package]] 2783 + name = "windows_i686_msvc" 2784 + version = "0.48.5" 2785 + source = "registry+https://github.com/rust-lang/crates.io-index" 2786 + checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2787 + 2788 + [[package]] 2789 + name = "windows_i686_msvc" 2790 + version = "0.52.6" 2791 + source = "registry+https://github.com/rust-lang/crates.io-index" 2792 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2793 + 2794 + [[package]] 2795 + name = "windows_x86_64_gnu" 2796 + version = "0.48.5" 2797 + source = "registry+https://github.com/rust-lang/crates.io-index" 2798 + checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2799 + 2800 + [[package]] 2801 + name = "windows_x86_64_gnu" 2802 + version = "0.52.6" 2803 + source = "registry+https://github.com/rust-lang/crates.io-index" 2804 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2805 + 2806 + [[package]] 2807 + name = "windows_x86_64_gnullvm" 2808 + version = "0.48.5" 2809 + source = "registry+https://github.com/rust-lang/crates.io-index" 2810 + checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2811 + 2812 + [[package]] 2813 + name = "windows_x86_64_gnullvm" 2814 + version = "0.52.6" 2815 + source = "registry+https://github.com/rust-lang/crates.io-index" 2816 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2817 + 2818 + [[package]] 2819 + name = "windows_x86_64_msvc" 2820 + version = "0.48.5" 2821 + source = "registry+https://github.com/rust-lang/crates.io-index" 2822 + checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2823 + 2824 + [[package]] 2825 + name = "windows_x86_64_msvc" 2826 + version = "0.52.6" 2827 + source = "registry+https://github.com/rust-lang/crates.io-index" 2828 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2829 + 2830 + [[package]] 2831 + name = "write16" 2832 + version = "1.0.0" 2833 + source = "registry+https://github.com/rust-lang/crates.io-index" 2834 + checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 2835 + 2836 + [[package]] 2837 + name = "writeable" 2838 + version = "0.5.5" 2839 + source = "registry+https://github.com/rust-lang/crates.io-index" 2840 + checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 2841 + 2842 + [[package]] 2843 + name = "yoke" 2844 + version = "0.7.5" 2845 + source = "registry+https://github.com/rust-lang/crates.io-index" 2846 + checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 2847 + dependencies = [ 2848 + "serde", 2849 + "stable_deref_trait", 2850 + "yoke-derive", 2851 + "zerofrom", 2852 + ] 2853 + 2854 + [[package]] 2855 + name = "yoke-derive" 2856 + version = "0.7.5" 2857 + source = "registry+https://github.com/rust-lang/crates.io-index" 2858 + checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 2859 + dependencies = [ 2860 + "proc-macro2", 2861 + "quote", 2862 + "syn 2.0.96", 2863 + "synstructure", 2864 + ] 2865 + 2866 + [[package]] 2867 + name = "zerocopy" 2868 + version = "0.7.35" 2869 + source = "registry+https://github.com/rust-lang/crates.io-index" 2870 + checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 2871 + dependencies = [ 2872 + "byteorder", 2873 + "zerocopy-derive", 2874 + ] 2875 + 2876 + [[package]] 2877 + name = "zerocopy-derive" 2878 + version = "0.7.35" 2879 + source = "registry+https://github.com/rust-lang/crates.io-index" 2880 + checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 2881 + dependencies = [ 2882 + "proc-macro2", 2883 + "quote", 2884 + "syn 2.0.96", 2885 + ] 2886 + 2887 + [[package]] 2888 + name = "zerofrom" 2889 + version = "0.1.5" 2890 + source = "registry+https://github.com/rust-lang/crates.io-index" 2891 + checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" 2892 + dependencies = [ 2893 + "zerofrom-derive", 2894 + ] 2895 + 2896 + [[package]] 2897 + name = "zerofrom-derive" 2898 + version = "0.1.5" 2899 + source = "registry+https://github.com/rust-lang/crates.io-index" 2900 + checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" 2901 + dependencies = [ 2902 + "proc-macro2", 2903 + "quote", 2904 + "syn 2.0.96", 2905 + "synstructure", 2906 + ] 2907 + 2908 + [[package]] 2909 + name = "zeroize" 2910 + version = "1.8.1" 2911 + source = "registry+https://github.com/rust-lang/crates.io-index" 2912 + checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 2913 + 2914 + [[package]] 2915 + name = "zerovec" 2916 + version = "0.10.4" 2917 + source = "registry+https://github.com/rust-lang/crates.io-index" 2918 + checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 2919 + dependencies = [ 2920 + "yoke", 2921 + "zerofrom", 2922 + "zerovec-derive", 2923 + ] 2924 + 2925 + [[package]] 2926 + name = "zerovec-derive" 2927 + version = "0.10.3" 2928 + source = "registry+https://github.com/rust-lang/crates.io-index" 2929 + checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 2930 + dependencies = [ 2931 + "proc-macro2", 2932 + "quote", 2933 + "syn 2.0.96", 2934 + ] 2935 + 2936 + [[package]] 2937 + name = "zstd" 2938 + version = "0.13.2" 2939 + source = "registry+https://github.com/rust-lang/crates.io-index" 2940 + checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" 2941 + dependencies = [ 2942 + "zstd-safe", 2943 + ] 2944 + 2945 + [[package]] 2946 + name = "zstd-safe" 2947 + version = "7.2.1" 2948 + source = "registry+https://github.com/rust-lang/crates.io-index" 2949 + checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" 2950 + dependencies = [ 2951 + "zstd-sys", 2952 + ] 2953 + 2954 + [[package]] 2955 + name = "zstd-sys" 2956 + version = "2.0.13+zstd.1.5.6" 2957 + source = "registry+https://github.com/rust-lang/crates.io-index" 2958 + checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" 2959 + dependencies = [ 2960 + "cc", 2961 + "pkg-config", 2962 + ]
+23
Cargo.toml
···
··· 1 + [package] 2 + name = "SimpleLink" 3 + version = "0.1.0" 4 + edition = "2021" 5 + 6 + [dependencies] 7 + actix-web = "4.4" 8 + actix-cors = "0.6" 9 + tokio = { version = "1.36", features = ["full"] } 10 + sqlx = { version = "0.7", features = ["runtime-tokio-native-tls", "postgres", "uuid", "chrono"] } 11 + serde = { version = "1.0", features = ["derive"] } 12 + serde_json = "1.0" 13 + anyhow = "1.0" 14 + thiserror = "1.0" 15 + tracing = "0.1" 16 + tracing-subscriber = "0.3" 17 + uuid = { version = "1.7", features = ["v4", "serde"] } 18 + base62 = "2.0" 19 + clap = { version = "4.5", features = ["derive"] } 20 + dotenv = "0.15" 21 + chrono = { version = "0.4", features = ["serde"] } 22 + regex = "1.10" 23 + lazy_static = "1.4"
+22
docker-compose.yml
···
··· 1 + version: '3.8' 2 + services: 3 + db: 4 + image: postgres:15-alpine 5 + container_name: shortener-db 6 + environment: 7 + POSTGRES_DB: shortener 8 + POSTGRES_USER: shortener 9 + POSTGRES_PASSWORD: shortener123 10 + ports: 11 + - "5432:5432" 12 + volumes: 13 + - shortener-data:/var/lib/postgresql/data 14 + healthcheck: 15 + test: ["CMD-SHELL", "pg_isready -U shortener"] 16 + interval: 5s 17 + timeout: 5s 18 + retries: 5 19 + 20 + volumes: 21 + shortener-data: 22 +
+24
frontend/.gitignore
···
··· 1 + # Logs 2 + logs 3 + *.log 4 + npm-debug.log* 5 + yarn-debug.log* 6 + yarn-error.log* 7 + pnpm-debug.log* 8 + lerna-debug.log* 9 + 10 + node_modules 11 + dist 12 + dist-ssr 13 + *.local 14 + 15 + # Editor directories and files 16 + .vscode/* 17 + !.vscode/extensions.json 18 + .idea 19 + .DS_Store 20 + *.suo 21 + *.ntvs* 22 + *.njsproj 23 + *.sln 24 + *.sw?
+50
frontend/README.md
···
··· 1 + # React + TypeScript + Vite 2 + 3 + This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. 4 + 5 + Currently, two official plugins are available: 6 + 7 + - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh 8 + - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh 9 + 10 + ## Expanding the ESLint configuration 11 + 12 + If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: 13 + 14 + - Configure the top-level `parserOptions` property like this: 15 + 16 + ```js 17 + export default tseslint.config({ 18 + languageOptions: { 19 + // other options... 20 + parserOptions: { 21 + project: ['./tsconfig.node.json', './tsconfig.app.json'], 22 + tsconfigRootDir: import.meta.dirname, 23 + }, 24 + }, 25 + }) 26 + ``` 27 + 28 + - Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` 29 + - Optionally add `...tseslint.configs.stylisticTypeChecked` 30 + - Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: 31 + 32 + ```js 33 + // eslint.config.js 34 + import react from 'eslint-plugin-react' 35 + 36 + export default tseslint.config({ 37 + // Set the react version 38 + settings: { react: { version: '18.3' } }, 39 + plugins: { 40 + // Add the react plugin 41 + react, 42 + }, 43 + rules: { 44 + // other rules... 45 + // Enable its recommended rules 46 + ...react.configs.recommended.rules, 47 + ...react.configs['jsx-runtime'].rules, 48 + }, 49 + }) 50 + ```
+622
frontend/bun.lock
···
··· 1 + { 2 + "lockfileVersion": 1, 3 + "workspaces": { 4 + "": { 5 + "name": "frontend", 6 + "dependencies": { 7 + "@emotion/react": "^11.14.0", 8 + "@mantine/core": "^7.16.1", 9 + "@mantine/form": "^7.16.1", 10 + "@mantine/hooks": "^7.16.1", 11 + "axios": "^1.7.9", 12 + "react": "^18.3.1", 13 + "react-dom": "^18.3.1", 14 + }, 15 + "devDependencies": { 16 + "@eslint/js": "^9.17.0", 17 + "@types/node": "^22.10.10", 18 + "@types/react": "^18.3.18", 19 + "@types/react-dom": "^18.3.5", 20 + "@vitejs/plugin-react": "^4.3.4", 21 + "eslint": "^9.17.0", 22 + "eslint-plugin-react-hooks": "^5.0.0", 23 + "eslint-plugin-react-refresh": "^0.4.16", 24 + "globals": "^15.14.0", 25 + "typescript": "~5.6.2", 26 + "typescript-eslint": "^8.18.2", 27 + "vite": "^6.0.5", 28 + }, 29 + }, 30 + }, 31 + "packages": { 32 + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], 33 + 34 + "@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], 35 + 36 + "@babel/compat-data": ["@babel/compat-data@7.26.5", "", {}, "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg=="], 37 + 38 + "@babel/core": ["@babel/core@7.26.7", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.7", "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", "@babel/traverse": "^7.26.7", "@babel/types": "^7.26.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA=="], 39 + 40 + "@babel/generator": ["@babel/generator@7.26.5", "", { "dependencies": { "@babel/parser": "^7.26.5", "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw=="], 41 + 42 + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.26.5", "", { "dependencies": { "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA=="], 43 + 44 + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw=="], 45 + 46 + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.26.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw=="], 47 + 48 + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.26.5", "", {}, "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg=="], 49 + 50 + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.25.9", "", {}, "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="], 51 + 52 + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], 53 + 54 + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.25.9", "", {}, "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw=="], 55 + 56 + "@babel/helpers": ["@babel/helpers@7.26.7", "", { "dependencies": { "@babel/template": "^7.25.9", "@babel/types": "^7.26.7" } }, "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A=="], 57 + 58 + "@babel/parser": ["@babel/parser@7.26.7", "", { "dependencies": { "@babel/types": "^7.26.7" }, "bin": "./bin/babel-parser.js" }, "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w=="], 59 + 60 + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg=="], 61 + 62 + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg=="], 63 + 64 + "@babel/runtime": ["@babel/runtime@7.26.7", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ=="], 65 + 66 + "@babel/template": ["@babel/template@7.25.9", "", { "dependencies": { "@babel/code-frame": "^7.25.9", "@babel/parser": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg=="], 67 + 68 + "@babel/traverse": ["@babel/traverse@7.26.7", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA=="], 69 + 70 + "@babel/types": ["@babel/types@7.26.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg=="], 71 + 72 + "@emotion/babel-plugin": ["@emotion/babel-plugin@11.13.5", "", { "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", "stylis": "4.2.0" } }, "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ=="], 73 + 74 + "@emotion/cache": ["@emotion/cache@11.14.0", "", { "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } }, "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA=="], 75 + 76 + "@emotion/hash": ["@emotion/hash@0.9.2", "", {}, "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g=="], 77 + 78 + "@emotion/memoize": ["@emotion/memoize@0.9.0", "", {}, "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="], 79 + 80 + "@emotion/react": ["@emotion/react@11.14.0", "", { "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", "@emotion/cache": "^11.14.0", "@emotion/serialize": "^1.3.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA=="], 81 + 82 + "@emotion/serialize": ["@emotion/serialize@1.3.3", "", { "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/unitless": "^0.10.0", "@emotion/utils": "^1.4.2", "csstype": "^3.0.2" } }, "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA=="], 83 + 84 + "@emotion/sheet": ["@emotion/sheet@1.4.0", "", {}, "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg=="], 85 + 86 + "@emotion/unitless": ["@emotion/unitless@0.10.0", "", {}, "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg=="], 87 + 88 + "@emotion/use-insertion-effect-with-fallbacks": ["@emotion/use-insertion-effect-with-fallbacks@1.2.0", "", { "peerDependencies": { "react": ">=16.8.0" } }, "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg=="], 89 + 90 + "@emotion/utils": ["@emotion/utils@1.4.2", "", {}, "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA=="], 91 + 92 + "@emotion/weak-memoize": ["@emotion/weak-memoize@0.4.0", "", {}, "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="], 93 + 94 + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="], 95 + 96 + "@esbuild/android-arm": ["@esbuild/android-arm@0.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="], 97 + 98 + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.24.2", "", { "os": "android", "cpu": "arm64" }, "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg=="], 99 + 100 + "@esbuild/android-x64": ["@esbuild/android-x64@0.24.2", "", { "os": "android", "cpu": "x64" }, "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw=="], 101 + 102 + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.24.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA=="], 103 + 104 + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.24.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA=="], 105 + 106 + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.24.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg=="], 107 + 108 + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.24.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q=="], 109 + 110 + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA=="], 111 + 112 + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg=="], 113 + 114 + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.24.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw=="], 115 + 116 + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ=="], 117 + 118 + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw=="], 119 + 120 + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.24.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw=="], 121 + 122 + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q=="], 123 + 124 + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.24.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw=="], 125 + 126 + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q=="], 127 + 128 + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.24.2", "", { "os": "none", "cpu": "arm64" }, "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw=="], 129 + 130 + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.24.2", "", { "os": "none", "cpu": "x64" }, "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw=="], 131 + 132 + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.24.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A=="], 133 + 134 + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.24.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA=="], 135 + 136 + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.24.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig=="], 137 + 138 + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.24.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ=="], 139 + 140 + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.24.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA=="], 141 + 142 + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="], 143 + 144 + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA=="], 145 + 146 + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], 147 + 148 + "@eslint/config-array": ["@eslint/config-array@0.19.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.5", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA=="], 149 + 150 + "@eslint/core": ["@eslint/core@0.10.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw=="], 151 + 152 + "@eslint/eslintrc": ["@eslint/eslintrc@3.2.0", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w=="], 153 + 154 + "@eslint/js": ["@eslint/js@9.19.0", "", {}, "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ=="], 155 + 156 + "@eslint/object-schema": ["@eslint/object-schema@2.1.5", "", {}, "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ=="], 157 + 158 + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.5", "", { "dependencies": { "@eslint/core": "^0.10.0", "levn": "^0.4.1" } }, "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A=="], 159 + 160 + "@floating-ui/core": ["@floating-ui/core@1.6.9", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw=="], 161 + 162 + "@floating-ui/dom": ["@floating-ui/dom@1.6.13", "", { "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.9" } }, "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w=="], 163 + 164 + "@floating-ui/react": ["@floating-ui/react@0.26.28", "", { "dependencies": { "@floating-ui/react-dom": "^2.1.2", "@floating-ui/utils": "^0.2.8", "tabbable": "^6.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw=="], 165 + 166 + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.2", "", { "dependencies": { "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A=="], 167 + 168 + "@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="], 169 + 170 + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], 171 + 172 + "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], 173 + 174 + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], 175 + 176 + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.1", "", {}, "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA=="], 177 + 178 + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], 179 + 180 + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], 181 + 182 + "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], 183 + 184 + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], 185 + 186 + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], 187 + 188 + "@mantine/core": ["@mantine/core@7.16.1", "", { "dependencies": { "@floating-ui/react": "^0.26.28", "clsx": "^2.1.1", "react-number-format": "^5.4.3", "react-remove-scroll": "^2.6.2", "react-textarea-autosize": "8.5.6", "type-fest": "^4.27.0" }, "peerDependencies": { "@mantine/hooks": "7.16.1", "react": "^18.x || ^19.x", "react-dom": "^18.x || ^19.x" } }, "sha512-HYdjCeMU3dUJbc1CrAAedeAASTG5kVyL/qsiuYh5b7BoG0qsRtK8WJxBpUjW6VqtJpUaE94c5tlBJ8MgAmPHTQ=="], 189 + 190 + "@mantine/form": ["@mantine/form@7.16.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "klona": "^2.0.6" }, "peerDependencies": { "react": "^18.x || ^19.x" } }, "sha512-SZfOlmO14oAYdqo3SJKJlPrSNaeWyTPIPV/cur/4sPf114cAyggEZHoHJEjy2yA8UccfwYZx39yWrwxQCb8J8w=="], 191 + 192 + "@mantine/hooks": ["@mantine/hooks@7.16.1", "", { "peerDependencies": { "react": "^18.x || ^19.x" } }, "sha512-+hER8E4d2ByfQ/DKIXGM3Euxb7IH5ArSjzzzoF21sG095iXIryOCob22ZanrmiXCoAzKKdxqgVj4Di67ikLYSQ=="], 193 + 194 + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], 195 + 196 + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], 197 + 198 + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], 199 + 200 + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.32.0", "", { "os": "android", "cpu": "arm" }, "sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg=="], 201 + 202 + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A=="], 203 + 204 + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ=="], 205 + 206 + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ=="], 207 + 208 + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.32.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA=="], 209 + 210 + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ=="], 211 + 212 + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A=="], 213 + 214 + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ=="], 215 + 216 + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w=="], 217 + 218 + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw=="], 219 + 220 + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.32.0", "", { "os": "linux", "cpu": "none" }, "sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw=="], 221 + 222 + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.32.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ=="], 223 + 224 + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.32.0", "", { "os": "linux", "cpu": "none" }, "sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw=="], 225 + 226 + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.32.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw=="], 227 + 228 + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A=="], 229 + 230 + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg=="], 231 + 232 + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg=="], 233 + 234 + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.32.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw=="], 235 + 236 + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA=="], 237 + 238 + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], 239 + 240 + "@types/babel__generator": ["@types/babel__generator@7.6.8", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw=="], 241 + 242 + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], 243 + 244 + "@types/babel__traverse": ["@types/babel__traverse@7.20.6", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg=="], 245 + 246 + "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], 247 + 248 + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], 249 + 250 + "@types/node": ["@types/node@22.10.10", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww=="], 251 + 252 + "@types/parse-json": ["@types/parse-json@4.0.2", "", {}, "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="], 253 + 254 + "@types/prop-types": ["@types/prop-types@15.7.14", "", {}, "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ=="], 255 + 256 + "@types/react": ["@types/react@18.3.18", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ=="], 257 + 258 + "@types/react-dom": ["@types/react-dom@18.3.5", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q=="], 259 + 260 + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.21.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.21.0", "@typescript-eslint/type-utils": "8.21.0", "@typescript-eslint/utils": "8.21.0", "@typescript-eslint/visitor-keys": "8.21.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA=="], 261 + 262 + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.21.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.21.0", "@typescript-eslint/types": "8.21.0", "@typescript-eslint/typescript-estree": "8.21.0", "@typescript-eslint/visitor-keys": "8.21.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA=="], 263 + 264 + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.21.0", "", { "dependencies": { "@typescript-eslint/types": "8.21.0", "@typescript-eslint/visitor-keys": "8.21.0" } }, "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA=="], 265 + 266 + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.21.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.21.0", "@typescript-eslint/utils": "8.21.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ=="], 267 + 268 + "@typescript-eslint/types": ["@typescript-eslint/types@8.21.0", "", {}, "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A=="], 269 + 270 + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.21.0", "", { "dependencies": { "@typescript-eslint/types": "8.21.0", "@typescript-eslint/visitor-keys": "8.21.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.8.0" } }, "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg=="], 271 + 272 + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.21.0", "@typescript-eslint/types": "8.21.0", "@typescript-eslint/typescript-estree": "8.21.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw=="], 273 + 274 + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.21.0", "", { "dependencies": { "@typescript-eslint/types": "8.21.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w=="], 275 + 276 + "@vitejs/plugin-react": ["@vitejs/plugin-react@4.3.4", "", { "dependencies": { "@babel/core": "^7.26.0", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", "react-refresh": "^0.14.2" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug=="], 277 + 278 + "acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], 279 + 280 + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], 281 + 282 + "ajv": ["ajv@6.12.6", "", { "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" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], 283 + 284 + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], 285 + 286 + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], 287 + 288 + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], 289 + 290 + "axios": ["axios@1.7.9", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw=="], 291 + 292 + "babel-plugin-macros": ["babel-plugin-macros@3.1.0", "", { "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", "resolve": "^1.19.0" } }, "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg=="], 293 + 294 + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], 295 + 296 + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], 297 + 298 + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], 299 + 300 + "browserslist": ["browserslist@4.24.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" } }, "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A=="], 301 + 302 + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], 303 + 304 + "caniuse-lite": ["caniuse-lite@1.0.30001695", "", {}, "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw=="], 305 + 306 + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], 307 + 308 + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], 309 + 310 + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], 311 + 312 + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], 313 + 314 + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], 315 + 316 + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], 317 + 318 + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], 319 + 320 + "cosmiconfig": ["cosmiconfig@7.1.0", "", { "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" } }, "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="], 321 + 322 + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], 323 + 324 + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], 325 + 326 + "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], 327 + 328 + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], 329 + 330 + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], 331 + 332 + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], 333 + 334 + "electron-to-chromium": ["electron-to-chromium@1.5.88", "", {}, "sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw=="], 335 + 336 + "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], 337 + 338 + "esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], 339 + 340 + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], 341 + 342 + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], 343 + 344 + "eslint": ["eslint@9.19.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.10.0", "@eslint/eslintrc": "^3.2.0", "@eslint/js": "9.19.0", "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.1", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA=="], 345 + 346 + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.1.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw=="], 347 + 348 + "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.18", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-IRGEoFn3OKalm3hjfolEWGqoF/jPqeEYFp+C8B0WMzwGwBMvlRDQd06kghDhF0C61uJ6WfSDhEZE/sAQjduKgw=="], 349 + 350 + "eslint-scope": ["eslint-scope@8.2.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A=="], 351 + 352 + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="], 353 + 354 + "espree": ["espree@10.3.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" } }, "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg=="], 355 + 356 + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], 357 + 358 + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], 359 + 360 + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], 361 + 362 + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], 363 + 364 + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], 365 + 366 + "fast-glob": ["fast-glob@3.3.3", "", { "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.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], 367 + 368 + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], 369 + 370 + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], 371 + 372 + "fastq": ["fastq@1.18.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw=="], 373 + 374 + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], 375 + 376 + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], 377 + 378 + "find-root": ["find-root@1.1.0", "", {}, "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="], 379 + 380 + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], 381 + 382 + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], 383 + 384 + "flatted": ["flatted@3.3.2", "", {}, "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA=="], 385 + 386 + "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], 387 + 388 + "form-data": ["form-data@4.0.1", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw=="], 389 + 390 + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], 391 + 392 + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], 393 + 394 + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], 395 + 396 + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], 397 + 398 + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], 399 + 400 + "globals": ["globals@15.14.0", "", {}, "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig=="], 401 + 402 + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], 403 + 404 + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], 405 + 406 + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], 407 + 408 + "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], 409 + 410 + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], 411 + 412 + "import-fresh": ["import-fresh@3.3.0", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="], 413 + 414 + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], 415 + 416 + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], 417 + 418 + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], 419 + 420 + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], 421 + 422 + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], 423 + 424 + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], 425 + 426 + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], 427 + 428 + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], 429 + 430 + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], 431 + 432 + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], 433 + 434 + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], 435 + 436 + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], 437 + 438 + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], 439 + 440 + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], 441 + 442 + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], 443 + 444 + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], 445 + 446 + "klona": ["klona@2.0.6", "", {}, "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="], 447 + 448 + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], 449 + 450 + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], 451 + 452 + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], 453 + 454 + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], 455 + 456 + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], 457 + 458 + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], 459 + 460 + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], 461 + 462 + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], 463 + 464 + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], 465 + 466 + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], 467 + 468 + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], 469 + 470 + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], 471 + 472 + "nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="], 473 + 474 + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], 475 + 476 + "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], 477 + 478 + "optionator": ["optionator@0.9.4", "", { "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" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], 479 + 480 + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], 481 + 482 + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], 483 + 484 + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], 485 + 486 + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], 487 + 488 + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], 489 + 490 + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], 491 + 492 + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], 493 + 494 + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], 495 + 496 + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], 497 + 498 + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], 499 + 500 + "postcss": ["postcss@8.5.1", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ=="], 501 + 502 + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], 503 + 504 + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], 505 + 506 + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], 507 + 508 + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], 509 + 510 + "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="], 511 + 512 + "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], 513 + 514 + "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], 515 + 516 + "react-number-format": ["react-number-format@5.4.3", "", { "peerDependencies": { "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-VCY5hFg/soBighAoGcdE+GagkJq0230qN6jcS5sp8wQX1qy1fYN/RX7/BXkrs0oyzzwqR8/+eSUrqXbGeywdUQ=="], 517 + 518 + "react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="], 519 + 520 + "react-remove-scroll": ["react-remove-scroll@2.6.3", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ=="], 521 + 522 + "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], 523 + 524 + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], 525 + 526 + "react-textarea-autosize": ["react-textarea-autosize@8.5.6", "", { "dependencies": { "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", "use-latest": "^1.2.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-aT3ioKXMa8f6zHYGebhbdMD2L00tKeRX1zuVuDx9YQK/JLLRSaSxq3ugECEmUB9z2kvk6bFSIoRHLkkUv0RJiw=="], 527 + 528 + "regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], 529 + 530 + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], 531 + 532 + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], 533 + 534 + "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], 535 + 536 + "rollup": ["rollup@4.32.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.32.0", "@rollup/rollup-android-arm64": "4.32.0", "@rollup/rollup-darwin-arm64": "4.32.0", "@rollup/rollup-darwin-x64": "4.32.0", "@rollup/rollup-freebsd-arm64": "4.32.0", "@rollup/rollup-freebsd-x64": "4.32.0", "@rollup/rollup-linux-arm-gnueabihf": "4.32.0", "@rollup/rollup-linux-arm-musleabihf": "4.32.0", "@rollup/rollup-linux-arm64-gnu": "4.32.0", "@rollup/rollup-linux-arm64-musl": "4.32.0", "@rollup/rollup-linux-loongarch64-gnu": "4.32.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.32.0", "@rollup/rollup-linux-riscv64-gnu": "4.32.0", "@rollup/rollup-linux-s390x-gnu": "4.32.0", "@rollup/rollup-linux-x64-gnu": "4.32.0", "@rollup/rollup-linux-x64-musl": "4.32.0", "@rollup/rollup-win32-arm64-msvc": "4.32.0", "@rollup/rollup-win32-ia32-msvc": "4.32.0", "@rollup/rollup-win32-x64-msvc": "4.32.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-JmrhfQR31Q4AuNBjjAX4s+a/Pu/Q8Q9iwjWBsjRH1q52SPFE2NqRMK6fUZKKnvKO6id+h7JIRf0oYsph53eATg=="], 537 + 538 + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], 539 + 540 + "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], 541 + 542 + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 543 + 544 + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], 545 + 546 + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], 547 + 548 + "source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], 549 + 550 + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], 551 + 552 + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], 553 + 554 + "stylis": ["stylis@4.2.0", "", {}, "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="], 555 + 556 + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], 557 + 558 + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], 559 + 560 + "tabbable": ["tabbable@6.2.0", "", {}, "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="], 561 + 562 + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], 563 + 564 + "ts-api-utils": ["ts-api-utils@2.0.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ=="], 565 + 566 + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], 567 + 568 + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], 569 + 570 + "type-fest": ["type-fest@4.33.0", "", {}, "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g=="], 571 + 572 + "typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="], 573 + 574 + "typescript-eslint": ["typescript-eslint@8.21.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.21.0", "@typescript-eslint/parser": "8.21.0", "@typescript-eslint/utils": "8.21.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw=="], 575 + 576 + "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], 577 + 578 + "update-browserslist-db": ["update-browserslist-db@1.1.2", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg=="], 579 + 580 + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], 581 + 582 + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], 583 + 584 + "use-composed-ref": ["use-composed-ref@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w=="], 585 + 586 + "use-isomorphic-layout-effect": ["use-isomorphic-layout-effect@1.2.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w=="], 587 + 588 + "use-latest": ["use-latest@1.3.0", "", { "dependencies": { "use-isomorphic-layout-effect": "^1.1.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ=="], 589 + 590 + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], 591 + 592 + "vite": ["vite@6.0.11", "", { "dependencies": { "esbuild": "^0.24.2", "postcss": "^8.4.49", "rollup": "^4.23.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg=="], 593 + 594 + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], 595 + 596 + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], 597 + 598 + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], 599 + 600 + "yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], 601 + 602 + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], 603 + 604 + "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], 605 + 606 + "@emotion/babel-plugin/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], 607 + 608 + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], 609 + 610 + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], 611 + 612 + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], 613 + 614 + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 615 + 616 + "@typescript-eslint/typescript-estree/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], 617 + 618 + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 619 + 620 + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 621 + } 622 + }
+28
frontend/eslint.config.js
···
··· 1 + import js from '@eslint/js' 2 + import globals from 'globals' 3 + import reactHooks from 'eslint-plugin-react-hooks' 4 + import reactRefresh from 'eslint-plugin-react-refresh' 5 + import tseslint from 'typescript-eslint' 6 + 7 + export default tseslint.config( 8 + { ignores: ['dist'] }, 9 + { 10 + extends: [js.configs.recommended, ...tseslint.configs.recommended], 11 + files: ['**/*.{ts,tsx}'], 12 + languageOptions: { 13 + ecmaVersion: 2020, 14 + globals: globals.browser, 15 + }, 16 + plugins: { 17 + 'react-hooks': reactHooks, 18 + 'react-refresh': reactRefresh, 19 + }, 20 + rules: { 21 + ...reactHooks.configs.recommended.rules, 22 + 'react-refresh/only-export-components': [ 23 + 'warn', 24 + { allowConstantExport: true }, 25 + ], 26 + }, 27 + }, 28 + )
+13
frontend/index.html
···
··· 1 + <!doctype html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8" /> 5 + <link rel="icon" type="image/svg+xml" href="/vite.svg" /> 6 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 + <title>Vite + React + TS</title> 8 + </head> 9 + <body> 10 + <div id="root"></div> 11 + <script type="module" src="/src/main.tsx"></script> 12 + </body> 13 + </html>
+35
frontend/package.json
···
··· 1 + { 2 + "name": "frontend", 3 + "private": true, 4 + "version": "0.0.0", 5 + "type": "module", 6 + "scripts": { 7 + "dev": "vite", 8 + "build": "tsc -b && vite build", 9 + "lint": "eslint .", 10 + "preview": "vite preview" 11 + }, 12 + "dependencies": { 13 + "@emotion/react": "^11.14.0", 14 + "@mantine/core": "^7.16.1", 15 + "@mantine/form": "^7.16.1", 16 + "@mantine/hooks": "^7.16.1", 17 + "axios": "^1.7.9", 18 + "react": "^18.3.1", 19 + "react-dom": "^18.3.1" 20 + }, 21 + "devDependencies": { 22 + "@eslint/js": "^9.17.0", 23 + "@types/node": "^22.10.10", 24 + "@types/react": "^18.3.18", 25 + "@types/react-dom": "^18.3.5", 26 + "@vitejs/plugin-react": "^4.3.4", 27 + "eslint": "^9.17.0", 28 + "eslint-plugin-react-hooks": "^5.0.0", 29 + "eslint-plugin-react-refresh": "^0.4.16", 30 + "globals": "^15.14.0", 31 + "typescript": "~5.6.2", 32 + "typescript-eslint": "^8.18.2", 33 + "vite": "^6.0.5" 34 + } 35 + }
+1
frontend/public/vite.svg
···
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
+42
frontend/src/App.css
···
··· 1 + #root { 2 + max-width: 1280px; 3 + margin: 0 auto; 4 + padding: 2rem; 5 + text-align: center; 6 + } 7 + 8 + .logo { 9 + height: 6em; 10 + padding: 1.5em; 11 + will-change: filter; 12 + transition: filter 300ms; 13 + } 14 + .logo:hover { 15 + filter: drop-shadow(0 0 2em #646cffaa); 16 + } 17 + .logo.react:hover { 18 + filter: drop-shadow(0 0 2em #61dafbaa); 19 + } 20 + 21 + @keyframes logo-spin { 22 + from { 23 + transform: rotate(0deg); 24 + } 25 + to { 26 + transform: rotate(360deg); 27 + } 28 + } 29 + 30 + @media (prefers-reduced-motion: no-preference) { 31 + a:nth-of-type(2) .logo { 32 + animation: logo-spin infinite 20s linear; 33 + } 34 + } 35 + 36 + .card { 37 + padding: 2em; 38 + } 39 + 40 + .read-the-docs { 41 + color: #888; 42 + }
+26
frontend/src/App.tsx
···
··· 1 + import { MantineProvider, Container, Title, Stack } from '@mantine/core'; 2 + import { LinkForm } from './components/LinkForm'; 3 + import { LinkList } from './components/LinkList'; 4 + import { Link } from './types/api'; 5 + 6 + function App() { 7 + const handleLinkCreated = (link: Link) => { 8 + // You could update the list here or show a success message 9 + window.location.reload(); 10 + }; 11 + 12 + return ( 13 + <MantineProvider withGlobalStyles withNormalizeCSS> 14 + <Container size="lg" py="xl"> 15 + <Stack spacing="xl"> 16 + <Title order={1}>URL Shortener</Title> 17 + <LinkForm onSuccess={handleLinkCreated} /> 18 + <LinkList /> 19 + </Stack> 20 + </Container> 21 + </MantineProvider> 22 + ); 23 + } 24 + 25 + export default App; 26 +
+17
frontend/src/api/client.ts
···
··· 1 + import axios from 'axios'; 2 + import { CreateLinkRequest, Link } from '../types/api'; 3 + 4 + const api = axios.create({ 5 + baseURL: '/api', 6 + }); 7 + 8 + export const createShortLink = async (data: CreateLinkRequest) => { 9 + const response = await api.post<Link>('/shorten', data); 10 + return response.data; 11 + }; 12 + 13 + export const getAllLinks = async () => { 14 + const response = await api.get<Link[]>('/links'); 15 + return response.data; 16 + }; 17 +
+1
frontend/src/assets/react.svg
···
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>
+83
frontend/src/components/LinkForm.tsx
···
··· 1 + import { useState } from 'react'; 2 + import { TextInput, Button, Group, Box, Text } from '@mantine/core'; 3 + import { useForm } from '@mantine/form'; 4 + import { CreateLinkRequest, Link } from '../types/api'; 5 + import { createShortLink } from '../api/client'; 6 + 7 + interface LinkFormProps { 8 + onSuccess: (link: Link) => void; 9 + } 10 + 11 + export function LinkForm({ onSuccess }: LinkFormProps) { 12 + const [error, setError] = useState<string | null>(null); 13 + const [loading, setLoading] = useState(false); 14 + 15 + const form = useForm<CreateLinkRequest>({ 16 + initialValues: { 17 + url: '', 18 + custom_code: '', 19 + }, 20 + validate: { 21 + url: (value) => { 22 + if (!value) return 'URL is required'; 23 + if (!value.startsWith('http://') && !value.startsWith('https://')) { 24 + return 'URL must start with http:// or https://'; 25 + } 26 + return null; 27 + }, 28 + custom_code: (value) => { 29 + if (value && !/^[a-zA-Z0-9_-]{1,32}$/.test(value)) { 30 + return 'Custom code must be 1-32 characters and contain only letters, numbers, underscores, and hyphens'; 31 + } 32 + return null; 33 + }, 34 + }, 35 + }); 36 + 37 + const handleSubmit = async (values: CreateLinkRequest) => { 38 + try { 39 + setLoading(true); 40 + setError(null); 41 + const link = await createShortLink(values); 42 + form.reset(); 43 + onSuccess(link); 44 + } catch (err) { 45 + setError(err.response?.data?.error || 'An error occurred'); 46 + } finally { 47 + setLoading(false); 48 + } 49 + }; 50 + 51 + return ( 52 + <Box mx="auto" sx={{ maxWidth: 500 }}> 53 + <form onSubmit={form.onSubmit(handleSubmit)}> 54 + <TextInput 55 + required 56 + label="URL" 57 + placeholder="https://example.com" 58 + {...form.getInputProps('url')} 59 + /> 60 + 61 + <TextInput 62 + label="Custom Code (optional)" 63 + placeholder="example" 64 + mt="md" 65 + {...form.getInputProps('custom_code')} 66 + /> 67 + 68 + {error && ( 69 + <Text color="red" size="sm" mt="sm"> 70 + {error} 71 + </Text> 72 + )} 73 + 74 + <Group position="right" mt="md"> 75 + <Button type="submit" loading={loading}> 76 + Create Short Link 77 + </Button> 78 + </Group> 79 + </form> 80 + </Box> 81 + ); 82 + } 83 +
+69
frontend/src/components/LinkList.tsx
···
··· 1 + import { useEffect, useState } from 'react'; 2 + import { Table, Text, Box, CopyButton, Button } from '@mantine/core'; 3 + import { Link } from '../types/api'; 4 + import { getAllLinks } from '../api/client'; 5 + 6 + export function LinkList() { 7 + const [links, setLinks] = useState<Link[]>([]); 8 + const [loading, setLoading] = useState(true); 9 + const [error, setError] = useState<string | null>(null); 10 + 11 + const fetchLinks = async () => { 12 + try { 13 + setLoading(true); 14 + const data = await getAllLinks(); 15 + setLinks(data); 16 + } catch (err) { 17 + setError('Failed to load links'); 18 + } finally { 19 + setLoading(false); 20 + } 21 + }; 22 + 23 + useEffect(() => { 24 + fetchLinks(); 25 + }, []); 26 + 27 + if (loading) return <Text>Loading...</Text>; 28 + if (error) return <Text color="red">{error}</Text>; 29 + 30 + return ( 31 + <Box> 32 + <Table> 33 + <thead> 34 + <tr> 35 + <th>Short Code</th> 36 + <th>Original URL</th> 37 + <th>Clicks</th> 38 + <th>Created</th> 39 + <th>Actions</th> 40 + </tr> 41 + </thead> 42 + <tbody> 43 + {links.map((link) => ( 44 + <tr key={link.id}> 45 + <td>{link.short_code}</td> 46 + <td>{link.original_url}</td> 47 + <td>{link.clicks}</td> 48 + <td>{new Date(link.created_at).toLocaleDateString()}</td> 49 + <td> 50 + <CopyButton value={`${window.location.origin}/${link.short_code}`}> 51 + {({ copied, copy }) => ( 52 + <Button 53 + color={copied ? 'teal' : 'blue'} 54 + onClick={copy} 55 + size="xs" 56 + > 57 + {copied ? 'Copied' : 'Copy'} 58 + </Button> 59 + )} 60 + </CopyButton> 61 + </td> 62 + </tr> 63 + ))} 64 + </tbody> 65 + </Table> 66 + </Box> 67 + ); 68 + } 69 +
+68
frontend/src/index.css
···
··· 1 + :root { 2 + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; 3 + line-height: 1.5; 4 + font-weight: 400; 5 + 6 + color-scheme: light dark; 7 + color: rgba(255, 255, 255, 0.87); 8 + background-color: #242424; 9 + 10 + font-synthesis: none; 11 + text-rendering: optimizeLegibility; 12 + -webkit-font-smoothing: antialiased; 13 + -moz-osx-font-smoothing: grayscale; 14 + } 15 + 16 + a { 17 + font-weight: 500; 18 + color: #646cff; 19 + text-decoration: inherit; 20 + } 21 + a:hover { 22 + color: #535bf2; 23 + } 24 + 25 + body { 26 + margin: 0; 27 + display: flex; 28 + place-items: center; 29 + min-width: 320px; 30 + min-height: 100vh; 31 + } 32 + 33 + h1 { 34 + font-size: 3.2em; 35 + line-height: 1.1; 36 + } 37 + 38 + button { 39 + border-radius: 8px; 40 + border: 1px solid transparent; 41 + padding: 0.6em 1.2em; 42 + font-size: 1em; 43 + font-weight: 500; 44 + font-family: inherit; 45 + background-color: #1a1a1a; 46 + cursor: pointer; 47 + transition: border-color 0.25s; 48 + } 49 + button:hover { 50 + border-color: #646cff; 51 + } 52 + button:focus, 53 + button:focus-visible { 54 + outline: 4px auto -webkit-focus-ring-color; 55 + } 56 + 57 + @media (prefers-color-scheme: light) { 58 + :root { 59 + color: #213547; 60 + background-color: #ffffff; 61 + } 62 + a:hover { 63 + color: #747bff; 64 + } 65 + button { 66 + background-color: #f9f9f9; 67 + } 68 + }
+10
frontend/src/main.tsx
···
··· 1 + import { StrictMode } from 'react' 2 + import { createRoot } from 'react-dom/client' 3 + import './index.css' 4 + import App from './App.tsx' 5 + 6 + createRoot(document.getElementById('root')!).render( 7 + <StrictMode> 8 + <App /> 9 + </StrictMode>, 10 + )
+18
frontend/src/types/api.ts
···
··· 1 + export interface CreateLinkRequest { 2 + url: string; 3 + custom_code?: string; 4 + source?: string; 5 + } 6 + 7 + export interface Link { 8 + id: number; 9 + original_url: string; 10 + short_code: string; 11 + created_at: string; 12 + clicks: number; 13 + } 14 + 15 + export interface ApiError { 16 + error: string; 17 + } 18 +
+1
frontend/src/vite-env.d.ts
···
··· 1 + /// <reference types="vite/client" />
+26
frontend/tsconfig.app.json
···
··· 1 + { 2 + "compilerOptions": { 3 + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 4 + "target": "ES2020", 5 + "useDefineForClassFields": true, 6 + "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 + "module": "ESNext", 8 + "skipLibCheck": true, 9 + 10 + /* Bundler mode */ 11 + "moduleResolution": "bundler", 12 + "allowImportingTsExtensions": true, 13 + "isolatedModules": true, 14 + "moduleDetection": "force", 15 + "noEmit": true, 16 + "jsx": "react-jsx", 17 + 18 + /* Linting */ 19 + "strict": true, 20 + "noUnusedLocals": true, 21 + "noUnusedParameters": true, 22 + "noFallthroughCasesInSwitch": true, 23 + "noUncheckedSideEffectImports": true 24 + }, 25 + "include": ["src"] 26 + }
+7
frontend/tsconfig.json
···
··· 1 + { 2 + "files": [], 3 + "references": [ 4 + { "path": "./tsconfig.app.json" }, 5 + { "path": "./tsconfig.node.json" } 6 + ] 7 + }
+24
frontend/tsconfig.node.json
···
··· 1 + { 2 + "compilerOptions": { 3 + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 + "target": "ES2022", 5 + "lib": ["ES2023"], 6 + "module": "ESNext", 7 + "skipLibCheck": true, 8 + 9 + /* Bundler mode */ 10 + "moduleResolution": "bundler", 11 + "allowImportingTsExtensions": true, 12 + "isolatedModules": true, 13 + "moduleDetection": "force", 14 + "noEmit": true, 15 + 16 + /* Linting */ 17 + "strict": true, 18 + "noUnusedLocals": true, 19 + "noUnusedParameters": true, 20 + "noFallthroughCasesInSwitch": true, 21 + "noUncheckedSideEffectImports": true 22 + }, 23 + "include": ["vite.config.ts"] 24 + }
+15
frontend/vite.config.ts
···
··· 1 + import { defineConfig } from 'vite' 2 + import react from '@vitejs/plugin-react' 3 + 4 + export default defineConfig({ 5 + plugins: [react()], 6 + server: { 7 + proxy: { 8 + '/api': { 9 + target: 'http://localhost:8080', 10 + changeOrigin: true, 11 + }, 12 + }, 13 + }, 14 + }) 15 +
+18
migrations/20240301000000_initial.sql
···
··· 1 + CREATE TABLE links ( 2 + id SERIAL PRIMARY KEY, 3 + original_url TEXT NOT NULL, 4 + short_code VARCHAR(8) NOT NULL UNIQUE, 5 + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), 6 + clicks BIGINT NOT NULL DEFAULT 0 7 + ); 8 + 9 + CREATE INDEX idx_short_code ON links(short_code); 10 + 11 + CREATE TABLE clicks ( 12 + id SERIAL PRIMARY KEY, 13 + link_id INTEGER REFERENCES links(id), 14 + source TEXT, 15 + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() 16 + ); 17 + 18 + CREATE INDEX idx_link_id ON clicks(link_id);
+15
migrations/20240302000000_auth_and_tracking.sql:
···
··· 1 + -- Add users table 2 + CREATE TABLE users ( 3 + id SERIAL PRIMARY KEY, 4 + email TEXT UNIQUE NOT NULL, 5 + password_hash TEXT NOT NULL, 6 + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() 7 + ); 8 + 9 + -- Add user_id to links 10 + ALTER TABLE links 11 + ADD COLUMN user_id INTEGER REFERENCES users(id); 12 + 13 + -- Add query_source to clicks 14 + ALTER TABLE clicks 15 + ADD COLUMN query_source TEXT;
+24
src/error.rs
···
··· 1 + use actix_web::{HttpResponse, ResponseError}; 2 + use thiserror::Error; 3 + 4 + #[derive(Error, Debug)] 5 + pub enum AppError { 6 + #[error("Database error: {0}")] 7 + Database(#[from] sqlx::Error), 8 + 9 + #[error("Not found")] 10 + NotFound, 11 + 12 + #[error("Invalid input: {0}")] 13 + InvalidInput(String), 14 + } 15 + 16 + impl ResponseError for AppError { 17 + fn error_response(&self) -> HttpResponse { 18 + match self { 19 + AppError::NotFound => HttpResponse::NotFound().json("Not found"), 20 + AppError::Database(_) => HttpResponse::InternalServerError().json("Internal server error"), 21 + AppError::InvalidInput(msg) => HttpResponse::BadRequest().json(msg), 22 + } 23 + } 24 + }
+160
src/handlers.rs
···
··· 1 + use actix_web::{web, HttpResponse, Responder, HttpRequest}; 2 + use crate::{AppState, error::AppError, models::{CreateLink, Link}}; 3 + use regex::Regex; 4 + use lazy_static::lazy_static; 5 + 6 + lazy_static! { 7 + static ref VALID_CODE_REGEX: Regex = Regex::new(r"^[a-zA-Z0-9_-]{1,32}$").unwrap(); 8 + } 9 + 10 + pub async fn create_short_url( 11 + state: web::Data<AppState>, 12 + payload: web::Json<CreateLink>, 13 + req: HttpRequest, 14 + ) -> Result<impl Responder, AppError> { 15 + validate_url(&payload.url)?; 16 + 17 + let short_code = if let Some(ref custom_code) = payload.custom_code { 18 + validate_custom_code(custom_code)?; 19 + 20 + // Check if code is already taken 21 + if let Some(_) = sqlx::query_as::<_, Link>( 22 + "SELECT * FROM links WHERE short_code = $1" 23 + ) 24 + .bind(custom_code) 25 + .fetch_optional(&state.db) 26 + .await? { 27 + return Err(AppError::InvalidInput( 28 + "Custom code already taken".to_string() 29 + )); 30 + } 31 + 32 + custom_code.clone() 33 + } else { 34 + generate_short_code() 35 + }; 36 + 37 + // Start transaction 38 + let mut tx = state.db.begin().await?; 39 + 40 + let link = sqlx::query_as::<_, Link>( 41 + "INSERT INTO links (original_url, short_code) VALUES ($1, $2) RETURNING *" 42 + ) 43 + .bind(&payload.url) 44 + .bind(&short_code) 45 + .fetch_one(&mut *tx) 46 + .await?; 47 + 48 + if let Some(ref source) = payload.source { 49 + sqlx::query( 50 + "INSERT INTO clicks (link_id, source) VALUES ($1, $2)" 51 + ) 52 + .bind(link.id) 53 + .bind(source) 54 + .execute(&mut *tx) 55 + .await?; 56 + } 57 + 58 + tx.commit().await?; 59 + Ok(HttpResponse::Created().json(link)) 60 + } 61 + 62 + fn validate_custom_code(code: &str) -> Result<(), AppError> { 63 + if !VALID_CODE_REGEX.is_match(code) { 64 + return Err(AppError::InvalidInput( 65 + "Custom code must be 1-32 characters long and contain only letters, numbers, underscores, and hyphens".to_string() 66 + )); 67 + } 68 + 69 + // Add reserved words check 70 + let reserved_words = ["api", "health", "admin", "static", "assets"]; 71 + if reserved_words.contains(&code.to_lowercase().as_str()) { 72 + return Err(AppError::InvalidInput( 73 + "This code is reserved and cannot be used".to_string() 74 + )); 75 + } 76 + 77 + Ok(()) 78 + } 79 + 80 + fn validate_url(url: &String) -> Result<(), AppError> { 81 + if url.is_empty() { 82 + return Err(AppError::InvalidInput("URL cannot be empty".to_string())); 83 + } 84 + if !url.starts_with("http://") && !url.starts_with("https://") { 85 + return Err(AppError::InvalidInput("URL must start with http:// or https://".to_string())); 86 + } 87 + Ok(()) 88 + } 89 + 90 + pub async fn redirect_to_url( 91 + state: web::Data<AppState>, 92 + path: web::Path<String>, 93 + req: HttpRequest, 94 + ) -> Result<impl Responder, AppError> { 95 + let short_code = path.into_inner(); 96 + 97 + let mut tx = state.db.begin().await?; 98 + 99 + let link = sqlx::query_as::<_, Link>( 100 + "UPDATE links SET clicks = clicks + 1 WHERE short_code = $1 RETURNING *" 101 + ) 102 + .bind(&short_code) 103 + .fetch_optional(&mut *tx) 104 + .await?; 105 + 106 + match link { 107 + Some(link) => { 108 + // Record click with user agent as source 109 + let user_agent = req.headers() 110 + .get("user-agent") 111 + .and_then(|h| h.to_str().ok()) 112 + .unwrap_or("unknown") 113 + .to_string(); 114 + 115 + sqlx::query( 116 + "INSERT INTO clicks (link_id, source) VALUES ($1, $2)" 117 + ) 118 + .bind(link.id) 119 + .bind(user_agent) 120 + .execute(&mut *tx) 121 + .await?; 122 + 123 + tx.commit().await?; 124 + 125 + Ok(HttpResponse::TemporaryRedirect() 126 + .append_header(("Location", link.original_url)) 127 + .finish()) 128 + }, 129 + None => Err(AppError::NotFound), 130 + } 131 + } 132 + 133 + pub async fn get_all_links( 134 + state: web::Data<AppState>, 135 + ) -> Result<impl Responder, AppError> { 136 + let links = sqlx::query_as::<_, Link>( 137 + "SELECT * FROM links ORDER BY created_at DESC" 138 + ) 139 + .fetch_all(&state.db) 140 + .await?; 141 + 142 + Ok(HttpResponse::Ok().json(links)) 143 + } 144 + 145 + pub async fn health_check( 146 + state: web::Data<AppState>, 147 + ) -> impl Responder { 148 + match sqlx::query("SELECT 1").execute(&state.db).await { 149 + Ok(_) => HttpResponse::Ok().json("Healthy"), 150 + Err(_) => HttpResponse::ServiceUnavailable().json("Database unavailable"), 151 + } 152 + } 153 + 154 + fn generate_short_code() -> String { 155 + use base62::encode; 156 + use uuid::Uuid; 157 + 158 + let uuid = Uuid::new_v4(); 159 + encode(uuid.as_u128() as u64).chars().take(8).collect() 160 + }
+74
src/main.rs
···
··· 1 + use actix_web::{web, App, HttpServer}; 2 + use actix_cors::Cors; 3 + use anyhow::Result; 4 + use sqlx::PgPool; 5 + use tracing::info; 6 + 7 + mod error; 8 + mod handlers; 9 + mod models; 10 + 11 + #[derive(Clone)] 12 + pub struct AppState { 13 + db: PgPool, 14 + } 15 + 16 + #[actix_web::main] 17 + async fn main() -> Result<()> { 18 + // Load environment variables from .env file 19 + dotenv::dotenv().ok(); 20 + 21 + // Initialize logging 22 + tracing_subscriber::fmt::init(); 23 + 24 + // Database connection string from environment 25 + let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set"); 26 + 27 + // Create database connection pool 28 + use sqlx::postgres::PgPoolOptions; 29 + 30 + // In main(), replace the PgPool::connect with: 31 + let pool = PgPoolOptions::new() 32 + .max_connections(5) 33 + .acquire_timeout(std::time::Duration::from_secs(3)) 34 + .connect(&database_url) 35 + .await?; 36 + 37 + // Run database migrations 38 + sqlx::migrate!("./migrations").run(&pool).await?; 39 + 40 + let state = AppState { db: pool }; 41 + 42 + info!("Starting server at http://127.0.0.1:8080"); 43 + 44 + // Start HTTP server 45 + HttpServer::new(move || { 46 + let cors = Cors::default() 47 + .allow_any_origin() 48 + .allow_any_method() 49 + .allow_any_header() 50 + .max_age(3600); 51 + 52 + App::new() 53 + .wrap(cors) 54 + .app_data(web::Data::new(state.clone())) 55 + .service( 56 + web::scope("/api") 57 + .route("/shorten", web::post().to(handlers::create_short_url)) 58 + .route("/links", web::get().to(handlers::get_all_links)), 59 + 60 + ) 61 + .service( 62 + web::resource("/{short_code}") 63 + .route(web::get().to(handlers::redirect_to_url)) 64 + ) 65 + .service(web::resource("/{short_code}").route(web::get().to(handlers::redirect_to_url))) 66 + }) 67 + .workers(2) // Limit worker threads 68 + .backlog(10_000) 69 + .bind("127.0.0.1:8080")? 70 + .run() 71 + .await?; 72 + 73 + Ok(()) 74 + }
+50
src/models.rs
···
··· 1 + use serde::{Deserialize, Serialize}; 2 + use sqlx::FromRow; 3 + 4 + #[derive(Deserialize)] 5 + pub struct CreateLink { 6 + pub url: String, 7 + pub source: Option<String>, 8 + pub custom_code: Option<String>, 9 + } 10 + 11 + #[derive(Serialize, FromRow)] 12 + pub struct Link { 13 + pub id: i32, 14 + pub user_id: i32, 15 + pub original_url: String, 16 + pub short_code: String, 17 + pub created_at: chrono::DateTime<chrono::Utc>, 18 + pub clicks: i64, 19 + } 20 + 21 + #[derive(Deserialize)] 22 + pub struct LoginRequest { 23 + pub email: String, 24 + pub password: String, 25 + } 26 + 27 + #[derive(Deserialize)] 28 + pub struct RegisterRequest { 29 + pub email: String, 30 + pub password: String, 31 + } 32 + 33 + #[derive(Serialize)] 34 + pub struct AuthResponse { 35 + pub token: String, 36 + pub user: UserResponse, 37 + } 38 + 39 + #[derive(Serialize)] 40 + pub struct UserResponse { 41 + pub id: i32, 42 + pub email: String, 43 + } 44 + 45 + #[derive(FromRow)] 46 + pub struct User { 47 + pub id: i32, 48 + pub email: String, 49 + pub password_hash: String, 50 + }