interactive intro to open social

initial commit: minimal atproto identity visualization

a radial visualization showing your atproto identity at the center,
surrounded by third-party apps that store data in your PDS.

features:
- oauth login with any atproto handle
- session persistence via localStorage
- radial layout of third-party apps grouped by lexicon namespace
- click apps to see collection types
- click collections to view actual record data with pagination
- info modal explaining the atproto ecosystem
- light/dark mode following system preference
- responsive design with monospace courier new aesthetic

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

+2
.gitignore
··· 1 + /target 2 + sandbox/
+3598
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 = "actix-codec" 7 + version = "0.5.2" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" 10 + dependencies = [ 11 + "bitflags", 12 + "bytes", 13 + "futures-core", 14 + "futures-sink", 15 + "memchr", 16 + "pin-project-lite", 17 + "tokio", 18 + "tokio-util", 19 + "tracing", 20 + ] 21 + 22 + [[package]] 23 + name = "actix-http" 24 + version = "3.11.2" 25 + source = "registry+https://github.com/rust-lang/crates.io-index" 26 + checksum = "7926860314cbe2fb5d1f13731e387ab43bd32bca224e82e6e2db85de0a3dba49" 27 + dependencies = [ 28 + "actix-codec", 29 + "actix-rt", 30 + "actix-service", 31 + "actix-utils", 32 + "base64 0.22.1", 33 + "bitflags", 34 + "brotli", 35 + "bytes", 36 + "bytestring", 37 + "derive_more 2.0.1", 38 + "encoding_rs", 39 + "flate2", 40 + "foldhash", 41 + "futures-core", 42 + "h2", 43 + "http 0.2.12", 44 + "httparse", 45 + "httpdate", 46 + "itoa", 47 + "language-tags", 48 + "local-channel", 49 + "mime", 50 + "percent-encoding", 51 + "pin-project-lite", 52 + "rand 0.9.2", 53 + "sha1", 54 + "smallvec", 55 + "tokio", 56 + "tokio-util", 57 + "tracing", 58 + "zstd", 59 + ] 60 + 61 + [[package]] 62 + name = "actix-macros" 63 + version = "0.2.4" 64 + source = "registry+https://github.com/rust-lang/crates.io-index" 65 + checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" 66 + dependencies = [ 67 + "quote", 68 + "syn 2.0.106", 69 + ] 70 + 71 + [[package]] 72 + name = "actix-router" 73 + version = "0.5.3" 74 + source = "registry+https://github.com/rust-lang/crates.io-index" 75 + checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" 76 + dependencies = [ 77 + "bytestring", 78 + "cfg-if", 79 + "http 0.2.12", 80 + "regex", 81 + "regex-lite", 82 + "serde", 83 + "tracing", 84 + ] 85 + 86 + [[package]] 87 + name = "actix-rt" 88 + version = "2.11.0" 89 + source = "registry+https://github.com/rust-lang/crates.io-index" 90 + checksum = "92589714878ca59a7626ea19734f0e07a6a875197eec751bb5d3f99e64998c63" 91 + dependencies = [ 92 + "futures-core", 93 + "tokio", 94 + ] 95 + 96 + [[package]] 97 + name = "actix-server" 98 + version = "2.6.0" 99 + source = "registry+https://github.com/rust-lang/crates.io-index" 100 + checksum = "a65064ea4a457eaf07f2fba30b4c695bf43b721790e9530d26cb6f9019ff7502" 101 + dependencies = [ 102 + "actix-rt", 103 + "actix-service", 104 + "actix-utils", 105 + "futures-core", 106 + "futures-util", 107 + "mio", 108 + "socket2 0.5.10", 109 + "tokio", 110 + "tracing", 111 + ] 112 + 113 + [[package]] 114 + name = "actix-service" 115 + version = "2.0.3" 116 + source = "registry+https://github.com/rust-lang/crates.io-index" 117 + checksum = "9e46f36bf0e5af44bdc4bdb36fbbd421aa98c79a9bce724e1edeb3894e10dc7f" 118 + dependencies = [ 119 + "futures-core", 120 + "pin-project-lite", 121 + ] 122 + 123 + [[package]] 124 + name = "actix-session" 125 + version = "0.10.1" 126 + source = "registry+https://github.com/rust-lang/crates.io-index" 127 + checksum = "efe6976a74f34f1b6d07a6c05aadc0ed0359304a7781c367fa5b4029418db08f" 128 + dependencies = [ 129 + "actix-service", 130 + "actix-utils", 131 + "actix-web", 132 + "anyhow", 133 + "derive_more 1.0.0", 134 + "rand 0.8.5", 135 + "serde", 136 + "serde_json", 137 + "tracing", 138 + ] 139 + 140 + [[package]] 141 + name = "actix-utils" 142 + version = "3.0.1" 143 + source = "registry+https://github.com/rust-lang/crates.io-index" 144 + checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" 145 + dependencies = [ 146 + "local-waker", 147 + "pin-project-lite", 148 + ] 149 + 150 + [[package]] 151 + name = "actix-web" 152 + version = "4.11.0" 153 + source = "registry+https://github.com/rust-lang/crates.io-index" 154 + checksum = "a597b77b5c6d6a1e1097fddde329a83665e25c5437c696a3a9a4aa514a614dea" 155 + dependencies = [ 156 + "actix-codec", 157 + "actix-http", 158 + "actix-macros", 159 + "actix-router", 160 + "actix-rt", 161 + "actix-server", 162 + "actix-service", 163 + "actix-utils", 164 + "actix-web-codegen", 165 + "bytes", 166 + "bytestring", 167 + "cfg-if", 168 + "cookie", 169 + "derive_more 2.0.1", 170 + "encoding_rs", 171 + "foldhash", 172 + "futures-core", 173 + "futures-util", 174 + "impl-more", 175 + "itoa", 176 + "language-tags", 177 + "log", 178 + "mime", 179 + "once_cell", 180 + "pin-project-lite", 181 + "regex", 182 + "regex-lite", 183 + "serde", 184 + "serde_json", 185 + "serde_urlencoded", 186 + "smallvec", 187 + "socket2 0.5.10", 188 + "time", 189 + "tracing", 190 + "url", 191 + ] 192 + 193 + [[package]] 194 + name = "actix-web-codegen" 195 + version = "4.3.0" 196 + source = "registry+https://github.com/rust-lang/crates.io-index" 197 + checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" 198 + dependencies = [ 199 + "actix-router", 200 + "proc-macro2", 201 + "quote", 202 + "syn 2.0.106", 203 + ] 204 + 205 + [[package]] 206 + name = "addr2line" 207 + version = "0.25.1" 208 + source = "registry+https://github.com/rust-lang/crates.io-index" 209 + checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" 210 + dependencies = [ 211 + "gimli", 212 + ] 213 + 214 + [[package]] 215 + name = "adler2" 216 + version = "2.0.1" 217 + source = "registry+https://github.com/rust-lang/crates.io-index" 218 + checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 219 + 220 + [[package]] 221 + name = "aead" 222 + version = "0.5.2" 223 + source = "registry+https://github.com/rust-lang/crates.io-index" 224 + checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" 225 + dependencies = [ 226 + "crypto-common", 227 + "generic-array", 228 + ] 229 + 230 + [[package]] 231 + name = "aes" 232 + version = "0.8.4" 233 + source = "registry+https://github.com/rust-lang/crates.io-index" 234 + checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" 235 + dependencies = [ 236 + "cfg-if", 237 + "cipher", 238 + "cpufeatures", 239 + ] 240 + 241 + [[package]] 242 + name = "aes-gcm" 243 + version = "0.10.3" 244 + source = "registry+https://github.com/rust-lang/crates.io-index" 245 + checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" 246 + dependencies = [ 247 + "aead", 248 + "aes", 249 + "cipher", 250 + "ctr", 251 + "ghash", 252 + "subtle", 253 + ] 254 + 255 + [[package]] 256 + name = "aho-corasick" 257 + version = "1.1.3" 258 + source = "registry+https://github.com/rust-lang/crates.io-index" 259 + checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 260 + dependencies = [ 261 + "memchr", 262 + ] 263 + 264 + [[package]] 265 + name = "alloc-no-stdlib" 266 + version = "2.0.4" 267 + source = "registry+https://github.com/rust-lang/crates.io-index" 268 + checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 269 + 270 + [[package]] 271 + name = "alloc-stdlib" 272 + version = "0.2.2" 273 + source = "registry+https://github.com/rust-lang/crates.io-index" 274 + checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 275 + dependencies = [ 276 + "alloc-no-stdlib", 277 + ] 278 + 279 + [[package]] 280 + name = "allocator-api2" 281 + version = "0.2.21" 282 + source = "registry+https://github.com/rust-lang/crates.io-index" 283 + checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 284 + 285 + [[package]] 286 + name = "android_system_properties" 287 + version = "0.1.5" 288 + source = "registry+https://github.com/rust-lang/crates.io-index" 289 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 290 + dependencies = [ 291 + "libc", 292 + ] 293 + 294 + [[package]] 295 + name = "anstream" 296 + version = "0.6.21" 297 + source = "registry+https://github.com/rust-lang/crates.io-index" 298 + checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" 299 + dependencies = [ 300 + "anstyle", 301 + "anstyle-parse", 302 + "anstyle-query", 303 + "anstyle-wincon", 304 + "colorchoice", 305 + "is_terminal_polyfill", 306 + "utf8parse", 307 + ] 308 + 309 + [[package]] 310 + name = "anstyle" 311 + version = "1.0.13" 312 + source = "registry+https://github.com/rust-lang/crates.io-index" 313 + checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" 314 + 315 + [[package]] 316 + name = "anstyle-parse" 317 + version = "0.2.7" 318 + source = "registry+https://github.com/rust-lang/crates.io-index" 319 + checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 320 + dependencies = [ 321 + "utf8parse", 322 + ] 323 + 324 + [[package]] 325 + name = "anstyle-query" 326 + version = "1.1.4" 327 + source = "registry+https://github.com/rust-lang/crates.io-index" 328 + checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" 329 + dependencies = [ 330 + "windows-sys 0.60.2", 331 + ] 332 + 333 + [[package]] 334 + name = "anstyle-wincon" 335 + version = "3.0.10" 336 + source = "registry+https://github.com/rust-lang/crates.io-index" 337 + checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" 338 + dependencies = [ 339 + "anstyle", 340 + "once_cell_polyfill", 341 + "windows-sys 0.60.2", 342 + ] 343 + 344 + [[package]] 345 + name = "anyhow" 346 + version = "1.0.100" 347 + source = "registry+https://github.com/rust-lang/crates.io-index" 348 + checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" 349 + 350 + [[package]] 351 + name = "async-compression" 352 + version = "0.4.32" 353 + source = "registry+https://github.com/rust-lang/crates.io-index" 354 + checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" 355 + dependencies = [ 356 + "compression-codecs", 357 + "compression-core", 358 + "futures-core", 359 + "pin-project-lite", 360 + "tokio", 361 + ] 362 + 363 + [[package]] 364 + name = "async-lock" 365 + version = "3.4.1" 366 + source = "registry+https://github.com/rust-lang/crates.io-index" 367 + checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" 368 + dependencies = [ 369 + "event-listener", 370 + "event-listener-strategy", 371 + "pin-project-lite", 372 + ] 373 + 374 + [[package]] 375 + name = "async-trait" 376 + version = "0.1.89" 377 + source = "registry+https://github.com/rust-lang/crates.io-index" 378 + checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" 379 + dependencies = [ 380 + "proc-macro2", 381 + "quote", 382 + "syn 2.0.106", 383 + ] 384 + 385 + [[package]] 386 + name = "at-me" 387 + version = "0.1.0" 388 + dependencies = [ 389 + "actix-session", 390 + "actix-web", 391 + "atrium-api", 392 + "atrium-common", 393 + "atrium-identity", 394 + "atrium-oauth", 395 + "env_logger", 396 + "hickory-resolver", 397 + "log", 398 + "serde", 399 + "serde_json", 400 + "tokio", 401 + ] 402 + 403 + [[package]] 404 + name = "atomic-waker" 405 + version = "1.1.2" 406 + source = "registry+https://github.com/rust-lang/crates.io-index" 407 + checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 408 + 409 + [[package]] 410 + name = "atrium-api" 411 + version = "0.25.6" 412 + source = "registry+https://github.com/rust-lang/crates.io-index" 413 + checksum = "ef9d5e9352fd27d99383ae1db2b6a6aa239e683a7e750e8d73a73996d82b1fd2" 414 + dependencies = [ 415 + "atrium-common", 416 + "atrium-xrpc", 417 + "chrono", 418 + "http 1.3.1", 419 + "ipld-core", 420 + "langtag", 421 + "regex", 422 + "serde", 423 + "serde_bytes", 424 + "serde_json", 425 + "thiserror", 426 + "tokio", 427 + "trait-variant", 428 + ] 429 + 430 + [[package]] 431 + name = "atrium-common" 432 + version = "0.1.2" 433 + source = "registry+https://github.com/rust-lang/crates.io-index" 434 + checksum = "9ed5610654043faa396a5a15afac0ac646d76aebe45aebd7cef4f8b96b0ab7f4" 435 + dependencies = [ 436 + "dashmap", 437 + "lru", 438 + "moka", 439 + "thiserror", 440 + "tokio", 441 + "trait-variant", 442 + "web-time", 443 + ] 444 + 445 + [[package]] 446 + name = "atrium-identity" 447 + version = "0.1.7" 448 + source = "registry+https://github.com/rust-lang/crates.io-index" 449 + checksum = "4d3a56cd2bb695308cb078be80a46a7a2caf79203eda27803f13ee6a38b98378" 450 + dependencies = [ 451 + "atrium-api", 452 + "atrium-common", 453 + "atrium-xrpc", 454 + "serde", 455 + "serde_html_form", 456 + "serde_json", 457 + "thiserror", 458 + "trait-variant", 459 + ] 460 + 461 + [[package]] 462 + name = "atrium-oauth" 463 + version = "0.1.5" 464 + source = "registry+https://github.com/rust-lang/crates.io-index" 465 + checksum = "6969f29ff0a4100d05d3988f012504385ff1d7c9db82410e26830ded8da621fb" 466 + dependencies = [ 467 + "atrium-api", 468 + "atrium-common", 469 + "atrium-identity", 470 + "atrium-xrpc", 471 + "base64 0.22.1", 472 + "chrono", 473 + "dashmap", 474 + "ecdsa", 475 + "elliptic-curve", 476 + "jose-jwa", 477 + "jose-jwk", 478 + "p256", 479 + "rand 0.8.5", 480 + "reqwest", 481 + "serde", 482 + "serde_html_form", 483 + "serde_json", 484 + "sha2", 485 + "thiserror", 486 + "tokio", 487 + "trait-variant", 488 + ] 489 + 490 + [[package]] 491 + name = "atrium-xrpc" 492 + version = "0.12.3" 493 + source = "registry+https://github.com/rust-lang/crates.io-index" 494 + checksum = "0216ad50ce34e9ff982e171c3659e65dedaa2ed5ac2994524debdc9a9647ffa8" 495 + dependencies = [ 496 + "http 1.3.1", 497 + "serde", 498 + "serde_html_form", 499 + "serde_json", 500 + "thiserror", 501 + "trait-variant", 502 + ] 503 + 504 + [[package]] 505 + name = "autocfg" 506 + version = "1.5.0" 507 + source = "registry+https://github.com/rust-lang/crates.io-index" 508 + checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 509 + 510 + [[package]] 511 + name = "backtrace" 512 + version = "0.3.76" 513 + source = "registry+https://github.com/rust-lang/crates.io-index" 514 + checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" 515 + dependencies = [ 516 + "addr2line", 517 + "cfg-if", 518 + "libc", 519 + "miniz_oxide", 520 + "object", 521 + "rustc-demangle", 522 + "windows-link", 523 + ] 524 + 525 + [[package]] 526 + name = "base-x" 527 + version = "0.2.11" 528 + source = "registry+https://github.com/rust-lang/crates.io-index" 529 + checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" 530 + 531 + [[package]] 532 + name = "base16ct" 533 + version = "0.2.0" 534 + source = "registry+https://github.com/rust-lang/crates.io-index" 535 + checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" 536 + 537 + [[package]] 538 + name = "base256emoji" 539 + version = "1.0.2" 540 + source = "registry+https://github.com/rust-lang/crates.io-index" 541 + checksum = "b5e9430d9a245a77c92176e649af6e275f20839a48389859d1661e9a128d077c" 542 + dependencies = [ 543 + "const-str", 544 + "match-lookup", 545 + ] 546 + 547 + [[package]] 548 + name = "base64" 549 + version = "0.20.0" 550 + source = "registry+https://github.com/rust-lang/crates.io-index" 551 + checksum = "0ea22880d78093b0cbe17c89f64a7d457941e65759157ec6cb31a31d652b05e5" 552 + 553 + [[package]] 554 + name = "base64" 555 + version = "0.22.1" 556 + source = "registry+https://github.com/rust-lang/crates.io-index" 557 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 558 + 559 + [[package]] 560 + name = "base64ct" 561 + version = "1.8.0" 562 + source = "registry+https://github.com/rust-lang/crates.io-index" 563 + checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" 564 + 565 + [[package]] 566 + name = "bitflags" 567 + version = "2.9.4" 568 + source = "registry+https://github.com/rust-lang/crates.io-index" 569 + checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" 570 + 571 + [[package]] 572 + name = "block-buffer" 573 + version = "0.10.4" 574 + source = "registry+https://github.com/rust-lang/crates.io-index" 575 + checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 576 + dependencies = [ 577 + "generic-array", 578 + ] 579 + 580 + [[package]] 581 + name = "brotli" 582 + version = "8.0.2" 583 + source = "registry+https://github.com/rust-lang/crates.io-index" 584 + checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" 585 + dependencies = [ 586 + "alloc-no-stdlib", 587 + "alloc-stdlib", 588 + "brotli-decompressor", 589 + ] 590 + 591 + [[package]] 592 + name = "brotli-decompressor" 593 + version = "5.0.0" 594 + source = "registry+https://github.com/rust-lang/crates.io-index" 595 + checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" 596 + dependencies = [ 597 + "alloc-no-stdlib", 598 + "alloc-stdlib", 599 + ] 600 + 601 + [[package]] 602 + name = "bumpalo" 603 + version = "3.19.0" 604 + source = "registry+https://github.com/rust-lang/crates.io-index" 605 + checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 606 + 607 + [[package]] 608 + name = "bytes" 609 + version = "1.10.1" 610 + source = "registry+https://github.com/rust-lang/crates.io-index" 611 + checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 612 + 613 + [[package]] 614 + name = "bytestring" 615 + version = "1.5.0" 616 + source = "registry+https://github.com/rust-lang/crates.io-index" 617 + checksum = "113b4343b5f6617e7ad401ced8de3cc8b012e73a594347c307b90db3e9271289" 618 + dependencies = [ 619 + "bytes", 620 + ] 621 + 622 + [[package]] 623 + name = "cc" 624 + version = "1.2.40" 625 + source = "registry+https://github.com/rust-lang/crates.io-index" 626 + checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" 627 + dependencies = [ 628 + "find-msvc-tools", 629 + "jobserver", 630 + "libc", 631 + "shlex", 632 + ] 633 + 634 + [[package]] 635 + name = "cfg-if" 636 + version = "1.0.3" 637 + source = "registry+https://github.com/rust-lang/crates.io-index" 638 + checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" 639 + 640 + [[package]] 641 + name = "chrono" 642 + version = "0.4.42" 643 + source = "registry+https://github.com/rust-lang/crates.io-index" 644 + checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" 645 + dependencies = [ 646 + "iana-time-zone", 647 + "js-sys", 648 + "num-traits", 649 + "serde", 650 + "wasm-bindgen", 651 + "windows-link", 652 + ] 653 + 654 + [[package]] 655 + name = "cid" 656 + version = "0.11.1" 657 + source = "registry+https://github.com/rust-lang/crates.io-index" 658 + checksum = "3147d8272e8fa0ccd29ce51194dd98f79ddfb8191ba9e3409884e751798acf3a" 659 + dependencies = [ 660 + "core2", 661 + "multibase", 662 + "multihash", 663 + "serde", 664 + "serde_bytes", 665 + "unsigned-varint", 666 + ] 667 + 668 + [[package]] 669 + name = "cipher" 670 + version = "0.4.4" 671 + source = "registry+https://github.com/rust-lang/crates.io-index" 672 + checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" 673 + dependencies = [ 674 + "crypto-common", 675 + "inout", 676 + ] 677 + 678 + [[package]] 679 + name = "colorchoice" 680 + version = "1.0.4" 681 + source = "registry+https://github.com/rust-lang/crates.io-index" 682 + checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 683 + 684 + [[package]] 685 + name = "compression-codecs" 686 + version = "0.4.31" 687 + source = "registry+https://github.com/rust-lang/crates.io-index" 688 + checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" 689 + dependencies = [ 690 + "compression-core", 691 + "flate2", 692 + "memchr", 693 + ] 694 + 695 + [[package]] 696 + name = "compression-core" 697 + version = "0.4.29" 698 + source = "registry+https://github.com/rust-lang/crates.io-index" 699 + checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" 700 + 701 + [[package]] 702 + name = "concurrent-queue" 703 + version = "2.5.0" 704 + source = "registry+https://github.com/rust-lang/crates.io-index" 705 + checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 706 + dependencies = [ 707 + "crossbeam-utils", 708 + ] 709 + 710 + [[package]] 711 + name = "const-oid" 712 + version = "0.9.6" 713 + source = "registry+https://github.com/rust-lang/crates.io-index" 714 + checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 715 + 716 + [[package]] 717 + name = "const-str" 718 + version = "0.4.3" 719 + source = "registry+https://github.com/rust-lang/crates.io-index" 720 + checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" 721 + 722 + [[package]] 723 + name = "cookie" 724 + version = "0.16.2" 725 + source = "registry+https://github.com/rust-lang/crates.io-index" 726 + checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" 727 + dependencies = [ 728 + "aes-gcm", 729 + "base64 0.20.0", 730 + "hkdf", 731 + "hmac", 732 + "percent-encoding", 733 + "rand 0.8.5", 734 + "sha2", 735 + "subtle", 736 + "time", 737 + "version_check", 738 + ] 739 + 740 + [[package]] 741 + name = "core-foundation" 742 + version = "0.9.4" 743 + source = "registry+https://github.com/rust-lang/crates.io-index" 744 + checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 745 + dependencies = [ 746 + "core-foundation-sys", 747 + "libc", 748 + ] 749 + 750 + [[package]] 751 + name = "core-foundation-sys" 752 + version = "0.8.7" 753 + source = "registry+https://github.com/rust-lang/crates.io-index" 754 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 755 + 756 + [[package]] 757 + name = "core2" 758 + version = "0.4.0" 759 + source = "registry+https://github.com/rust-lang/crates.io-index" 760 + checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" 761 + dependencies = [ 762 + "memchr", 763 + ] 764 + 765 + [[package]] 766 + name = "cpufeatures" 767 + version = "0.2.17" 768 + source = "registry+https://github.com/rust-lang/crates.io-index" 769 + checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 770 + dependencies = [ 771 + "libc", 772 + ] 773 + 774 + [[package]] 775 + name = "crc32fast" 776 + version = "1.5.0" 777 + source = "registry+https://github.com/rust-lang/crates.io-index" 778 + checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" 779 + dependencies = [ 780 + "cfg-if", 781 + ] 782 + 783 + [[package]] 784 + name = "crossbeam-channel" 785 + version = "0.5.15" 786 + source = "registry+https://github.com/rust-lang/crates.io-index" 787 + checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" 788 + dependencies = [ 789 + "crossbeam-utils", 790 + ] 791 + 792 + [[package]] 793 + name = "crossbeam-epoch" 794 + version = "0.9.18" 795 + source = "registry+https://github.com/rust-lang/crates.io-index" 796 + checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 797 + dependencies = [ 798 + "crossbeam-utils", 799 + ] 800 + 801 + [[package]] 802 + name = "crossbeam-utils" 803 + version = "0.8.21" 804 + source = "registry+https://github.com/rust-lang/crates.io-index" 805 + checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 806 + 807 + [[package]] 808 + name = "crypto-bigint" 809 + version = "0.5.5" 810 + source = "registry+https://github.com/rust-lang/crates.io-index" 811 + checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" 812 + dependencies = [ 813 + "generic-array", 814 + "rand_core 0.6.4", 815 + "subtle", 816 + "zeroize", 817 + ] 818 + 819 + [[package]] 820 + name = "crypto-common" 821 + version = "0.1.6" 822 + source = "registry+https://github.com/rust-lang/crates.io-index" 823 + checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 824 + dependencies = [ 825 + "generic-array", 826 + "rand_core 0.6.4", 827 + "typenum", 828 + ] 829 + 830 + [[package]] 831 + name = "ctr" 832 + version = "0.9.2" 833 + source = "registry+https://github.com/rust-lang/crates.io-index" 834 + checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" 835 + dependencies = [ 836 + "cipher", 837 + ] 838 + 839 + [[package]] 840 + name = "dashmap" 841 + version = "6.1.0" 842 + source = "registry+https://github.com/rust-lang/crates.io-index" 843 + checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" 844 + dependencies = [ 845 + "cfg-if", 846 + "crossbeam-utils", 847 + "hashbrown 0.14.5", 848 + "lock_api", 849 + "once_cell", 850 + "parking_lot_core", 851 + ] 852 + 853 + [[package]] 854 + name = "data-encoding" 855 + version = "2.9.0" 856 + source = "registry+https://github.com/rust-lang/crates.io-index" 857 + checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" 858 + 859 + [[package]] 860 + name = "data-encoding-macro" 861 + version = "0.1.18" 862 + source = "registry+https://github.com/rust-lang/crates.io-index" 863 + checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d" 864 + dependencies = [ 865 + "data-encoding", 866 + "data-encoding-macro-internal", 867 + ] 868 + 869 + [[package]] 870 + name = "data-encoding-macro-internal" 871 + version = "0.1.16" 872 + source = "registry+https://github.com/rust-lang/crates.io-index" 873 + checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" 874 + dependencies = [ 875 + "data-encoding", 876 + "syn 2.0.106", 877 + ] 878 + 879 + [[package]] 880 + name = "der" 881 + version = "0.7.10" 882 + source = "registry+https://github.com/rust-lang/crates.io-index" 883 + checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" 884 + dependencies = [ 885 + "const-oid", 886 + "zeroize", 887 + ] 888 + 889 + [[package]] 890 + name = "deranged" 891 + version = "0.5.4" 892 + source = "registry+https://github.com/rust-lang/crates.io-index" 893 + checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" 894 + dependencies = [ 895 + "powerfmt", 896 + ] 897 + 898 + [[package]] 899 + name = "derive_more" 900 + version = "1.0.0" 901 + source = "registry+https://github.com/rust-lang/crates.io-index" 902 + checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" 903 + dependencies = [ 904 + "derive_more-impl 1.0.0", 905 + ] 906 + 907 + [[package]] 908 + name = "derive_more" 909 + version = "2.0.1" 910 + source = "registry+https://github.com/rust-lang/crates.io-index" 911 + checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" 912 + dependencies = [ 913 + "derive_more-impl 2.0.1", 914 + ] 915 + 916 + [[package]] 917 + name = "derive_more-impl" 918 + version = "1.0.0" 919 + source = "registry+https://github.com/rust-lang/crates.io-index" 920 + checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" 921 + dependencies = [ 922 + "proc-macro2", 923 + "quote", 924 + "syn 2.0.106", 925 + "unicode-xid", 926 + ] 927 + 928 + [[package]] 929 + name = "derive_more-impl" 930 + version = "2.0.1" 931 + source = "registry+https://github.com/rust-lang/crates.io-index" 932 + checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" 933 + dependencies = [ 934 + "proc-macro2", 935 + "quote", 936 + "syn 2.0.106", 937 + "unicode-xid", 938 + ] 939 + 940 + [[package]] 941 + name = "digest" 942 + version = "0.10.7" 943 + source = "registry+https://github.com/rust-lang/crates.io-index" 944 + checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 945 + dependencies = [ 946 + "block-buffer", 947 + "const-oid", 948 + "crypto-common", 949 + "subtle", 950 + ] 951 + 952 + [[package]] 953 + name = "displaydoc" 954 + version = "0.2.5" 955 + source = "registry+https://github.com/rust-lang/crates.io-index" 956 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 957 + dependencies = [ 958 + "proc-macro2", 959 + "quote", 960 + "syn 2.0.106", 961 + ] 962 + 963 + [[package]] 964 + name = "ecdsa" 965 + version = "0.16.9" 966 + source = "registry+https://github.com/rust-lang/crates.io-index" 967 + checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" 968 + dependencies = [ 969 + "der", 970 + "digest", 971 + "elliptic-curve", 972 + "rfc6979", 973 + "signature", 974 + ] 975 + 976 + [[package]] 977 + name = "elliptic-curve" 978 + version = "0.13.8" 979 + source = "registry+https://github.com/rust-lang/crates.io-index" 980 + checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" 981 + dependencies = [ 982 + "base16ct", 983 + "crypto-bigint", 984 + "digest", 985 + "ff", 986 + "generic-array", 987 + "group", 988 + "rand_core 0.6.4", 989 + "sec1", 990 + "subtle", 991 + "zeroize", 992 + ] 993 + 994 + [[package]] 995 + name = "encoding_rs" 996 + version = "0.8.35" 997 + source = "registry+https://github.com/rust-lang/crates.io-index" 998 + checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 999 + dependencies = [ 1000 + "cfg-if", 1001 + ] 1002 + 1003 + [[package]] 1004 + name = "enum-as-inner" 1005 + version = "0.6.1" 1006 + source = "registry+https://github.com/rust-lang/crates.io-index" 1007 + checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" 1008 + dependencies = [ 1009 + "heck", 1010 + "proc-macro2", 1011 + "quote", 1012 + "syn 2.0.106", 1013 + ] 1014 + 1015 + [[package]] 1016 + name = "env_filter" 1017 + version = "0.1.3" 1018 + source = "registry+https://github.com/rust-lang/crates.io-index" 1019 + checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" 1020 + dependencies = [ 1021 + "log", 1022 + "regex", 1023 + ] 1024 + 1025 + [[package]] 1026 + name = "env_logger" 1027 + version = "0.11.8" 1028 + source = "registry+https://github.com/rust-lang/crates.io-index" 1029 + checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" 1030 + dependencies = [ 1031 + "anstream", 1032 + "anstyle", 1033 + "env_filter", 1034 + "jiff", 1035 + "log", 1036 + ] 1037 + 1038 + [[package]] 1039 + name = "equivalent" 1040 + version = "1.0.2" 1041 + source = "registry+https://github.com/rust-lang/crates.io-index" 1042 + checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 1043 + 1044 + [[package]] 1045 + name = "errno" 1046 + version = "0.3.14" 1047 + source = "registry+https://github.com/rust-lang/crates.io-index" 1048 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 1049 + dependencies = [ 1050 + "libc", 1051 + "windows-sys 0.61.1", 1052 + ] 1053 + 1054 + [[package]] 1055 + name = "event-listener" 1056 + version = "5.4.1" 1057 + source = "registry+https://github.com/rust-lang/crates.io-index" 1058 + checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" 1059 + dependencies = [ 1060 + "concurrent-queue", 1061 + "parking", 1062 + "pin-project-lite", 1063 + ] 1064 + 1065 + [[package]] 1066 + name = "event-listener-strategy" 1067 + version = "0.5.4" 1068 + source = "registry+https://github.com/rust-lang/crates.io-index" 1069 + checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" 1070 + dependencies = [ 1071 + "event-listener", 1072 + "pin-project-lite", 1073 + ] 1074 + 1075 + [[package]] 1076 + name = "fastrand" 1077 + version = "2.3.0" 1078 + source = "registry+https://github.com/rust-lang/crates.io-index" 1079 + checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 1080 + 1081 + [[package]] 1082 + name = "ff" 1083 + version = "0.13.1" 1084 + source = "registry+https://github.com/rust-lang/crates.io-index" 1085 + checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" 1086 + dependencies = [ 1087 + "rand_core 0.6.4", 1088 + "subtle", 1089 + ] 1090 + 1091 + [[package]] 1092 + name = "find-msvc-tools" 1093 + version = "0.1.3" 1094 + source = "registry+https://github.com/rust-lang/crates.io-index" 1095 + checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" 1096 + 1097 + [[package]] 1098 + name = "flate2" 1099 + version = "1.1.4" 1100 + source = "registry+https://github.com/rust-lang/crates.io-index" 1101 + checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" 1102 + dependencies = [ 1103 + "crc32fast", 1104 + "miniz_oxide", 1105 + ] 1106 + 1107 + [[package]] 1108 + name = "fnv" 1109 + version = "1.0.7" 1110 + source = "registry+https://github.com/rust-lang/crates.io-index" 1111 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1112 + 1113 + [[package]] 1114 + name = "foldhash" 1115 + version = "0.1.5" 1116 + source = "registry+https://github.com/rust-lang/crates.io-index" 1117 + checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 1118 + 1119 + [[package]] 1120 + name = "foreign-types" 1121 + version = "0.3.2" 1122 + source = "registry+https://github.com/rust-lang/crates.io-index" 1123 + checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 1124 + dependencies = [ 1125 + "foreign-types-shared", 1126 + ] 1127 + 1128 + [[package]] 1129 + name = "foreign-types-shared" 1130 + version = "0.1.1" 1131 + source = "registry+https://github.com/rust-lang/crates.io-index" 1132 + checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 1133 + 1134 + [[package]] 1135 + name = "form_urlencoded" 1136 + version = "1.2.2" 1137 + source = "registry+https://github.com/rust-lang/crates.io-index" 1138 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 1139 + dependencies = [ 1140 + "percent-encoding", 1141 + ] 1142 + 1143 + [[package]] 1144 + name = "futures-channel" 1145 + version = "0.3.31" 1146 + source = "registry+https://github.com/rust-lang/crates.io-index" 1147 + checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 1148 + dependencies = [ 1149 + "futures-core", 1150 + ] 1151 + 1152 + [[package]] 1153 + name = "futures-core" 1154 + version = "0.3.31" 1155 + source = "registry+https://github.com/rust-lang/crates.io-index" 1156 + checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 1157 + 1158 + [[package]] 1159 + name = "futures-io" 1160 + version = "0.3.31" 1161 + source = "registry+https://github.com/rust-lang/crates.io-index" 1162 + checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 1163 + 1164 + [[package]] 1165 + name = "futures-macro" 1166 + version = "0.3.31" 1167 + source = "registry+https://github.com/rust-lang/crates.io-index" 1168 + checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 1169 + dependencies = [ 1170 + "proc-macro2", 1171 + "quote", 1172 + "syn 2.0.106", 1173 + ] 1174 + 1175 + [[package]] 1176 + name = "futures-sink" 1177 + version = "0.3.31" 1178 + source = "registry+https://github.com/rust-lang/crates.io-index" 1179 + checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 1180 + 1181 + [[package]] 1182 + name = "futures-task" 1183 + version = "0.3.31" 1184 + source = "registry+https://github.com/rust-lang/crates.io-index" 1185 + checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 1186 + 1187 + [[package]] 1188 + name = "futures-util" 1189 + version = "0.3.31" 1190 + source = "registry+https://github.com/rust-lang/crates.io-index" 1191 + checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 1192 + dependencies = [ 1193 + "futures-core", 1194 + "futures-macro", 1195 + "futures-task", 1196 + "pin-project-lite", 1197 + "pin-utils", 1198 + "slab", 1199 + ] 1200 + 1201 + [[package]] 1202 + name = "generic-array" 1203 + version = "0.14.7" 1204 + source = "registry+https://github.com/rust-lang/crates.io-index" 1205 + checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1206 + dependencies = [ 1207 + "typenum", 1208 + "version_check", 1209 + "zeroize", 1210 + ] 1211 + 1212 + [[package]] 1213 + name = "getrandom" 1214 + version = "0.2.16" 1215 + source = "registry+https://github.com/rust-lang/crates.io-index" 1216 + checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 1217 + dependencies = [ 1218 + "cfg-if", 1219 + "libc", 1220 + "wasi 0.11.1+wasi-snapshot-preview1", 1221 + ] 1222 + 1223 + [[package]] 1224 + name = "getrandom" 1225 + version = "0.3.3" 1226 + source = "registry+https://github.com/rust-lang/crates.io-index" 1227 + checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 1228 + dependencies = [ 1229 + "cfg-if", 1230 + "libc", 1231 + "r-efi", 1232 + "wasi 0.14.7+wasi-0.2.4", 1233 + ] 1234 + 1235 + [[package]] 1236 + name = "ghash" 1237 + version = "0.5.1" 1238 + source = "registry+https://github.com/rust-lang/crates.io-index" 1239 + checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" 1240 + dependencies = [ 1241 + "opaque-debug", 1242 + "polyval", 1243 + ] 1244 + 1245 + [[package]] 1246 + name = "gimli" 1247 + version = "0.32.3" 1248 + source = "registry+https://github.com/rust-lang/crates.io-index" 1249 + checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" 1250 + 1251 + [[package]] 1252 + name = "group" 1253 + version = "0.13.0" 1254 + source = "registry+https://github.com/rust-lang/crates.io-index" 1255 + checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" 1256 + dependencies = [ 1257 + "ff", 1258 + "rand_core 0.6.4", 1259 + "subtle", 1260 + ] 1261 + 1262 + [[package]] 1263 + name = "h2" 1264 + version = "0.3.27" 1265 + source = "registry+https://github.com/rust-lang/crates.io-index" 1266 + checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" 1267 + dependencies = [ 1268 + "bytes", 1269 + "fnv", 1270 + "futures-core", 1271 + "futures-sink", 1272 + "futures-util", 1273 + "http 0.2.12", 1274 + "indexmap", 1275 + "slab", 1276 + "tokio", 1277 + "tokio-util", 1278 + "tracing", 1279 + ] 1280 + 1281 + [[package]] 1282 + name = "hashbrown" 1283 + version = "0.14.5" 1284 + source = "registry+https://github.com/rust-lang/crates.io-index" 1285 + checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 1286 + 1287 + [[package]] 1288 + name = "hashbrown" 1289 + version = "0.15.5" 1290 + source = "registry+https://github.com/rust-lang/crates.io-index" 1291 + checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 1292 + dependencies = [ 1293 + "allocator-api2", 1294 + "equivalent", 1295 + "foldhash", 1296 + ] 1297 + 1298 + [[package]] 1299 + name = "hashbrown" 1300 + version = "0.16.0" 1301 + source = "registry+https://github.com/rust-lang/crates.io-index" 1302 + checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" 1303 + 1304 + [[package]] 1305 + name = "heck" 1306 + version = "0.5.0" 1307 + source = "registry+https://github.com/rust-lang/crates.io-index" 1308 + checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 1309 + 1310 + [[package]] 1311 + name = "hickory-proto" 1312 + version = "0.24.4" 1313 + source = "registry+https://github.com/rust-lang/crates.io-index" 1314 + checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248" 1315 + dependencies = [ 1316 + "async-trait", 1317 + "cfg-if", 1318 + "data-encoding", 1319 + "enum-as-inner", 1320 + "futures-channel", 1321 + "futures-io", 1322 + "futures-util", 1323 + "idna", 1324 + "ipnet", 1325 + "once_cell", 1326 + "rand 0.8.5", 1327 + "thiserror", 1328 + "tinyvec", 1329 + "tokio", 1330 + "tracing", 1331 + "url", 1332 + ] 1333 + 1334 + [[package]] 1335 + name = "hickory-resolver" 1336 + version = "0.24.4" 1337 + source = "registry+https://github.com/rust-lang/crates.io-index" 1338 + checksum = "cbb117a1ca520e111743ab2f6688eddee69db4e0ea242545a604dce8a66fd22e" 1339 + dependencies = [ 1340 + "cfg-if", 1341 + "futures-util", 1342 + "hickory-proto", 1343 + "ipconfig", 1344 + "lru-cache", 1345 + "once_cell", 1346 + "parking_lot", 1347 + "rand 0.8.5", 1348 + "resolv-conf", 1349 + "smallvec", 1350 + "thiserror", 1351 + "tokio", 1352 + "tracing", 1353 + ] 1354 + 1355 + [[package]] 1356 + name = "hkdf" 1357 + version = "0.12.4" 1358 + source = "registry+https://github.com/rust-lang/crates.io-index" 1359 + checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" 1360 + dependencies = [ 1361 + "hmac", 1362 + ] 1363 + 1364 + [[package]] 1365 + name = "hmac" 1366 + version = "0.12.1" 1367 + source = "registry+https://github.com/rust-lang/crates.io-index" 1368 + checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 1369 + dependencies = [ 1370 + "digest", 1371 + ] 1372 + 1373 + [[package]] 1374 + name = "http" 1375 + version = "0.2.12" 1376 + source = "registry+https://github.com/rust-lang/crates.io-index" 1377 + checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 1378 + dependencies = [ 1379 + "bytes", 1380 + "fnv", 1381 + "itoa", 1382 + ] 1383 + 1384 + [[package]] 1385 + name = "http" 1386 + version = "1.3.1" 1387 + source = "registry+https://github.com/rust-lang/crates.io-index" 1388 + checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 1389 + dependencies = [ 1390 + "bytes", 1391 + "fnv", 1392 + "itoa", 1393 + ] 1394 + 1395 + [[package]] 1396 + name = "http-body" 1397 + version = "1.0.1" 1398 + source = "registry+https://github.com/rust-lang/crates.io-index" 1399 + checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 1400 + dependencies = [ 1401 + "bytes", 1402 + "http 1.3.1", 1403 + ] 1404 + 1405 + [[package]] 1406 + name = "http-body-util" 1407 + version = "0.1.3" 1408 + source = "registry+https://github.com/rust-lang/crates.io-index" 1409 + checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 1410 + dependencies = [ 1411 + "bytes", 1412 + "futures-core", 1413 + "http 1.3.1", 1414 + "http-body", 1415 + "pin-project-lite", 1416 + ] 1417 + 1418 + [[package]] 1419 + name = "httparse" 1420 + version = "1.10.1" 1421 + source = "registry+https://github.com/rust-lang/crates.io-index" 1422 + checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 1423 + 1424 + [[package]] 1425 + name = "httpdate" 1426 + version = "1.0.3" 1427 + source = "registry+https://github.com/rust-lang/crates.io-index" 1428 + checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 1429 + 1430 + [[package]] 1431 + name = "hyper" 1432 + version = "1.7.0" 1433 + source = "registry+https://github.com/rust-lang/crates.io-index" 1434 + checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" 1435 + dependencies = [ 1436 + "atomic-waker", 1437 + "bytes", 1438 + "futures-channel", 1439 + "futures-core", 1440 + "http 1.3.1", 1441 + "http-body", 1442 + "httparse", 1443 + "itoa", 1444 + "pin-project-lite", 1445 + "pin-utils", 1446 + "smallvec", 1447 + "tokio", 1448 + "want", 1449 + ] 1450 + 1451 + [[package]] 1452 + name = "hyper-tls" 1453 + version = "0.6.0" 1454 + source = "registry+https://github.com/rust-lang/crates.io-index" 1455 + checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 1456 + dependencies = [ 1457 + "bytes", 1458 + "http-body-util", 1459 + "hyper", 1460 + "hyper-util", 1461 + "native-tls", 1462 + "tokio", 1463 + "tokio-native-tls", 1464 + "tower-service", 1465 + ] 1466 + 1467 + [[package]] 1468 + name = "hyper-util" 1469 + version = "0.1.17" 1470 + source = "registry+https://github.com/rust-lang/crates.io-index" 1471 + checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" 1472 + dependencies = [ 1473 + "base64 0.22.1", 1474 + "bytes", 1475 + "futures-channel", 1476 + "futures-core", 1477 + "futures-util", 1478 + "http 1.3.1", 1479 + "http-body", 1480 + "hyper", 1481 + "ipnet", 1482 + "libc", 1483 + "percent-encoding", 1484 + "pin-project-lite", 1485 + "socket2 0.6.0", 1486 + "tokio", 1487 + "tower-service", 1488 + "tracing", 1489 + ] 1490 + 1491 + [[package]] 1492 + name = "iana-time-zone" 1493 + version = "0.1.64" 1494 + source = "registry+https://github.com/rust-lang/crates.io-index" 1495 + checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" 1496 + dependencies = [ 1497 + "android_system_properties", 1498 + "core-foundation-sys", 1499 + "iana-time-zone-haiku", 1500 + "js-sys", 1501 + "log", 1502 + "wasm-bindgen", 1503 + "windows-core", 1504 + ] 1505 + 1506 + [[package]] 1507 + name = "iana-time-zone-haiku" 1508 + version = "0.1.2" 1509 + source = "registry+https://github.com/rust-lang/crates.io-index" 1510 + checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1511 + dependencies = [ 1512 + "cc", 1513 + ] 1514 + 1515 + [[package]] 1516 + name = "icu_collections" 1517 + version = "2.0.0" 1518 + source = "registry+https://github.com/rust-lang/crates.io-index" 1519 + checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 1520 + dependencies = [ 1521 + "displaydoc", 1522 + "potential_utf", 1523 + "yoke", 1524 + "zerofrom", 1525 + "zerovec", 1526 + ] 1527 + 1528 + [[package]] 1529 + name = "icu_locale_core" 1530 + version = "2.0.0" 1531 + source = "registry+https://github.com/rust-lang/crates.io-index" 1532 + checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 1533 + dependencies = [ 1534 + "displaydoc", 1535 + "litemap", 1536 + "tinystr", 1537 + "writeable", 1538 + "zerovec", 1539 + ] 1540 + 1541 + [[package]] 1542 + name = "icu_normalizer" 1543 + version = "2.0.0" 1544 + source = "registry+https://github.com/rust-lang/crates.io-index" 1545 + checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 1546 + dependencies = [ 1547 + "displaydoc", 1548 + "icu_collections", 1549 + "icu_normalizer_data", 1550 + "icu_properties", 1551 + "icu_provider", 1552 + "smallvec", 1553 + "zerovec", 1554 + ] 1555 + 1556 + [[package]] 1557 + name = "icu_normalizer_data" 1558 + version = "2.0.0" 1559 + source = "registry+https://github.com/rust-lang/crates.io-index" 1560 + checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 1561 + 1562 + [[package]] 1563 + name = "icu_properties" 1564 + version = "2.0.1" 1565 + source = "registry+https://github.com/rust-lang/crates.io-index" 1566 + checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 1567 + dependencies = [ 1568 + "displaydoc", 1569 + "icu_collections", 1570 + "icu_locale_core", 1571 + "icu_properties_data", 1572 + "icu_provider", 1573 + "potential_utf", 1574 + "zerotrie", 1575 + "zerovec", 1576 + ] 1577 + 1578 + [[package]] 1579 + name = "icu_properties_data" 1580 + version = "2.0.1" 1581 + source = "registry+https://github.com/rust-lang/crates.io-index" 1582 + checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 1583 + 1584 + [[package]] 1585 + name = "icu_provider" 1586 + version = "2.0.0" 1587 + source = "registry+https://github.com/rust-lang/crates.io-index" 1588 + checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 1589 + dependencies = [ 1590 + "displaydoc", 1591 + "icu_locale_core", 1592 + "stable_deref_trait", 1593 + "tinystr", 1594 + "writeable", 1595 + "yoke", 1596 + "zerofrom", 1597 + "zerotrie", 1598 + "zerovec", 1599 + ] 1600 + 1601 + [[package]] 1602 + name = "idna" 1603 + version = "1.1.0" 1604 + source = "registry+https://github.com/rust-lang/crates.io-index" 1605 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 1606 + dependencies = [ 1607 + "idna_adapter", 1608 + "smallvec", 1609 + "utf8_iter", 1610 + ] 1611 + 1612 + [[package]] 1613 + name = "idna_adapter" 1614 + version = "1.2.1" 1615 + source = "registry+https://github.com/rust-lang/crates.io-index" 1616 + checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 1617 + dependencies = [ 1618 + "icu_normalizer", 1619 + "icu_properties", 1620 + ] 1621 + 1622 + [[package]] 1623 + name = "impl-more" 1624 + version = "0.1.9" 1625 + source = "registry+https://github.com/rust-lang/crates.io-index" 1626 + checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" 1627 + 1628 + [[package]] 1629 + name = "indexmap" 1630 + version = "2.11.4" 1631 + source = "registry+https://github.com/rust-lang/crates.io-index" 1632 + checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" 1633 + dependencies = [ 1634 + "equivalent", 1635 + "hashbrown 0.16.0", 1636 + ] 1637 + 1638 + [[package]] 1639 + name = "inout" 1640 + version = "0.1.4" 1641 + source = "registry+https://github.com/rust-lang/crates.io-index" 1642 + checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" 1643 + dependencies = [ 1644 + "generic-array", 1645 + ] 1646 + 1647 + [[package]] 1648 + name = "io-uring" 1649 + version = "0.7.10" 1650 + source = "registry+https://github.com/rust-lang/crates.io-index" 1651 + checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" 1652 + dependencies = [ 1653 + "bitflags", 1654 + "cfg-if", 1655 + "libc", 1656 + ] 1657 + 1658 + [[package]] 1659 + name = "ipconfig" 1660 + version = "0.3.2" 1661 + source = "registry+https://github.com/rust-lang/crates.io-index" 1662 + checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" 1663 + dependencies = [ 1664 + "socket2 0.5.10", 1665 + "widestring", 1666 + "windows-sys 0.48.0", 1667 + "winreg", 1668 + ] 1669 + 1670 + [[package]] 1671 + name = "ipld-core" 1672 + version = "0.4.2" 1673 + source = "registry+https://github.com/rust-lang/crates.io-index" 1674 + checksum = "104718b1cc124d92a6d01ca9c9258a7df311405debb3408c445a36452f9bf8db" 1675 + dependencies = [ 1676 + "cid", 1677 + "serde", 1678 + "serde_bytes", 1679 + ] 1680 + 1681 + [[package]] 1682 + name = "ipnet" 1683 + version = "2.11.0" 1684 + source = "registry+https://github.com/rust-lang/crates.io-index" 1685 + checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 1686 + 1687 + [[package]] 1688 + name = "iri-string" 1689 + version = "0.7.8" 1690 + source = "registry+https://github.com/rust-lang/crates.io-index" 1691 + checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 1692 + dependencies = [ 1693 + "memchr", 1694 + "serde", 1695 + ] 1696 + 1697 + [[package]] 1698 + name = "is_terminal_polyfill" 1699 + version = "1.70.1" 1700 + source = "registry+https://github.com/rust-lang/crates.io-index" 1701 + checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 1702 + 1703 + [[package]] 1704 + name = "itoa" 1705 + version = "1.0.15" 1706 + source = "registry+https://github.com/rust-lang/crates.io-index" 1707 + checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 1708 + 1709 + [[package]] 1710 + name = "jiff" 1711 + version = "0.2.15" 1712 + source = "registry+https://github.com/rust-lang/crates.io-index" 1713 + checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" 1714 + dependencies = [ 1715 + "jiff-static", 1716 + "log", 1717 + "portable-atomic", 1718 + "portable-atomic-util", 1719 + "serde", 1720 + ] 1721 + 1722 + [[package]] 1723 + name = "jiff-static" 1724 + version = "0.2.15" 1725 + source = "registry+https://github.com/rust-lang/crates.io-index" 1726 + checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" 1727 + dependencies = [ 1728 + "proc-macro2", 1729 + "quote", 1730 + "syn 2.0.106", 1731 + ] 1732 + 1733 + [[package]] 1734 + name = "jobserver" 1735 + version = "0.1.34" 1736 + source = "registry+https://github.com/rust-lang/crates.io-index" 1737 + checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" 1738 + dependencies = [ 1739 + "getrandom 0.3.3", 1740 + "libc", 1741 + ] 1742 + 1743 + [[package]] 1744 + name = "jose-b64" 1745 + version = "0.1.2" 1746 + source = "registry+https://github.com/rust-lang/crates.io-index" 1747 + checksum = "bec69375368709666b21c76965ce67549f2d2db7605f1f8707d17c9656801b56" 1748 + dependencies = [ 1749 + "base64ct", 1750 + "serde", 1751 + "subtle", 1752 + "zeroize", 1753 + ] 1754 + 1755 + [[package]] 1756 + name = "jose-jwa" 1757 + version = "0.1.2" 1758 + source = "registry+https://github.com/rust-lang/crates.io-index" 1759 + checksum = "9ab78e053fe886a351d67cf0d194c000f9d0dcb92906eb34d853d7e758a4b3a7" 1760 + dependencies = [ 1761 + "serde", 1762 + ] 1763 + 1764 + [[package]] 1765 + name = "jose-jwk" 1766 + version = "0.1.2" 1767 + source = "registry+https://github.com/rust-lang/crates.io-index" 1768 + checksum = "280fa263807fe0782ecb6f2baadc28dffc04e00558a58e33bfdb801d11fd58e7" 1769 + dependencies = [ 1770 + "jose-b64", 1771 + "jose-jwa", 1772 + "p256", 1773 + "serde", 1774 + "zeroize", 1775 + ] 1776 + 1777 + [[package]] 1778 + name = "js-sys" 1779 + version = "0.3.81" 1780 + source = "registry+https://github.com/rust-lang/crates.io-index" 1781 + checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" 1782 + dependencies = [ 1783 + "once_cell", 1784 + "wasm-bindgen", 1785 + ] 1786 + 1787 + [[package]] 1788 + name = "langtag" 1789 + version = "0.3.4" 1790 + source = "registry+https://github.com/rust-lang/crates.io-index" 1791 + checksum = "ed60c85f254d6ae8450cec15eedd921efbc4d1bdf6fcf6202b9a58b403f6f805" 1792 + dependencies = [ 1793 + "serde", 1794 + ] 1795 + 1796 + [[package]] 1797 + name = "language-tags" 1798 + version = "0.3.2" 1799 + source = "registry+https://github.com/rust-lang/crates.io-index" 1800 + checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" 1801 + 1802 + [[package]] 1803 + name = "libc" 1804 + version = "0.2.176" 1805 + source = "registry+https://github.com/rust-lang/crates.io-index" 1806 + checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" 1807 + 1808 + [[package]] 1809 + name = "linked-hash-map" 1810 + version = "0.5.6" 1811 + source = "registry+https://github.com/rust-lang/crates.io-index" 1812 + checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" 1813 + 1814 + [[package]] 1815 + name = "linux-raw-sys" 1816 + version = "0.11.0" 1817 + source = "registry+https://github.com/rust-lang/crates.io-index" 1818 + checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 1819 + 1820 + [[package]] 1821 + name = "litemap" 1822 + version = "0.8.0" 1823 + source = "registry+https://github.com/rust-lang/crates.io-index" 1824 + checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 1825 + 1826 + [[package]] 1827 + name = "local-channel" 1828 + version = "0.1.5" 1829 + source = "registry+https://github.com/rust-lang/crates.io-index" 1830 + checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" 1831 + dependencies = [ 1832 + "futures-core", 1833 + "futures-sink", 1834 + "local-waker", 1835 + ] 1836 + 1837 + [[package]] 1838 + name = "local-waker" 1839 + version = "0.1.4" 1840 + source = "registry+https://github.com/rust-lang/crates.io-index" 1841 + checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" 1842 + 1843 + [[package]] 1844 + name = "lock_api" 1845 + version = "0.4.14" 1846 + source = "registry+https://github.com/rust-lang/crates.io-index" 1847 + checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 1848 + dependencies = [ 1849 + "scopeguard", 1850 + ] 1851 + 1852 + [[package]] 1853 + name = "log" 1854 + version = "0.4.28" 1855 + source = "registry+https://github.com/rust-lang/crates.io-index" 1856 + checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 1857 + 1858 + [[package]] 1859 + name = "lru" 1860 + version = "0.12.5" 1861 + source = "registry+https://github.com/rust-lang/crates.io-index" 1862 + checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" 1863 + dependencies = [ 1864 + "hashbrown 0.15.5", 1865 + ] 1866 + 1867 + [[package]] 1868 + name = "lru-cache" 1869 + version = "0.1.2" 1870 + source = "registry+https://github.com/rust-lang/crates.io-index" 1871 + checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" 1872 + dependencies = [ 1873 + "linked-hash-map", 1874 + ] 1875 + 1876 + [[package]] 1877 + name = "match-lookup" 1878 + version = "0.1.1" 1879 + source = "registry+https://github.com/rust-lang/crates.io-index" 1880 + checksum = "1265724d8cb29dbbc2b0f06fffb8bf1a8c0cf73a78eede9ba73a4a66c52a981e" 1881 + dependencies = [ 1882 + "proc-macro2", 1883 + "quote", 1884 + "syn 1.0.109", 1885 + ] 1886 + 1887 + [[package]] 1888 + name = "memchr" 1889 + version = "2.7.6" 1890 + source = "registry+https://github.com/rust-lang/crates.io-index" 1891 + checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 1892 + 1893 + [[package]] 1894 + name = "mime" 1895 + version = "0.3.17" 1896 + source = "registry+https://github.com/rust-lang/crates.io-index" 1897 + checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1898 + 1899 + [[package]] 1900 + name = "miniz_oxide" 1901 + version = "0.8.9" 1902 + source = "registry+https://github.com/rust-lang/crates.io-index" 1903 + checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 1904 + dependencies = [ 1905 + "adler2", 1906 + "simd-adler32", 1907 + ] 1908 + 1909 + [[package]] 1910 + name = "mio" 1911 + version = "1.0.4" 1912 + source = "registry+https://github.com/rust-lang/crates.io-index" 1913 + checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 1914 + dependencies = [ 1915 + "libc", 1916 + "log", 1917 + "wasi 0.11.1+wasi-snapshot-preview1", 1918 + "windows-sys 0.59.0", 1919 + ] 1920 + 1921 + [[package]] 1922 + name = "moka" 1923 + version = "0.12.11" 1924 + source = "registry+https://github.com/rust-lang/crates.io-index" 1925 + checksum = "8261cd88c312e0004c1d51baad2980c66528dfdb2bee62003e643a4d8f86b077" 1926 + dependencies = [ 1927 + "async-lock", 1928 + "crossbeam-channel", 1929 + "crossbeam-epoch", 1930 + "crossbeam-utils", 1931 + "equivalent", 1932 + "event-listener", 1933 + "futures-util", 1934 + "parking_lot", 1935 + "portable-atomic", 1936 + "rustc_version", 1937 + "smallvec", 1938 + "tagptr", 1939 + "uuid", 1940 + ] 1941 + 1942 + [[package]] 1943 + name = "multibase" 1944 + version = "0.9.2" 1945 + source = "registry+https://github.com/rust-lang/crates.io-index" 1946 + checksum = "8694bb4835f452b0e3bb06dbebb1d6fc5385b6ca1caf2e55fd165c042390ec77" 1947 + dependencies = [ 1948 + "base-x", 1949 + "base256emoji", 1950 + "data-encoding", 1951 + "data-encoding-macro", 1952 + ] 1953 + 1954 + [[package]] 1955 + name = "multihash" 1956 + version = "0.19.3" 1957 + source = "registry+https://github.com/rust-lang/crates.io-index" 1958 + checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" 1959 + dependencies = [ 1960 + "core2", 1961 + "serde", 1962 + "unsigned-varint", 1963 + ] 1964 + 1965 + [[package]] 1966 + name = "native-tls" 1967 + version = "0.2.14" 1968 + source = "registry+https://github.com/rust-lang/crates.io-index" 1969 + checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 1970 + dependencies = [ 1971 + "libc", 1972 + "log", 1973 + "openssl", 1974 + "openssl-probe", 1975 + "openssl-sys", 1976 + "schannel", 1977 + "security-framework", 1978 + "security-framework-sys", 1979 + "tempfile", 1980 + ] 1981 + 1982 + [[package]] 1983 + name = "num-conv" 1984 + version = "0.1.0" 1985 + source = "registry+https://github.com/rust-lang/crates.io-index" 1986 + checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1987 + 1988 + [[package]] 1989 + name = "num-traits" 1990 + version = "0.2.19" 1991 + source = "registry+https://github.com/rust-lang/crates.io-index" 1992 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1993 + dependencies = [ 1994 + "autocfg", 1995 + ] 1996 + 1997 + [[package]] 1998 + name = "object" 1999 + version = "0.37.3" 2000 + source = "registry+https://github.com/rust-lang/crates.io-index" 2001 + checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" 2002 + dependencies = [ 2003 + "memchr", 2004 + ] 2005 + 2006 + [[package]] 2007 + name = "once_cell" 2008 + version = "1.21.3" 2009 + source = "registry+https://github.com/rust-lang/crates.io-index" 2010 + checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 2011 + 2012 + [[package]] 2013 + name = "once_cell_polyfill" 2014 + version = "1.70.1" 2015 + source = "registry+https://github.com/rust-lang/crates.io-index" 2016 + checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" 2017 + 2018 + [[package]] 2019 + name = "opaque-debug" 2020 + version = "0.3.1" 2021 + source = "registry+https://github.com/rust-lang/crates.io-index" 2022 + checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" 2023 + 2024 + [[package]] 2025 + name = "openssl" 2026 + version = "0.10.73" 2027 + source = "registry+https://github.com/rust-lang/crates.io-index" 2028 + checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" 2029 + dependencies = [ 2030 + "bitflags", 2031 + "cfg-if", 2032 + "foreign-types", 2033 + "libc", 2034 + "once_cell", 2035 + "openssl-macros", 2036 + "openssl-sys", 2037 + ] 2038 + 2039 + [[package]] 2040 + name = "openssl-macros" 2041 + version = "0.1.1" 2042 + source = "registry+https://github.com/rust-lang/crates.io-index" 2043 + checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 2044 + dependencies = [ 2045 + "proc-macro2", 2046 + "quote", 2047 + "syn 2.0.106", 2048 + ] 2049 + 2050 + [[package]] 2051 + name = "openssl-probe" 2052 + version = "0.1.6" 2053 + source = "registry+https://github.com/rust-lang/crates.io-index" 2054 + checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 2055 + 2056 + [[package]] 2057 + name = "openssl-sys" 2058 + version = "0.9.109" 2059 + source = "registry+https://github.com/rust-lang/crates.io-index" 2060 + checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" 2061 + dependencies = [ 2062 + "cc", 2063 + "libc", 2064 + "pkg-config", 2065 + "vcpkg", 2066 + ] 2067 + 2068 + [[package]] 2069 + name = "p256" 2070 + version = "0.13.2" 2071 + source = "registry+https://github.com/rust-lang/crates.io-index" 2072 + checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" 2073 + dependencies = [ 2074 + "ecdsa", 2075 + "elliptic-curve", 2076 + "primeorder", 2077 + "sha2", 2078 + ] 2079 + 2080 + [[package]] 2081 + name = "parking" 2082 + version = "2.2.1" 2083 + source = "registry+https://github.com/rust-lang/crates.io-index" 2084 + checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 2085 + 2086 + [[package]] 2087 + name = "parking_lot" 2088 + version = "0.12.5" 2089 + source = "registry+https://github.com/rust-lang/crates.io-index" 2090 + checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 2091 + dependencies = [ 2092 + "lock_api", 2093 + "parking_lot_core", 2094 + ] 2095 + 2096 + [[package]] 2097 + name = "parking_lot_core" 2098 + version = "0.9.12" 2099 + source = "registry+https://github.com/rust-lang/crates.io-index" 2100 + checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 2101 + dependencies = [ 2102 + "cfg-if", 2103 + "libc", 2104 + "redox_syscall", 2105 + "smallvec", 2106 + "windows-link", 2107 + ] 2108 + 2109 + [[package]] 2110 + name = "percent-encoding" 2111 + version = "2.3.2" 2112 + source = "registry+https://github.com/rust-lang/crates.io-index" 2113 + checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 2114 + 2115 + [[package]] 2116 + name = "pin-project-lite" 2117 + version = "0.2.16" 2118 + source = "registry+https://github.com/rust-lang/crates.io-index" 2119 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 2120 + 2121 + [[package]] 2122 + name = "pin-utils" 2123 + version = "0.1.0" 2124 + source = "registry+https://github.com/rust-lang/crates.io-index" 2125 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 2126 + 2127 + [[package]] 2128 + name = "pkg-config" 2129 + version = "0.3.32" 2130 + source = "registry+https://github.com/rust-lang/crates.io-index" 2131 + checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 2132 + 2133 + [[package]] 2134 + name = "polyval" 2135 + version = "0.6.2" 2136 + source = "registry+https://github.com/rust-lang/crates.io-index" 2137 + checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" 2138 + dependencies = [ 2139 + "cfg-if", 2140 + "cpufeatures", 2141 + "opaque-debug", 2142 + "universal-hash", 2143 + ] 2144 + 2145 + [[package]] 2146 + name = "portable-atomic" 2147 + version = "1.11.1" 2148 + source = "registry+https://github.com/rust-lang/crates.io-index" 2149 + checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" 2150 + 2151 + [[package]] 2152 + name = "portable-atomic-util" 2153 + version = "0.2.4" 2154 + source = "registry+https://github.com/rust-lang/crates.io-index" 2155 + checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" 2156 + dependencies = [ 2157 + "portable-atomic", 2158 + ] 2159 + 2160 + [[package]] 2161 + name = "potential_utf" 2162 + version = "0.1.3" 2163 + source = "registry+https://github.com/rust-lang/crates.io-index" 2164 + checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" 2165 + dependencies = [ 2166 + "zerovec", 2167 + ] 2168 + 2169 + [[package]] 2170 + name = "powerfmt" 2171 + version = "0.2.0" 2172 + source = "registry+https://github.com/rust-lang/crates.io-index" 2173 + checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 2174 + 2175 + [[package]] 2176 + name = "ppv-lite86" 2177 + version = "0.2.21" 2178 + source = "registry+https://github.com/rust-lang/crates.io-index" 2179 + checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 2180 + dependencies = [ 2181 + "zerocopy", 2182 + ] 2183 + 2184 + [[package]] 2185 + name = "primeorder" 2186 + version = "0.13.6" 2187 + source = "registry+https://github.com/rust-lang/crates.io-index" 2188 + checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" 2189 + dependencies = [ 2190 + "elliptic-curve", 2191 + ] 2192 + 2193 + [[package]] 2194 + name = "proc-macro2" 2195 + version = "1.0.101" 2196 + source = "registry+https://github.com/rust-lang/crates.io-index" 2197 + checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" 2198 + dependencies = [ 2199 + "unicode-ident", 2200 + ] 2201 + 2202 + [[package]] 2203 + name = "quote" 2204 + version = "1.0.41" 2205 + source = "registry+https://github.com/rust-lang/crates.io-index" 2206 + checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" 2207 + dependencies = [ 2208 + "proc-macro2", 2209 + ] 2210 + 2211 + [[package]] 2212 + name = "r-efi" 2213 + version = "5.3.0" 2214 + source = "registry+https://github.com/rust-lang/crates.io-index" 2215 + checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 2216 + 2217 + [[package]] 2218 + name = "rand" 2219 + version = "0.8.5" 2220 + source = "registry+https://github.com/rust-lang/crates.io-index" 2221 + checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 2222 + dependencies = [ 2223 + "libc", 2224 + "rand_chacha 0.3.1", 2225 + "rand_core 0.6.4", 2226 + ] 2227 + 2228 + [[package]] 2229 + name = "rand" 2230 + version = "0.9.2" 2231 + source = "registry+https://github.com/rust-lang/crates.io-index" 2232 + checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 2233 + dependencies = [ 2234 + "rand_chacha 0.9.0", 2235 + "rand_core 0.9.3", 2236 + ] 2237 + 2238 + [[package]] 2239 + name = "rand_chacha" 2240 + version = "0.3.1" 2241 + source = "registry+https://github.com/rust-lang/crates.io-index" 2242 + checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 2243 + dependencies = [ 2244 + "ppv-lite86", 2245 + "rand_core 0.6.4", 2246 + ] 2247 + 2248 + [[package]] 2249 + name = "rand_chacha" 2250 + version = "0.9.0" 2251 + source = "registry+https://github.com/rust-lang/crates.io-index" 2252 + checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 2253 + dependencies = [ 2254 + "ppv-lite86", 2255 + "rand_core 0.9.3", 2256 + ] 2257 + 2258 + [[package]] 2259 + name = "rand_core" 2260 + version = "0.6.4" 2261 + source = "registry+https://github.com/rust-lang/crates.io-index" 2262 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 2263 + dependencies = [ 2264 + "getrandom 0.2.16", 2265 + ] 2266 + 2267 + [[package]] 2268 + name = "rand_core" 2269 + version = "0.9.3" 2270 + source = "registry+https://github.com/rust-lang/crates.io-index" 2271 + checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 2272 + dependencies = [ 2273 + "getrandom 0.3.3", 2274 + ] 2275 + 2276 + [[package]] 2277 + name = "redox_syscall" 2278 + version = "0.5.18" 2279 + source = "registry+https://github.com/rust-lang/crates.io-index" 2280 + checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 2281 + dependencies = [ 2282 + "bitflags", 2283 + ] 2284 + 2285 + [[package]] 2286 + name = "regex" 2287 + version = "1.11.3" 2288 + source = "registry+https://github.com/rust-lang/crates.io-index" 2289 + checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" 2290 + dependencies = [ 2291 + "aho-corasick", 2292 + "memchr", 2293 + "regex-automata", 2294 + "regex-syntax", 2295 + ] 2296 + 2297 + [[package]] 2298 + name = "regex-automata" 2299 + version = "0.4.11" 2300 + source = "registry+https://github.com/rust-lang/crates.io-index" 2301 + checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" 2302 + dependencies = [ 2303 + "aho-corasick", 2304 + "memchr", 2305 + "regex-syntax", 2306 + ] 2307 + 2308 + [[package]] 2309 + name = "regex-lite" 2310 + version = "0.1.7" 2311 + source = "registry+https://github.com/rust-lang/crates.io-index" 2312 + checksum = "943f41321c63ef1c92fd763bfe054d2668f7f225a5c29f0105903dc2fc04ba30" 2313 + 2314 + [[package]] 2315 + name = "regex-syntax" 2316 + version = "0.8.6" 2317 + source = "registry+https://github.com/rust-lang/crates.io-index" 2318 + checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" 2319 + 2320 + [[package]] 2321 + name = "reqwest" 2322 + version = "0.12.23" 2323 + source = "registry+https://github.com/rust-lang/crates.io-index" 2324 + checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" 2325 + dependencies = [ 2326 + "async-compression", 2327 + "base64 0.22.1", 2328 + "bytes", 2329 + "futures-core", 2330 + "futures-util", 2331 + "http 1.3.1", 2332 + "http-body", 2333 + "http-body-util", 2334 + "hyper", 2335 + "hyper-tls", 2336 + "hyper-util", 2337 + "js-sys", 2338 + "log", 2339 + "native-tls", 2340 + "percent-encoding", 2341 + "pin-project-lite", 2342 + "rustls-pki-types", 2343 + "serde", 2344 + "serde_json", 2345 + "serde_urlencoded", 2346 + "sync_wrapper", 2347 + "tokio", 2348 + "tokio-native-tls", 2349 + "tokio-util", 2350 + "tower", 2351 + "tower-http", 2352 + "tower-service", 2353 + "url", 2354 + "wasm-bindgen", 2355 + "wasm-bindgen-futures", 2356 + "web-sys", 2357 + ] 2358 + 2359 + [[package]] 2360 + name = "resolv-conf" 2361 + version = "0.7.5" 2362 + source = "registry+https://github.com/rust-lang/crates.io-index" 2363 + checksum = "6b3789b30bd25ba102de4beabd95d21ac45b69b1be7d14522bab988c526d6799" 2364 + 2365 + [[package]] 2366 + name = "rfc6979" 2367 + version = "0.4.0" 2368 + source = "registry+https://github.com/rust-lang/crates.io-index" 2369 + checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" 2370 + dependencies = [ 2371 + "hmac", 2372 + "subtle", 2373 + ] 2374 + 2375 + [[package]] 2376 + name = "rustc-demangle" 2377 + version = "0.1.26" 2378 + source = "registry+https://github.com/rust-lang/crates.io-index" 2379 + checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 2380 + 2381 + [[package]] 2382 + name = "rustc_version" 2383 + version = "0.4.1" 2384 + source = "registry+https://github.com/rust-lang/crates.io-index" 2385 + checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 2386 + dependencies = [ 2387 + "semver", 2388 + ] 2389 + 2390 + [[package]] 2391 + name = "rustix" 2392 + version = "1.1.2" 2393 + source = "registry+https://github.com/rust-lang/crates.io-index" 2394 + checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" 2395 + dependencies = [ 2396 + "bitflags", 2397 + "errno", 2398 + "libc", 2399 + "linux-raw-sys", 2400 + "windows-sys 0.61.1", 2401 + ] 2402 + 2403 + [[package]] 2404 + name = "rustls-pki-types" 2405 + version = "1.12.0" 2406 + source = "registry+https://github.com/rust-lang/crates.io-index" 2407 + checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" 2408 + dependencies = [ 2409 + "zeroize", 2410 + ] 2411 + 2412 + [[package]] 2413 + name = "rustversion" 2414 + version = "1.0.22" 2415 + source = "registry+https://github.com/rust-lang/crates.io-index" 2416 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 2417 + 2418 + [[package]] 2419 + name = "ryu" 2420 + version = "1.0.20" 2421 + source = "registry+https://github.com/rust-lang/crates.io-index" 2422 + checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 2423 + 2424 + [[package]] 2425 + name = "schannel" 2426 + version = "0.1.28" 2427 + source = "registry+https://github.com/rust-lang/crates.io-index" 2428 + checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" 2429 + dependencies = [ 2430 + "windows-sys 0.61.1", 2431 + ] 2432 + 2433 + [[package]] 2434 + name = "scopeguard" 2435 + version = "1.2.0" 2436 + source = "registry+https://github.com/rust-lang/crates.io-index" 2437 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 2438 + 2439 + [[package]] 2440 + name = "sec1" 2441 + version = "0.7.3" 2442 + source = "registry+https://github.com/rust-lang/crates.io-index" 2443 + checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" 2444 + dependencies = [ 2445 + "base16ct", 2446 + "der", 2447 + "generic-array", 2448 + "subtle", 2449 + "zeroize", 2450 + ] 2451 + 2452 + [[package]] 2453 + name = "security-framework" 2454 + version = "2.11.1" 2455 + source = "registry+https://github.com/rust-lang/crates.io-index" 2456 + checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 2457 + dependencies = [ 2458 + "bitflags", 2459 + "core-foundation", 2460 + "core-foundation-sys", 2461 + "libc", 2462 + "security-framework-sys", 2463 + ] 2464 + 2465 + [[package]] 2466 + name = "security-framework-sys" 2467 + version = "2.15.0" 2468 + source = "registry+https://github.com/rust-lang/crates.io-index" 2469 + checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" 2470 + dependencies = [ 2471 + "core-foundation-sys", 2472 + "libc", 2473 + ] 2474 + 2475 + [[package]] 2476 + name = "semver" 2477 + version = "1.0.27" 2478 + source = "registry+https://github.com/rust-lang/crates.io-index" 2479 + checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 2480 + 2481 + [[package]] 2482 + name = "serde" 2483 + version = "1.0.228" 2484 + source = "registry+https://github.com/rust-lang/crates.io-index" 2485 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 2486 + dependencies = [ 2487 + "serde_core", 2488 + "serde_derive", 2489 + ] 2490 + 2491 + [[package]] 2492 + name = "serde_bytes" 2493 + version = "0.11.19" 2494 + source = "registry+https://github.com/rust-lang/crates.io-index" 2495 + checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" 2496 + dependencies = [ 2497 + "serde", 2498 + "serde_core", 2499 + ] 2500 + 2501 + [[package]] 2502 + name = "serde_core" 2503 + version = "1.0.228" 2504 + source = "registry+https://github.com/rust-lang/crates.io-index" 2505 + checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 2506 + dependencies = [ 2507 + "serde_derive", 2508 + ] 2509 + 2510 + [[package]] 2511 + name = "serde_derive" 2512 + version = "1.0.228" 2513 + source = "registry+https://github.com/rust-lang/crates.io-index" 2514 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 2515 + dependencies = [ 2516 + "proc-macro2", 2517 + "quote", 2518 + "syn 2.0.106", 2519 + ] 2520 + 2521 + [[package]] 2522 + name = "serde_html_form" 2523 + version = "0.2.8" 2524 + source = "registry+https://github.com/rust-lang/crates.io-index" 2525 + checksum = "b2f2d7ff8a2140333718bb329f5c40fc5f0865b84c426183ce14c97d2ab8154f" 2526 + dependencies = [ 2527 + "form_urlencoded", 2528 + "indexmap", 2529 + "itoa", 2530 + "ryu", 2531 + "serde_core", 2532 + ] 2533 + 2534 + [[package]] 2535 + name = "serde_json" 2536 + version = "1.0.145" 2537 + source = "registry+https://github.com/rust-lang/crates.io-index" 2538 + checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 2539 + dependencies = [ 2540 + "itoa", 2541 + "memchr", 2542 + "ryu", 2543 + "serde", 2544 + "serde_core", 2545 + ] 2546 + 2547 + [[package]] 2548 + name = "serde_urlencoded" 2549 + version = "0.7.1" 2550 + source = "registry+https://github.com/rust-lang/crates.io-index" 2551 + checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2552 + dependencies = [ 2553 + "form_urlencoded", 2554 + "itoa", 2555 + "ryu", 2556 + "serde", 2557 + ] 2558 + 2559 + [[package]] 2560 + name = "sha1" 2561 + version = "0.10.6" 2562 + source = "registry+https://github.com/rust-lang/crates.io-index" 2563 + checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 2564 + dependencies = [ 2565 + "cfg-if", 2566 + "cpufeatures", 2567 + "digest", 2568 + ] 2569 + 2570 + [[package]] 2571 + name = "sha2" 2572 + version = "0.10.9" 2573 + source = "registry+https://github.com/rust-lang/crates.io-index" 2574 + checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" 2575 + dependencies = [ 2576 + "cfg-if", 2577 + "cpufeatures", 2578 + "digest", 2579 + ] 2580 + 2581 + [[package]] 2582 + name = "shlex" 2583 + version = "1.3.0" 2584 + source = "registry+https://github.com/rust-lang/crates.io-index" 2585 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 2586 + 2587 + [[package]] 2588 + name = "signal-hook-registry" 2589 + version = "1.4.6" 2590 + source = "registry+https://github.com/rust-lang/crates.io-index" 2591 + checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" 2592 + dependencies = [ 2593 + "libc", 2594 + ] 2595 + 2596 + [[package]] 2597 + name = "signature" 2598 + version = "2.2.0" 2599 + source = "registry+https://github.com/rust-lang/crates.io-index" 2600 + checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 2601 + dependencies = [ 2602 + "digest", 2603 + "rand_core 0.6.4", 2604 + ] 2605 + 2606 + [[package]] 2607 + name = "simd-adler32" 2608 + version = "0.3.7" 2609 + source = "registry+https://github.com/rust-lang/crates.io-index" 2610 + checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 2611 + 2612 + [[package]] 2613 + name = "slab" 2614 + version = "0.4.11" 2615 + source = "registry+https://github.com/rust-lang/crates.io-index" 2616 + checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 2617 + 2618 + [[package]] 2619 + name = "smallvec" 2620 + version = "1.15.1" 2621 + source = "registry+https://github.com/rust-lang/crates.io-index" 2622 + checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 2623 + 2624 + [[package]] 2625 + name = "socket2" 2626 + version = "0.5.10" 2627 + source = "registry+https://github.com/rust-lang/crates.io-index" 2628 + checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" 2629 + dependencies = [ 2630 + "libc", 2631 + "windows-sys 0.52.0", 2632 + ] 2633 + 2634 + [[package]] 2635 + name = "socket2" 2636 + version = "0.6.0" 2637 + source = "registry+https://github.com/rust-lang/crates.io-index" 2638 + checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 2639 + dependencies = [ 2640 + "libc", 2641 + "windows-sys 0.59.0", 2642 + ] 2643 + 2644 + [[package]] 2645 + name = "stable_deref_trait" 2646 + version = "1.2.0" 2647 + source = "registry+https://github.com/rust-lang/crates.io-index" 2648 + checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2649 + 2650 + [[package]] 2651 + name = "subtle" 2652 + version = "2.6.1" 2653 + source = "registry+https://github.com/rust-lang/crates.io-index" 2654 + checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 2655 + 2656 + [[package]] 2657 + name = "syn" 2658 + version = "1.0.109" 2659 + source = "registry+https://github.com/rust-lang/crates.io-index" 2660 + checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 2661 + dependencies = [ 2662 + "proc-macro2", 2663 + "quote", 2664 + "unicode-ident", 2665 + ] 2666 + 2667 + [[package]] 2668 + name = "syn" 2669 + version = "2.0.106" 2670 + source = "registry+https://github.com/rust-lang/crates.io-index" 2671 + checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" 2672 + dependencies = [ 2673 + "proc-macro2", 2674 + "quote", 2675 + "unicode-ident", 2676 + ] 2677 + 2678 + [[package]] 2679 + name = "sync_wrapper" 2680 + version = "1.0.2" 2681 + source = "registry+https://github.com/rust-lang/crates.io-index" 2682 + checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 2683 + dependencies = [ 2684 + "futures-core", 2685 + ] 2686 + 2687 + [[package]] 2688 + name = "synstructure" 2689 + version = "0.13.2" 2690 + source = "registry+https://github.com/rust-lang/crates.io-index" 2691 + checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 2692 + dependencies = [ 2693 + "proc-macro2", 2694 + "quote", 2695 + "syn 2.0.106", 2696 + ] 2697 + 2698 + [[package]] 2699 + name = "tagptr" 2700 + version = "0.2.0" 2701 + source = "registry+https://github.com/rust-lang/crates.io-index" 2702 + checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" 2703 + 2704 + [[package]] 2705 + name = "tempfile" 2706 + version = "3.23.0" 2707 + source = "registry+https://github.com/rust-lang/crates.io-index" 2708 + checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" 2709 + dependencies = [ 2710 + "fastrand", 2711 + "getrandom 0.3.3", 2712 + "once_cell", 2713 + "rustix", 2714 + "windows-sys 0.61.1", 2715 + ] 2716 + 2717 + [[package]] 2718 + name = "thiserror" 2719 + version = "1.0.69" 2720 + source = "registry+https://github.com/rust-lang/crates.io-index" 2721 + checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 2722 + dependencies = [ 2723 + "thiserror-impl", 2724 + ] 2725 + 2726 + [[package]] 2727 + name = "thiserror-impl" 2728 + version = "1.0.69" 2729 + source = "registry+https://github.com/rust-lang/crates.io-index" 2730 + checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 2731 + dependencies = [ 2732 + "proc-macro2", 2733 + "quote", 2734 + "syn 2.0.106", 2735 + ] 2736 + 2737 + [[package]] 2738 + name = "time" 2739 + version = "0.3.44" 2740 + source = "registry+https://github.com/rust-lang/crates.io-index" 2741 + checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" 2742 + dependencies = [ 2743 + "deranged", 2744 + "itoa", 2745 + "num-conv", 2746 + "powerfmt", 2747 + "serde", 2748 + "time-core", 2749 + "time-macros", 2750 + ] 2751 + 2752 + [[package]] 2753 + name = "time-core" 2754 + version = "0.1.6" 2755 + source = "registry+https://github.com/rust-lang/crates.io-index" 2756 + checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" 2757 + 2758 + [[package]] 2759 + name = "time-macros" 2760 + version = "0.2.24" 2761 + source = "registry+https://github.com/rust-lang/crates.io-index" 2762 + checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" 2763 + dependencies = [ 2764 + "num-conv", 2765 + "time-core", 2766 + ] 2767 + 2768 + [[package]] 2769 + name = "tinystr" 2770 + version = "0.8.1" 2771 + source = "registry+https://github.com/rust-lang/crates.io-index" 2772 + checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 2773 + dependencies = [ 2774 + "displaydoc", 2775 + "zerovec", 2776 + ] 2777 + 2778 + [[package]] 2779 + name = "tinyvec" 2780 + version = "1.10.0" 2781 + source = "registry+https://github.com/rust-lang/crates.io-index" 2782 + checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" 2783 + dependencies = [ 2784 + "tinyvec_macros", 2785 + ] 2786 + 2787 + [[package]] 2788 + name = "tinyvec_macros" 2789 + version = "0.1.1" 2790 + source = "registry+https://github.com/rust-lang/crates.io-index" 2791 + checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2792 + 2793 + [[package]] 2794 + name = "tokio" 2795 + version = "1.47.1" 2796 + source = "registry+https://github.com/rust-lang/crates.io-index" 2797 + checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" 2798 + dependencies = [ 2799 + "backtrace", 2800 + "bytes", 2801 + "io-uring", 2802 + "libc", 2803 + "mio", 2804 + "parking_lot", 2805 + "pin-project-lite", 2806 + "signal-hook-registry", 2807 + "slab", 2808 + "socket2 0.6.0", 2809 + "tokio-macros", 2810 + "windows-sys 0.59.0", 2811 + ] 2812 + 2813 + [[package]] 2814 + name = "tokio-macros" 2815 + version = "2.5.0" 2816 + source = "registry+https://github.com/rust-lang/crates.io-index" 2817 + checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 2818 + dependencies = [ 2819 + "proc-macro2", 2820 + "quote", 2821 + "syn 2.0.106", 2822 + ] 2823 + 2824 + [[package]] 2825 + name = "tokio-native-tls" 2826 + version = "0.3.1" 2827 + source = "registry+https://github.com/rust-lang/crates.io-index" 2828 + checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 2829 + dependencies = [ 2830 + "native-tls", 2831 + "tokio", 2832 + ] 2833 + 2834 + [[package]] 2835 + name = "tokio-util" 2836 + version = "0.7.16" 2837 + source = "registry+https://github.com/rust-lang/crates.io-index" 2838 + checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" 2839 + dependencies = [ 2840 + "bytes", 2841 + "futures-core", 2842 + "futures-sink", 2843 + "pin-project-lite", 2844 + "tokio", 2845 + ] 2846 + 2847 + [[package]] 2848 + name = "tower" 2849 + version = "0.5.2" 2850 + source = "registry+https://github.com/rust-lang/crates.io-index" 2851 + checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 2852 + dependencies = [ 2853 + "futures-core", 2854 + "futures-util", 2855 + "pin-project-lite", 2856 + "sync_wrapper", 2857 + "tokio", 2858 + "tower-layer", 2859 + "tower-service", 2860 + ] 2861 + 2862 + [[package]] 2863 + name = "tower-http" 2864 + version = "0.6.6" 2865 + source = "registry+https://github.com/rust-lang/crates.io-index" 2866 + checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 2867 + dependencies = [ 2868 + "bitflags", 2869 + "bytes", 2870 + "futures-util", 2871 + "http 1.3.1", 2872 + "http-body", 2873 + "iri-string", 2874 + "pin-project-lite", 2875 + "tower", 2876 + "tower-layer", 2877 + "tower-service", 2878 + ] 2879 + 2880 + [[package]] 2881 + name = "tower-layer" 2882 + version = "0.3.3" 2883 + source = "registry+https://github.com/rust-lang/crates.io-index" 2884 + checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 2885 + 2886 + [[package]] 2887 + name = "tower-service" 2888 + version = "0.3.3" 2889 + source = "registry+https://github.com/rust-lang/crates.io-index" 2890 + checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 2891 + 2892 + [[package]] 2893 + name = "tracing" 2894 + version = "0.1.41" 2895 + source = "registry+https://github.com/rust-lang/crates.io-index" 2896 + checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 2897 + dependencies = [ 2898 + "log", 2899 + "pin-project-lite", 2900 + "tracing-attributes", 2901 + "tracing-core", 2902 + ] 2903 + 2904 + [[package]] 2905 + name = "tracing-attributes" 2906 + version = "0.1.30" 2907 + source = "registry+https://github.com/rust-lang/crates.io-index" 2908 + checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" 2909 + dependencies = [ 2910 + "proc-macro2", 2911 + "quote", 2912 + "syn 2.0.106", 2913 + ] 2914 + 2915 + [[package]] 2916 + name = "tracing-core" 2917 + version = "0.1.34" 2918 + source = "registry+https://github.com/rust-lang/crates.io-index" 2919 + checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" 2920 + dependencies = [ 2921 + "once_cell", 2922 + ] 2923 + 2924 + [[package]] 2925 + name = "trait-variant" 2926 + version = "0.1.2" 2927 + source = "registry+https://github.com/rust-lang/crates.io-index" 2928 + checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" 2929 + dependencies = [ 2930 + "proc-macro2", 2931 + "quote", 2932 + "syn 2.0.106", 2933 + ] 2934 + 2935 + [[package]] 2936 + name = "try-lock" 2937 + version = "0.2.5" 2938 + source = "registry+https://github.com/rust-lang/crates.io-index" 2939 + checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2940 + 2941 + [[package]] 2942 + name = "typenum" 2943 + version = "1.19.0" 2944 + source = "registry+https://github.com/rust-lang/crates.io-index" 2945 + checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 2946 + 2947 + [[package]] 2948 + name = "unicode-ident" 2949 + version = "1.0.19" 2950 + source = "registry+https://github.com/rust-lang/crates.io-index" 2951 + checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" 2952 + 2953 + [[package]] 2954 + name = "unicode-xid" 2955 + version = "0.2.6" 2956 + source = "registry+https://github.com/rust-lang/crates.io-index" 2957 + checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 2958 + 2959 + [[package]] 2960 + name = "universal-hash" 2961 + version = "0.5.1" 2962 + source = "registry+https://github.com/rust-lang/crates.io-index" 2963 + checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" 2964 + dependencies = [ 2965 + "crypto-common", 2966 + "subtle", 2967 + ] 2968 + 2969 + [[package]] 2970 + name = "unsigned-varint" 2971 + version = "0.8.0" 2972 + source = "registry+https://github.com/rust-lang/crates.io-index" 2973 + checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" 2974 + 2975 + [[package]] 2976 + name = "url" 2977 + version = "2.5.7" 2978 + source = "registry+https://github.com/rust-lang/crates.io-index" 2979 + checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 2980 + dependencies = [ 2981 + "form_urlencoded", 2982 + "idna", 2983 + "percent-encoding", 2984 + "serde", 2985 + ] 2986 + 2987 + [[package]] 2988 + name = "utf8_iter" 2989 + version = "1.0.4" 2990 + source = "registry+https://github.com/rust-lang/crates.io-index" 2991 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2992 + 2993 + [[package]] 2994 + name = "utf8parse" 2995 + version = "0.2.2" 2996 + source = "registry+https://github.com/rust-lang/crates.io-index" 2997 + checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 2998 + 2999 + [[package]] 3000 + name = "uuid" 3001 + version = "1.18.1" 3002 + source = "registry+https://github.com/rust-lang/crates.io-index" 3003 + checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" 3004 + dependencies = [ 3005 + "getrandom 0.3.3", 3006 + "js-sys", 3007 + "wasm-bindgen", 3008 + ] 3009 + 3010 + [[package]] 3011 + name = "vcpkg" 3012 + version = "0.2.15" 3013 + source = "registry+https://github.com/rust-lang/crates.io-index" 3014 + checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 3015 + 3016 + [[package]] 3017 + name = "version_check" 3018 + version = "0.9.5" 3019 + source = "registry+https://github.com/rust-lang/crates.io-index" 3020 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 3021 + 3022 + [[package]] 3023 + name = "want" 3024 + version = "0.3.1" 3025 + source = "registry+https://github.com/rust-lang/crates.io-index" 3026 + checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 3027 + dependencies = [ 3028 + "try-lock", 3029 + ] 3030 + 3031 + [[package]] 3032 + name = "wasi" 3033 + version = "0.11.1+wasi-snapshot-preview1" 3034 + source = "registry+https://github.com/rust-lang/crates.io-index" 3035 + checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 3036 + 3037 + [[package]] 3038 + name = "wasi" 3039 + version = "0.14.7+wasi-0.2.4" 3040 + source = "registry+https://github.com/rust-lang/crates.io-index" 3041 + checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" 3042 + dependencies = [ 3043 + "wasip2", 3044 + ] 3045 + 3046 + [[package]] 3047 + name = "wasip2" 3048 + version = "1.0.1+wasi-0.2.4" 3049 + source = "registry+https://github.com/rust-lang/crates.io-index" 3050 + checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" 3051 + dependencies = [ 3052 + "wit-bindgen", 3053 + ] 3054 + 3055 + [[package]] 3056 + name = "wasm-bindgen" 3057 + version = "0.2.104" 3058 + source = "registry+https://github.com/rust-lang/crates.io-index" 3059 + checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" 3060 + dependencies = [ 3061 + "cfg-if", 3062 + "once_cell", 3063 + "rustversion", 3064 + "wasm-bindgen-macro", 3065 + "wasm-bindgen-shared", 3066 + ] 3067 + 3068 + [[package]] 3069 + name = "wasm-bindgen-backend" 3070 + version = "0.2.104" 3071 + source = "registry+https://github.com/rust-lang/crates.io-index" 3072 + checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" 3073 + dependencies = [ 3074 + "bumpalo", 3075 + "log", 3076 + "proc-macro2", 3077 + "quote", 3078 + "syn 2.0.106", 3079 + "wasm-bindgen-shared", 3080 + ] 3081 + 3082 + [[package]] 3083 + name = "wasm-bindgen-futures" 3084 + version = "0.4.54" 3085 + source = "registry+https://github.com/rust-lang/crates.io-index" 3086 + checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" 3087 + dependencies = [ 3088 + "cfg-if", 3089 + "js-sys", 3090 + "once_cell", 3091 + "wasm-bindgen", 3092 + "web-sys", 3093 + ] 3094 + 3095 + [[package]] 3096 + name = "wasm-bindgen-macro" 3097 + version = "0.2.104" 3098 + source = "registry+https://github.com/rust-lang/crates.io-index" 3099 + checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" 3100 + dependencies = [ 3101 + "quote", 3102 + "wasm-bindgen-macro-support", 3103 + ] 3104 + 3105 + [[package]] 3106 + name = "wasm-bindgen-macro-support" 3107 + version = "0.2.104" 3108 + source = "registry+https://github.com/rust-lang/crates.io-index" 3109 + checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" 3110 + dependencies = [ 3111 + "proc-macro2", 3112 + "quote", 3113 + "syn 2.0.106", 3114 + "wasm-bindgen-backend", 3115 + "wasm-bindgen-shared", 3116 + ] 3117 + 3118 + [[package]] 3119 + name = "wasm-bindgen-shared" 3120 + version = "0.2.104" 3121 + source = "registry+https://github.com/rust-lang/crates.io-index" 3122 + checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" 3123 + dependencies = [ 3124 + "unicode-ident", 3125 + ] 3126 + 3127 + [[package]] 3128 + name = "web-sys" 3129 + version = "0.3.81" 3130 + source = "registry+https://github.com/rust-lang/crates.io-index" 3131 + checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" 3132 + dependencies = [ 3133 + "js-sys", 3134 + "wasm-bindgen", 3135 + ] 3136 + 3137 + [[package]] 3138 + name = "web-time" 3139 + version = "1.1.0" 3140 + source = "registry+https://github.com/rust-lang/crates.io-index" 3141 + checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 3142 + dependencies = [ 3143 + "js-sys", 3144 + "wasm-bindgen", 3145 + ] 3146 + 3147 + [[package]] 3148 + name = "widestring" 3149 + version = "1.2.0" 3150 + source = "registry+https://github.com/rust-lang/crates.io-index" 3151 + checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" 3152 + 3153 + [[package]] 3154 + name = "windows-core" 3155 + version = "0.62.1" 3156 + source = "registry+https://github.com/rust-lang/crates.io-index" 3157 + checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" 3158 + dependencies = [ 3159 + "windows-implement", 3160 + "windows-interface", 3161 + "windows-link", 3162 + "windows-result", 3163 + "windows-strings", 3164 + ] 3165 + 3166 + [[package]] 3167 + name = "windows-implement" 3168 + version = "0.60.1" 3169 + source = "registry+https://github.com/rust-lang/crates.io-index" 3170 + checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" 3171 + dependencies = [ 3172 + "proc-macro2", 3173 + "quote", 3174 + "syn 2.0.106", 3175 + ] 3176 + 3177 + [[package]] 3178 + name = "windows-interface" 3179 + version = "0.59.2" 3180 + source = "registry+https://github.com/rust-lang/crates.io-index" 3181 + checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" 3182 + dependencies = [ 3183 + "proc-macro2", 3184 + "quote", 3185 + "syn 2.0.106", 3186 + ] 3187 + 3188 + [[package]] 3189 + name = "windows-link" 3190 + version = "0.2.0" 3191 + source = "registry+https://github.com/rust-lang/crates.io-index" 3192 + checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" 3193 + 3194 + [[package]] 3195 + name = "windows-result" 3196 + version = "0.4.0" 3197 + source = "registry+https://github.com/rust-lang/crates.io-index" 3198 + checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" 3199 + dependencies = [ 3200 + "windows-link", 3201 + ] 3202 + 3203 + [[package]] 3204 + name = "windows-strings" 3205 + version = "0.5.0" 3206 + source = "registry+https://github.com/rust-lang/crates.io-index" 3207 + checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" 3208 + dependencies = [ 3209 + "windows-link", 3210 + ] 3211 + 3212 + [[package]] 3213 + name = "windows-sys" 3214 + version = "0.48.0" 3215 + source = "registry+https://github.com/rust-lang/crates.io-index" 3216 + checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 3217 + dependencies = [ 3218 + "windows-targets 0.48.5", 3219 + ] 3220 + 3221 + [[package]] 3222 + name = "windows-sys" 3223 + version = "0.52.0" 3224 + source = "registry+https://github.com/rust-lang/crates.io-index" 3225 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 3226 + dependencies = [ 3227 + "windows-targets 0.52.6", 3228 + ] 3229 + 3230 + [[package]] 3231 + name = "windows-sys" 3232 + version = "0.59.0" 3233 + source = "registry+https://github.com/rust-lang/crates.io-index" 3234 + checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 3235 + dependencies = [ 3236 + "windows-targets 0.52.6", 3237 + ] 3238 + 3239 + [[package]] 3240 + name = "windows-sys" 3241 + version = "0.60.2" 3242 + source = "registry+https://github.com/rust-lang/crates.io-index" 3243 + checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 3244 + dependencies = [ 3245 + "windows-targets 0.53.4", 3246 + ] 3247 + 3248 + [[package]] 3249 + name = "windows-sys" 3250 + version = "0.61.1" 3251 + source = "registry+https://github.com/rust-lang/crates.io-index" 3252 + checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" 3253 + dependencies = [ 3254 + "windows-link", 3255 + ] 3256 + 3257 + [[package]] 3258 + name = "windows-targets" 3259 + version = "0.48.5" 3260 + source = "registry+https://github.com/rust-lang/crates.io-index" 3261 + checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 3262 + dependencies = [ 3263 + "windows_aarch64_gnullvm 0.48.5", 3264 + "windows_aarch64_msvc 0.48.5", 3265 + "windows_i686_gnu 0.48.5", 3266 + "windows_i686_msvc 0.48.5", 3267 + "windows_x86_64_gnu 0.48.5", 3268 + "windows_x86_64_gnullvm 0.48.5", 3269 + "windows_x86_64_msvc 0.48.5", 3270 + ] 3271 + 3272 + [[package]] 3273 + name = "windows-targets" 3274 + version = "0.52.6" 3275 + source = "registry+https://github.com/rust-lang/crates.io-index" 3276 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 3277 + dependencies = [ 3278 + "windows_aarch64_gnullvm 0.52.6", 3279 + "windows_aarch64_msvc 0.52.6", 3280 + "windows_i686_gnu 0.52.6", 3281 + "windows_i686_gnullvm 0.52.6", 3282 + "windows_i686_msvc 0.52.6", 3283 + "windows_x86_64_gnu 0.52.6", 3284 + "windows_x86_64_gnullvm 0.52.6", 3285 + "windows_x86_64_msvc 0.52.6", 3286 + ] 3287 + 3288 + [[package]] 3289 + name = "windows-targets" 3290 + version = "0.53.4" 3291 + source = "registry+https://github.com/rust-lang/crates.io-index" 3292 + checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" 3293 + dependencies = [ 3294 + "windows-link", 3295 + "windows_aarch64_gnullvm 0.53.0", 3296 + "windows_aarch64_msvc 0.53.0", 3297 + "windows_i686_gnu 0.53.0", 3298 + "windows_i686_gnullvm 0.53.0", 3299 + "windows_i686_msvc 0.53.0", 3300 + "windows_x86_64_gnu 0.53.0", 3301 + "windows_x86_64_gnullvm 0.53.0", 3302 + "windows_x86_64_msvc 0.53.0", 3303 + ] 3304 + 3305 + [[package]] 3306 + name = "windows_aarch64_gnullvm" 3307 + version = "0.48.5" 3308 + source = "registry+https://github.com/rust-lang/crates.io-index" 3309 + checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 3310 + 3311 + [[package]] 3312 + name = "windows_aarch64_gnullvm" 3313 + version = "0.52.6" 3314 + source = "registry+https://github.com/rust-lang/crates.io-index" 3315 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 3316 + 3317 + [[package]] 3318 + name = "windows_aarch64_gnullvm" 3319 + version = "0.53.0" 3320 + source = "registry+https://github.com/rust-lang/crates.io-index" 3321 + checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 3322 + 3323 + [[package]] 3324 + name = "windows_aarch64_msvc" 3325 + version = "0.48.5" 3326 + source = "registry+https://github.com/rust-lang/crates.io-index" 3327 + checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 3328 + 3329 + [[package]] 3330 + name = "windows_aarch64_msvc" 3331 + version = "0.52.6" 3332 + source = "registry+https://github.com/rust-lang/crates.io-index" 3333 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 3334 + 3335 + [[package]] 3336 + name = "windows_aarch64_msvc" 3337 + version = "0.53.0" 3338 + source = "registry+https://github.com/rust-lang/crates.io-index" 3339 + checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 3340 + 3341 + [[package]] 3342 + name = "windows_i686_gnu" 3343 + version = "0.48.5" 3344 + source = "registry+https://github.com/rust-lang/crates.io-index" 3345 + checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 3346 + 3347 + [[package]] 3348 + name = "windows_i686_gnu" 3349 + version = "0.52.6" 3350 + source = "registry+https://github.com/rust-lang/crates.io-index" 3351 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 3352 + 3353 + [[package]] 3354 + name = "windows_i686_gnu" 3355 + version = "0.53.0" 3356 + source = "registry+https://github.com/rust-lang/crates.io-index" 3357 + checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 3358 + 3359 + [[package]] 3360 + name = "windows_i686_gnullvm" 3361 + version = "0.52.6" 3362 + source = "registry+https://github.com/rust-lang/crates.io-index" 3363 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 3364 + 3365 + [[package]] 3366 + name = "windows_i686_gnullvm" 3367 + version = "0.53.0" 3368 + source = "registry+https://github.com/rust-lang/crates.io-index" 3369 + checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 3370 + 3371 + [[package]] 3372 + name = "windows_i686_msvc" 3373 + version = "0.48.5" 3374 + source = "registry+https://github.com/rust-lang/crates.io-index" 3375 + checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 3376 + 3377 + [[package]] 3378 + name = "windows_i686_msvc" 3379 + version = "0.52.6" 3380 + source = "registry+https://github.com/rust-lang/crates.io-index" 3381 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 3382 + 3383 + [[package]] 3384 + name = "windows_i686_msvc" 3385 + version = "0.53.0" 3386 + source = "registry+https://github.com/rust-lang/crates.io-index" 3387 + checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 3388 + 3389 + [[package]] 3390 + name = "windows_x86_64_gnu" 3391 + version = "0.48.5" 3392 + source = "registry+https://github.com/rust-lang/crates.io-index" 3393 + checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 3394 + 3395 + [[package]] 3396 + name = "windows_x86_64_gnu" 3397 + version = "0.52.6" 3398 + source = "registry+https://github.com/rust-lang/crates.io-index" 3399 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 3400 + 3401 + [[package]] 3402 + name = "windows_x86_64_gnu" 3403 + version = "0.53.0" 3404 + source = "registry+https://github.com/rust-lang/crates.io-index" 3405 + checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 3406 + 3407 + [[package]] 3408 + name = "windows_x86_64_gnullvm" 3409 + version = "0.48.5" 3410 + source = "registry+https://github.com/rust-lang/crates.io-index" 3411 + checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 3412 + 3413 + [[package]] 3414 + name = "windows_x86_64_gnullvm" 3415 + version = "0.52.6" 3416 + source = "registry+https://github.com/rust-lang/crates.io-index" 3417 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 3418 + 3419 + [[package]] 3420 + name = "windows_x86_64_gnullvm" 3421 + version = "0.53.0" 3422 + source = "registry+https://github.com/rust-lang/crates.io-index" 3423 + checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 3424 + 3425 + [[package]] 3426 + name = "windows_x86_64_msvc" 3427 + version = "0.48.5" 3428 + source = "registry+https://github.com/rust-lang/crates.io-index" 3429 + checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 3430 + 3431 + [[package]] 3432 + name = "windows_x86_64_msvc" 3433 + version = "0.52.6" 3434 + source = "registry+https://github.com/rust-lang/crates.io-index" 3435 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 3436 + 3437 + [[package]] 3438 + name = "windows_x86_64_msvc" 3439 + version = "0.53.0" 3440 + source = "registry+https://github.com/rust-lang/crates.io-index" 3441 + checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 3442 + 3443 + [[package]] 3444 + name = "winreg" 3445 + version = "0.50.0" 3446 + source = "registry+https://github.com/rust-lang/crates.io-index" 3447 + checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 3448 + dependencies = [ 3449 + "cfg-if", 3450 + "windows-sys 0.48.0", 3451 + ] 3452 + 3453 + [[package]] 3454 + name = "wit-bindgen" 3455 + version = "0.46.0" 3456 + source = "registry+https://github.com/rust-lang/crates.io-index" 3457 + checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" 3458 + 3459 + [[package]] 3460 + name = "writeable" 3461 + version = "0.6.1" 3462 + source = "registry+https://github.com/rust-lang/crates.io-index" 3463 + checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 3464 + 3465 + [[package]] 3466 + name = "yoke" 3467 + version = "0.8.0" 3468 + source = "registry+https://github.com/rust-lang/crates.io-index" 3469 + checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 3470 + dependencies = [ 3471 + "serde", 3472 + "stable_deref_trait", 3473 + "yoke-derive", 3474 + "zerofrom", 3475 + ] 3476 + 3477 + [[package]] 3478 + name = "yoke-derive" 3479 + version = "0.8.0" 3480 + source = "registry+https://github.com/rust-lang/crates.io-index" 3481 + checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 3482 + dependencies = [ 3483 + "proc-macro2", 3484 + "quote", 3485 + "syn 2.0.106", 3486 + "synstructure", 3487 + ] 3488 + 3489 + [[package]] 3490 + name = "zerocopy" 3491 + version = "0.8.27" 3492 + source = "registry+https://github.com/rust-lang/crates.io-index" 3493 + checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" 3494 + dependencies = [ 3495 + "zerocopy-derive", 3496 + ] 3497 + 3498 + [[package]] 3499 + name = "zerocopy-derive" 3500 + version = "0.8.27" 3501 + source = "registry+https://github.com/rust-lang/crates.io-index" 3502 + checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" 3503 + dependencies = [ 3504 + "proc-macro2", 3505 + "quote", 3506 + "syn 2.0.106", 3507 + ] 3508 + 3509 + [[package]] 3510 + name = "zerofrom" 3511 + version = "0.1.6" 3512 + source = "registry+https://github.com/rust-lang/crates.io-index" 3513 + checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 3514 + dependencies = [ 3515 + "zerofrom-derive", 3516 + ] 3517 + 3518 + [[package]] 3519 + name = "zerofrom-derive" 3520 + version = "0.1.6" 3521 + source = "registry+https://github.com/rust-lang/crates.io-index" 3522 + checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 3523 + dependencies = [ 3524 + "proc-macro2", 3525 + "quote", 3526 + "syn 2.0.106", 3527 + "synstructure", 3528 + ] 3529 + 3530 + [[package]] 3531 + name = "zeroize" 3532 + version = "1.8.2" 3533 + source = "registry+https://github.com/rust-lang/crates.io-index" 3534 + checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" 3535 + dependencies = [ 3536 + "serde", 3537 + ] 3538 + 3539 + [[package]] 3540 + name = "zerotrie" 3541 + version = "0.2.2" 3542 + source = "registry+https://github.com/rust-lang/crates.io-index" 3543 + checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 3544 + dependencies = [ 3545 + "displaydoc", 3546 + "yoke", 3547 + "zerofrom", 3548 + ] 3549 + 3550 + [[package]] 3551 + name = "zerovec" 3552 + version = "0.11.4" 3553 + source = "registry+https://github.com/rust-lang/crates.io-index" 3554 + checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" 3555 + dependencies = [ 3556 + "yoke", 3557 + "zerofrom", 3558 + "zerovec-derive", 3559 + ] 3560 + 3561 + [[package]] 3562 + name = "zerovec-derive" 3563 + version = "0.11.1" 3564 + source = "registry+https://github.com/rust-lang/crates.io-index" 3565 + checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 3566 + dependencies = [ 3567 + "proc-macro2", 3568 + "quote", 3569 + "syn 2.0.106", 3570 + ] 3571 + 3572 + [[package]] 3573 + name = "zstd" 3574 + version = "0.13.3" 3575 + source = "registry+https://github.com/rust-lang/crates.io-index" 3576 + checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" 3577 + dependencies = [ 3578 + "zstd-safe", 3579 + ] 3580 + 3581 + [[package]] 3582 + name = "zstd-safe" 3583 + version = "7.2.4" 3584 + source = "registry+https://github.com/rust-lang/crates.io-index" 3585 + checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" 3586 + dependencies = [ 3587 + "zstd-sys", 3588 + ] 3589 + 3590 + [[package]] 3591 + name = "zstd-sys" 3592 + version = "2.0.16+zstd.1.5.7" 3593 + source = "registry+https://github.com/rust-lang/crates.io-index" 3594 + checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" 3595 + dependencies = [ 3596 + "cc", 3597 + "pkg-config", 3598 + ]
+18
Cargo.toml
··· 1 + [package] 2 + name = "at-me" 3 + version = "0.1.0" 4 + edition = "2021" 5 + 6 + [dependencies] 7 + actix-web = "4.10" 8 + actix-session = { version = "0.10", features = ["cookie-session"] } 9 + atrium-api = "0.25" 10 + atrium-common = "0.1" 11 + atrium-oauth = "0.1.0" 12 + atrium-identity = "0.1.3" 13 + serde = { version = "1.0", features = ["derive"] } 14 + serde_json = "1.0" 15 + tokio = { version = "1", features = ["macros", "rt-multi-thread"] } 16 + hickory-resolver = "0.24" 17 + env_logger = "0.11" 18 + log = "0.4"
+17
README.md
··· 1 + # @me 2 + 3 + a minimal visualization of your global identity in the atproto ecosystem. 4 + 5 + ## what is this 6 + 7 + in decentralized social networks, you own your identity and your data lives in your personal data server. third-party applications create records in your repository using different lexicons (data schemas). 8 + 9 + @me shows this visually: your identity at the center, surrounded by the third-party apps that have created data for you. click an app to see what lexicons it uses. 10 + 11 + ## why 12 + 13 + most people don't understand that their bluesky posts, github-like repos, and game saves all live in the same place - their PDS. this makes it obvious. 14 + 15 + --- 16 + 17 + sign in with any atproto handle at http://localhost:8080
+41
src/main.rs
··· 1 + use actix_session::{SessionMiddleware, config::PersistentSession, storage::CookieSessionStore}; 2 + use actix_web::{App, HttpServer, cookie::{Key, time::Duration}, middleware, web}; 3 + 4 + mod oauth; 5 + mod routes; 6 + mod templates; 7 + 8 + #[actix_web::main] 9 + async fn main() -> std::io::Result<()> { 10 + env_logger::init(); 11 + 12 + let client = oauth::create_oauth_client(); 13 + 14 + println!("starting server at http://localhost:8080"); 15 + 16 + HttpServer::new(move || { 17 + App::new() 18 + .wrap(middleware::Logger::default()) 19 + .wrap( 20 + SessionMiddleware::builder( 21 + CookieSessionStore::default(), 22 + Key::from(&[0; 64]), 23 + ) 24 + .cookie_secure(false) 25 + .session_lifecycle( 26 + PersistentSession::default() 27 + .session_ttl(Duration::days(30)) 28 + ) 29 + .build(), 30 + ) 31 + .app_data(web::Data::new(client.clone())) 32 + .service(routes::index) 33 + .service(routes::login) 34 + .service(routes::callback) 35 + .service(routes::logout) 36 + .service(routes::restore_session) 37 + }) 38 + .bind(("127.0.0.1", 8080))? 39 + .run() 40 + .await 41 + }
+70
src/oauth.rs
··· 1 + use atrium_identity::{ 2 + did::{CommonDidResolver, CommonDidResolverConfig, DEFAULT_PLC_DIRECTORY_URL}, 3 + handle::{AtprotoHandleResolver, AtprotoHandleResolverConfig, DnsTxtResolver}, 4 + }; 5 + use atrium_oauth::{ 6 + AtprotoLocalhostClientMetadata, DefaultHttpClient, KnownScope, OAuthClient, 7 + OAuthClientConfig, OAuthResolverConfig, Scope, 8 + store::{session::MemorySessionStore, state::MemoryStateStore}, 9 + }; 10 + use hickory_resolver::{TokioAsyncResolver, config::{ResolverConfig, ResolverOpts}}; 11 + use std::sync::Arc; 12 + 13 + #[derive(Clone)] 14 + pub struct HickoryDnsResolver(Arc<TokioAsyncResolver>); 15 + 16 + impl DnsTxtResolver for HickoryDnsResolver { 17 + async fn resolve( 18 + &self, 19 + domain: &str, 20 + ) -> Result<Vec<String>, Box<dyn std::error::Error + Send + Sync>> { 21 + Ok(self 22 + .0 23 + .txt_lookup(domain) 24 + .await? 25 + .iter() 26 + .map(|txt| txt.to_string()) 27 + .collect()) 28 + } 29 + } 30 + 31 + pub type OAuthClientType = Arc< 32 + OAuthClient< 33 + MemoryStateStore, 34 + MemorySessionStore, 35 + CommonDidResolver<DefaultHttpClient>, 36 + AtprotoHandleResolver<HickoryDnsResolver, DefaultHttpClient>, 37 + >, 38 + >; 39 + 40 + pub fn create_oauth_client() -> OAuthClientType { 41 + let http_client = Arc::new(DefaultHttpClient::default()); 42 + let dns_resolver = HickoryDnsResolver(Arc::new( 43 + TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default()), 44 + )); 45 + 46 + Arc::new( 47 + OAuthClient::new(OAuthClientConfig { 48 + client_metadata: AtprotoLocalhostClientMetadata { 49 + redirect_uris: Some(vec!["http://127.0.0.1:8080/oauth/callback".to_string()]), 50 + scopes: Some(vec![Scope::Known(KnownScope::Atproto)]), 51 + }, 52 + keys: None, 53 + resolver: OAuthResolverConfig { 54 + did_resolver: CommonDidResolver::new(CommonDidResolverConfig { 55 + plc_directory_url: DEFAULT_PLC_DIRECTORY_URL.to_string(), 56 + http_client: http_client.clone(), 57 + }), 58 + handle_resolver: AtprotoHandleResolver::new(AtprotoHandleResolverConfig { 59 + dns_txt_resolver: dns_resolver, 60 + http_client: http_client.clone(), 61 + }), 62 + authorization_server_metadata: Default::default(), 63 + protected_resource_metadata: Default::default(), 64 + }, 65 + state_store: MemoryStateStore::default(), 66 + session_store: MemorySessionStore::default(), 67 + }) 68 + .expect("failed to create oauth client"), 69 + ) 70 + }
+120
src/routes.rs
··· 1 + use actix_session::Session; 2 + use actix_web::{get, post, web, HttpResponse, Responder}; 3 + use atrium_oauth::{AuthorizeOptions, CallbackParams, KnownScope, Scope}; 4 + use serde::Deserialize; 5 + 6 + use crate::oauth::OAuthClientType; 7 + use crate::templates; 8 + 9 + #[derive(Deserialize)] 10 + pub struct LoginForm { 11 + handle: String, 12 + } 13 + 14 + #[derive(Deserialize)] 15 + pub struct OAuthParams { 16 + state: Option<String>, 17 + iss: Option<String>, 18 + code: Option<String>, 19 + error: Option<String>, 20 + } 21 + 22 + #[get("/")] 23 + pub async fn index(session: Session) -> impl Responder { 24 + let did: Option<String> = session.get("did").unwrap_or(None); 25 + 26 + match did { 27 + Some(did) => HttpResponse::Ok() 28 + .content_type("text/html") 29 + .body(templates::app_page(&did)), 30 + None => HttpResponse::Ok() 31 + .content_type("text/html") 32 + .body(templates::login_page()), 33 + } 34 + } 35 + 36 + #[post("/login")] 37 + pub async fn login( 38 + form: web::Form<LoginForm>, 39 + client: web::Data<OAuthClientType>, 40 + ) -> HttpResponse { 41 + let handle = match atrium_api::types::string::Handle::new(form.handle.clone()) { 42 + Ok(h) => h, 43 + Err(_) => return HttpResponse::BadRequest().body("invalid handle"), 44 + }; 45 + 46 + match client 47 + .authorize( 48 + &handle, 49 + AuthorizeOptions { 50 + scopes: vec![Scope::Known(KnownScope::Atproto)], 51 + ..Default::default() 52 + }, 53 + ) 54 + .await 55 + { 56 + Ok(url) => HttpResponse::SeeOther() 57 + .append_header(("Location", url)) 58 + .finish(), 59 + Err(_) => HttpResponse::InternalServerError().body("oauth error"), 60 + } 61 + } 62 + 63 + #[get("/oauth/callback")] 64 + pub async fn callback( 65 + params: web::Query<OAuthParams>, 66 + client: web::Data<OAuthClientType>, 67 + session: Session, 68 + ) -> HttpResponse { 69 + if let Some(error) = &params.error { 70 + return HttpResponse::BadRequest().body(format!("oauth error: {}", error)); 71 + } 72 + 73 + let code = match &params.code { 74 + Some(c) => c.clone(), 75 + None => return HttpResponse::BadRequest().body("missing code"), 76 + }; 77 + 78 + let callback_params = CallbackParams { 79 + code, 80 + state: params.state.clone(), 81 + iss: params.iss.clone(), 82 + }; 83 + 84 + match client.callback(callback_params).await { 85 + Ok((bsky_session, _)) => { 86 + let agent = atrium_api::agent::Agent::new(bsky_session); 87 + if let Some(did) = agent.did().await { 88 + session.insert("did", did.to_string()).unwrap(); 89 + HttpResponse::SeeOther() 90 + .append_header(("Location", "/")) 91 + .finish() 92 + } else { 93 + HttpResponse::InternalServerError().body("no did") 94 + } 95 + } 96 + Err(e) => HttpResponse::InternalServerError().body(format!("callback error: {}", e)), 97 + } 98 + } 99 + 100 + #[get("/logout")] 101 + pub async fn logout(session: Session) -> HttpResponse { 102 + session.purge(); 103 + HttpResponse::SeeOther() 104 + .append_header(("Location", "/")) 105 + .finish() 106 + } 107 + 108 + #[derive(Deserialize)] 109 + pub struct RestoreSession { 110 + did: String, 111 + } 112 + 113 + #[post("/api/restore-session")] 114 + pub async fn restore_session( 115 + data: web::Json<RestoreSession>, 116 + session: Session, 117 + ) -> HttpResponse { 118 + session.insert("did", &data.did).unwrap(); 119 + HttpResponse::Ok().finish() 120 + }
+664
src/templates.rs
··· 1 + pub fn login_page() -> &'static str { 2 + r#" 3 + <!DOCTYPE html> 4 + <html> 5 + <head> 6 + <meta charset="UTF-8"> 7 + <title>@me - login</title> 8 + <style> 9 + * { margin: 0; padding: 0; box-sizing: border-box; } 10 + body { font-family: 'Monaco', 'Courier New', monospace; display: flex; align-items: center; justify-content: center; height: 100vh; background: #000; color: #0f0; } 11 + .container { text-align: center; } 12 + h1 { font-size: 2rem; margin-bottom: 2rem; } 13 + input { font-family: 'Monaco', 'Courier New', monospace; font-size: 0.9rem; padding: 0.5rem; margin: 0.5rem; background: #000; border: 1px solid #0f0; color: #0f0; } 14 + button { font-family: 'Monaco', 'Courier New', monospace; font-size: 0.9rem; padding: 0.5rem 1rem; cursor: pointer; background: #000; border: 1px solid #0f0; color: #0f0; } 15 + button:hover { background: #0f0; color: #000; } 16 + .hidden { display: none; } 17 + .loading { color: #0f0; opacity: 0.5; } 18 + </style> 19 + </head> 20 + <body> 21 + <div class="container"> 22 + <div id="restoring" class="loading hidden">restoring session...</div> 23 + <form id="loginForm" method="post" action="/login"> 24 + <h1>@me</h1> 25 + <input type="text" name="handle" placeholder="handle.bsky.social" required autofocus> 26 + <button type="submit">login</button> 27 + </form> 28 + </div> 29 + <script> 30 + const savedDid = localStorage.getItem('atme_did'); 31 + if (savedDid) { 32 + document.getElementById('loginForm').classList.add('hidden'); 33 + document.getElementById('restoring').classList.remove('hidden'); 34 + 35 + fetch('/api/restore-session', { 36 + method: 'POST', 37 + headers: { 'Content-Type': 'application/json' }, 38 + body: JSON.stringify({ did: savedDid }) 39 + }).then(r => { 40 + if (r.ok) { 41 + window.location.href = '/'; 42 + } else { 43 + localStorage.removeItem('atme_did'); 44 + document.getElementById('loginForm').classList.remove('hidden'); 45 + document.getElementById('restoring').classList.add('hidden'); 46 + } 47 + }).catch(() => { 48 + localStorage.removeItem('atme_did'); 49 + document.getElementById('loginForm').classList.remove('hidden'); 50 + document.getElementById('restoring').classList.add('hidden'); 51 + }); 52 + } 53 + </script> 54 + </body> 55 + </html> 56 + "# 57 + } 58 + 59 + pub fn app_page(did: &str) -> String { 60 + format!(r#" 61 + <!DOCTYPE html> 62 + <html> 63 + <head> 64 + <meta charset="UTF-8"> 65 + <title>@me</title> 66 + <style> 67 + * {{ margin: 0; padding: 0; box-sizing: border-box; }} 68 + 69 + :root {{ 70 + --bg: #f5f1e8; 71 + --text: #4a4238; 72 + --text-light: #8a7a6a; 73 + --text-lighter: #6b5d4f; 74 + --border: #c9bfa8; 75 + --surface: #e5dbc8; 76 + --surface-hover: #d9cdb5; 77 + }} 78 + 79 + @media (prefers-color-scheme: dark) {{ 80 + :root {{ 81 + --bg: #1a1a1a; 82 + --text: #e5e5e5; 83 + --text-light: #a0a0a0; 84 + --text-lighter: #c0c0c0; 85 + --border: #404040; 86 + --surface: #2a2a2a; 87 + --surface-hover: #353535; 88 + }} 89 + }} 90 + 91 + body {{ 92 + font-family: 'Courier New', monospace; 93 + height: 100vh; 94 + background: var(--bg); 95 + color: var(--text); 96 + overflow: hidden; 97 + position: relative; 98 + }} 99 + 100 + .canvas {{ 101 + width: 100%; 102 + height: 100%; 103 + position: relative; 104 + display: flex; 105 + align-items: center; 106 + justify-content: center; 107 + }} 108 + 109 + .logout {{ 110 + position: fixed; 111 + top: 1.5rem; 112 + right: 1.5rem; 113 + font-size: 0.7rem; 114 + color: var(--text-light); 115 + text-decoration: none; 116 + border: 1px solid var(--border); 117 + padding: 0.4rem 0.8rem; 118 + transition: all 0.2s ease; 119 + z-index: 100; 120 + }} 121 + 122 + .logout:hover {{ 123 + background: var(--surface); 124 + color: var(--text); 125 + }} 126 + 127 + .info {{ 128 + position: fixed; 129 + top: 1.5rem; 130 + left: 1.5rem; 131 + width: 24px; 132 + height: 24px; 133 + border-radius: 50%; 134 + border: 1px solid var(--border); 135 + display: flex; 136 + align-items: center; 137 + justify-content: center; 138 + font-size: 0.7rem; 139 + color: var(--text-light); 140 + cursor: pointer; 141 + transition: all 0.2s ease; 142 + z-index: 100; 143 + }} 144 + 145 + .info:hover {{ 146 + background: var(--surface); 147 + color: var(--text); 148 + }} 149 + 150 + .info-modal {{ 151 + position: fixed; 152 + top: 50%; 153 + left: 50%; 154 + transform: translate(-50%, -50%); 155 + background: var(--surface); 156 + border: 2px solid var(--border); 157 + padding: 2rem; 158 + max-width: 500px; 159 + z-index: 2000; 160 + display: none; 161 + border-radius: 4px; 162 + }} 163 + 164 + .info-modal.visible {{ 165 + display: block; 166 + }} 167 + 168 + .info-modal h2 {{ 169 + margin-bottom: 1rem; 170 + font-size: 1rem; 171 + color: var(--text); 172 + }} 173 + 174 + .info-modal p {{ 175 + margin-bottom: 0.75rem; 176 + font-size: 0.75rem; 177 + line-height: 1.5; 178 + color: var(--text-lighter); 179 + }} 180 + 181 + .info-modal button {{ 182 + margin-top: 1rem; 183 + padding: 0.5rem 1rem; 184 + background: var(--bg); 185 + border: 1px solid var(--border); 186 + color: var(--text); 187 + font-family: 'Courier New', monospace; 188 + font-size: 0.7rem; 189 + cursor: pointer; 190 + transition: all 0.2s ease; 191 + }} 192 + 193 + .info-modal button:hover {{ 194 + background: var(--surface-hover); 195 + }} 196 + 197 + .overlay {{ 198 + position: fixed; 199 + top: 0; 200 + left: 0; 201 + right: 0; 202 + bottom: 0; 203 + background: rgba(0, 0, 0, 0.5); 204 + z-index: 1999; 205 + display: none; 206 + }} 207 + 208 + .overlay.visible {{ 209 + display: block; 210 + }} 211 + 212 + .identity {{ 213 + position: absolute; 214 + background: var(--surface); 215 + border: 2px solid var(--text-light); 216 + border-radius: 50%; 217 + width: 120px; 218 + height: 120px; 219 + display: flex; 220 + flex-direction: column; 221 + align-items: center; 222 + justify-content: center; 223 + gap: 0.3rem; 224 + z-index: 10; 225 + }} 226 + 227 + .identity-label {{ 228 + font-size: 0.5rem; 229 + color: var(--text-light); 230 + text-transform: uppercase; 231 + letter-spacing: 0.05em; 232 + }} 233 + 234 + .identity-value {{ 235 + font-size: 0.7rem; 236 + color: var(--text); 237 + text-align: center; 238 + word-break: break-word; 239 + max-width: 100px; 240 + }} 241 + 242 + .app-view {{ 243 + position: absolute; 244 + display: flex; 245 + flex-direction: column; 246 + align-items: center; 247 + gap: 0.4rem; 248 + cursor: pointer; 249 + transition: all 0.2s ease; 250 + opacity: 0.7; 251 + }} 252 + 253 + .app-view:hover {{ 254 + opacity: 1; 255 + transform: scale(1.1); 256 + z-index: 100; 257 + }} 258 + 259 + .app-circle {{ 260 + background: var(--surface-hover); 261 + border: 1px solid var(--border); 262 + border-radius: 50%; 263 + width: 60px; 264 + height: 60px; 265 + display: flex; 266 + align-items: center; 267 + justify-content: center; 268 + transition: all 0.2s ease; 269 + }} 270 + 271 + .app-view:hover .app-circle {{ 272 + background: var(--surface); 273 + border-color: var(--text-light); 274 + }} 275 + 276 + .app-name {{ 277 + font-size: 0.65rem; 278 + color: var(--text); 279 + text-align: center; 280 + max-width: 100px; 281 + }} 282 + 283 + .detail-panel {{ 284 + position: fixed; 285 + top: 0; 286 + left: 0; 287 + bottom: 0; 288 + width: 320px; 289 + background: var(--surface); 290 + border-right: 2px solid var(--border); 291 + padding: 2.5rem 2rem; 292 + overflow-y: auto; 293 + opacity: 0; 294 + transform: translateX(-100%); 295 + transition: all 0.25s ease; 296 + z-index: 1000; 297 + }} 298 + 299 + .detail-panel.visible {{ 300 + opacity: 1; 301 + transform: translateX(0); 302 + }} 303 + 304 + .detail-panel h3 {{ 305 + margin-bottom: 0.75rem; 306 + font-size: 0.85rem; 307 + color: var(--text); 308 + }} 309 + 310 + .detail-panel .subtitle {{ 311 + font-size: 0.7rem; 312 + color: var(--text-light); 313 + margin-bottom: 1.5rem; 314 + line-height: 1.4; 315 + }} 316 + 317 + .tree-item {{ 318 + padding: 0.65rem 0.75rem; 319 + font-size: 0.75rem; 320 + color: var(--text-lighter); 321 + background: var(--bg); 322 + border: 1px solid var(--border); 323 + border-radius: 2px; 324 + margin-bottom: 0.5rem; 325 + transition: all 0.15s ease; 326 + cursor: pointer; 327 + }} 328 + 329 + .tree-item:hover {{ 330 + background: var(--surface-hover); 331 + border-color: var(--text-light); 332 + }} 333 + 334 + .tree-item:last-child {{ 335 + margin-bottom: 0; 336 + }} 337 + 338 + .tree-item-header {{ 339 + display: flex; 340 + justify-content: space-between; 341 + align-items: center; 342 + }} 343 + 344 + .tree-item-count {{ 345 + font-size: 0.65rem; 346 + color: var(--text-light); 347 + }} 348 + 349 + .record-list {{ 350 + margin-top: 0.5rem; 351 + padding-top: 0.5rem; 352 + border-top: 1px solid var(--border); 353 + }} 354 + 355 + .record {{ 356 + padding: 0.5rem; 357 + margin-bottom: 0.5rem; 358 + background: var(--surface); 359 + border-radius: 2px; 360 + font-size: 0.65rem; 361 + color: var(--text-light); 362 + }} 363 + 364 + .record:last-child {{ 365 + margin-bottom: 0; 366 + }} 367 + 368 + .record pre {{ 369 + margin: 0; 370 + white-space: pre-wrap; 371 + word-break: break-word; 372 + }} 373 + 374 + .load-more {{ 375 + margin-top: 0.5rem; 376 + padding: 0.4rem 0.6rem; 377 + background: var(--bg); 378 + border: 1px solid var(--border); 379 + color: var(--text); 380 + font-family: 'Courier New', monospace; 381 + font-size: 0.65rem; 382 + cursor: pointer; 383 + width: 100%; 384 + transition: all 0.15s ease; 385 + }} 386 + 387 + .load-more:hover {{ 388 + background: var(--surface-hover); 389 + }} 390 + 391 + .footer {{ 392 + position: fixed; 393 + bottom: 1rem; 394 + left: 50%; 395 + transform: translateX(-50%); 396 + font-size: 0.65rem; 397 + color: var(--text-light); 398 + z-index: 100; 399 + }} 400 + 401 + .footer a {{ 402 + color: var(--text-light); 403 + text-decoration: none; 404 + border-bottom: 1px solid transparent; 405 + transition: border-color 0.2s ease; 406 + }} 407 + 408 + .footer a:hover {{ 409 + border-bottom-color: var(--text-light); 410 + }} 411 + 412 + .loading {{ color: var(--text-light); font-size: 0.75rem; }} 413 + </style> 414 + </head> 415 + <body> 416 + <div class="info" id="infoBtn">i</div> 417 + <a href="/logout" class="logout">logout</a> 418 + 419 + <div class="overlay" id="overlay"></div> 420 + <div class="info-modal" id="infoModal"> 421 + <h2>@me - your at protocol identity</h2> 422 + <p>in decentralized social networks, you own your identity and your data lives in your personal data server (pds).</p> 423 + <p>third-party applications create records in your repository using different lexicons (data schemas). for example, bluesky creates posts, white wind stores blog entries, tangled.org hosts code repositories, and frontpage aggregates links - all in the same place.</p> 424 + <p>this visualization shows your identity at the center, surrounded by the third-party apps that have created data for you. click an app to see what types of records it stores, then click a record type to see the actual data.</p> 425 + <button id="closeInfo">got it</button> 426 + </div> 427 + 428 + <div class="canvas"> 429 + <div class="identity"> 430 + <div class="identity-label">you</div> 431 + <div class="identity-value" id="handle">loading...</div> 432 + </div> 433 + <div id="field" class="loading">loading...</div> 434 + </div> 435 + <div id="detail" class="detail-panel"></div> 436 + 437 + <div class="footer"> 438 + <a href="https://tangled.org/@zzstoatzz.io/at-me" target="_blank" rel="noopener noreferrer">view source</a> 439 + </div> 440 + <script> 441 + const did = '{}'; 442 + localStorage.setItem('atme_did', did); 443 + 444 + let globalPds = null; 445 + 446 + // Info modal handlers 447 + document.getElementById('infoBtn').addEventListener('click', () => {{ 448 + document.getElementById('infoModal').classList.add('visible'); 449 + document.getElementById('overlay').classList.add('visible'); 450 + }}); 451 + 452 + document.getElementById('closeInfo').addEventListener('click', () => {{ 453 + document.getElementById('infoModal').classList.remove('visible'); 454 + document.getElementById('overlay').classList.remove('visible'); 455 + }}); 456 + 457 + document.getElementById('overlay').addEventListener('click', () => {{ 458 + document.getElementById('infoModal').classList.remove('visible'); 459 + document.getElementById('overlay').classList.remove('visible'); 460 + }}); 461 + 462 + // First resolve DID to get PDS endpoint and handle 463 + fetch('https://plc.directory/' + did) 464 + .then(r => r.json()) 465 + .then(didDoc => {{ 466 + const pds = didDoc.service.find(s => s.type === 'AtprotoPersonalDataServer')?.serviceEndpoint; 467 + const handle = didDoc.alsoKnownAs?.[0]?.replace('at://', '') || did; 468 + 469 + globalPds = pds; 470 + 471 + // Update identity display with handle 472 + document.getElementById('handle').textContent = '@' + handle; 473 + 474 + // Get all collections from PDS 475 + return fetch(`${{pds}}/xrpc/com.atproto.repo.describeRepo?repo=${{did}}`); 476 + }}) 477 + .then(r => r.json()) 478 + .then(repo => {{ 479 + const collections = repo.collections || []; 480 + 481 + // Group by app namespace (first two parts of lexicon) 482 + const apps = {{}}; 483 + collections.forEach(collection => {{ 484 + const parts = collection.split('.'); 485 + if (parts.length >= 2) {{ 486 + const namespace = `${{parts[0]}}.${{parts[1]}}`; 487 + if (!apps[namespace]) apps[namespace] = []; 488 + apps[namespace].push(collection); 489 + }} 490 + }}); 491 + 492 + const field = document.getElementById('field'); 493 + field.innerHTML = ''; 494 + field.classList.remove('loading'); 495 + 496 + const appNames = Object.keys(apps).sort(); 497 + const radius = 240; 498 + const centerX = window.innerWidth / 2; 499 + const centerY = window.innerHeight / 2; 500 + 501 + appNames.forEach((namespace, i) => {{ 502 + const angle = (i / appNames.length) * 2 * Math.PI - Math.PI / 2; // Start from top 503 + const x = centerX + radius * Math.cos(angle) - 25; 504 + const y = centerY + radius * Math.sin(angle) - 30; 505 + 506 + const div = document.createElement('div'); 507 + div.className = 'app-view'; 508 + div.style.left = `${{x}}px`; 509 + div.style.top = `${{y}}px`; 510 + 511 + const firstLetter = namespace.split('.')[1]?.[0]?.toUpperCase() || namespace[0].toUpperCase(); 512 + 513 + div.innerHTML = ` 514 + <div class="app-circle">${{firstLetter}}</div> 515 + <div class="app-name">${{namespace}}</div> 516 + `; 517 + 518 + div.addEventListener('click', () => {{ 519 + const detail = document.getElementById('detail'); 520 + const collections = apps[namespace]; 521 + 522 + let html = ` 523 + <h3>${{namespace}}</h3> 524 + <div class="subtitle">records stored in your pds:</div> 525 + `; 526 + 527 + if (collections && collections.length > 0) {{ 528 + collections.sort().forEach(lexicon => {{ 529 + const shortName = lexicon.split('.').slice(2).join('.') || lexicon; 530 + html += ` 531 + <div class="tree-item" data-lexicon="${{lexicon}}"> 532 + <div class="tree-item-header"> 533 + <span>${{shortName}}</span> 534 + <span class="tree-item-count">loading...</span> 535 + </div> 536 + </div> 537 + `; 538 + }}); 539 + }} else {{ 540 + html += `<div class="tree-item">no collections found</div>`; 541 + }} 542 + 543 + detail.innerHTML = html; 544 + detail.classList.add('visible'); 545 + 546 + // Fetch record counts for each collection 547 + if (collections && collections.length > 0) {{ 548 + collections.forEach(lexicon => {{ 549 + fetch(`${{globalPds}}/xrpc/com.atproto.repo.listRecords?repo=${{did}}&collection=${{lexicon}}&limit=1`) 550 + .then(r => r.json()) 551 + .then(data => {{ 552 + const item = detail.querySelector(`[data-lexicon="${{lexicon}}"]`); 553 + if (item) {{ 554 + const countSpan = item.querySelector('.tree-item-count'); 555 + // The cursor field indicates there are more records 556 + countSpan.textContent = data.records?.length > 0 ? 'has records' : 'empty'; 557 + }} 558 + }}) 559 + .catch(e => {{ 560 + console.error('Error fetching count for', lexicon, e); 561 + const item = detail.querySelector(`[data-lexicon="${{lexicon}}"]`); 562 + if (item) {{ 563 + const countSpan = item.querySelector('.tree-item-count'); 564 + countSpan.textContent = 'error'; 565 + }} 566 + }}); 567 + }}); 568 + }} 569 + 570 + // Add click handlers to tree items to fetch actual records 571 + detail.querySelectorAll('.tree-item[data-lexicon]').forEach(item => {{ 572 + item.addEventListener('click', (e) => {{ 573 + e.stopPropagation(); 574 + const lexicon = item.dataset.lexicon; 575 + const existingRecords = item.querySelector('.record-list'); 576 + 577 + if (existingRecords) {{ 578 + existingRecords.remove(); 579 + return; 580 + }} 581 + 582 + const recordListDiv = document.createElement('div'); 583 + recordListDiv.className = 'record-list'; 584 + recordListDiv.innerHTML = '<div class="loading">loading records...</div>'; 585 + item.appendChild(recordListDiv); 586 + 587 + fetch(`${{globalPds}}/xrpc/com.atproto.repo.listRecords?repo=${{did}}&collection=${{lexicon}}&limit=5`) 588 + .then(r => r.json()) 589 + .then(data => {{ 590 + if (data.records && data.records.length > 0) {{ 591 + let recordsHtml = ''; 592 + data.records.forEach(record => {{ 593 + const json = JSON.stringify(record.value, null, 2); 594 + recordsHtml += `<div class="record"><pre>${{json}}</pre></div>`; 595 + }}); 596 + 597 + if (data.cursor) {{ 598 + recordsHtml += `<button class="load-more" data-cursor="${{data.cursor}}" data-lexicon="${{lexicon}}">load more</button>`; 599 + }} 600 + 601 + recordListDiv.innerHTML = recordsHtml; 602 + 603 + // Add handler for load more button 604 + const loadMoreBtn = recordListDiv.querySelector('.load-more'); 605 + if (loadMoreBtn) {{ 606 + loadMoreBtn.addEventListener('click', (e) => {{ 607 + e.stopPropagation(); 608 + const cursor = loadMoreBtn.dataset.cursor; 609 + const lexicon = loadMoreBtn.dataset.lexicon; 610 + 611 + loadMoreBtn.textContent = 'loading...'; 612 + 613 + fetch(`${{globalPds}}/xrpc/com.atproto.repo.listRecords?repo=${{did}}&collection=${{lexicon}}&limit=5&cursor=${{cursor}}`) 614 + .then(r => r.json()) 615 + .then(moreData => {{ 616 + let moreHtml = ''; 617 + moreData.records.forEach(record => {{ 618 + const json = JSON.stringify(record.value, null, 2); 619 + moreHtml += `<div class="record"><pre>${{json}}</pre></div>`; 620 + }}); 621 + 622 + loadMoreBtn.remove(); 623 + recordListDiv.insertAdjacentHTML('beforeend', moreHtml); 624 + 625 + if (moreData.cursor) {{ 626 + recordListDiv.insertAdjacentHTML('beforeend', 627 + `<button class="load-more" data-cursor="${{moreData.cursor}}" data-lexicon="${{lexicon}}">load more</button>` 628 + ); 629 + }} 630 + }}); 631 + }}); 632 + }} 633 + }} else {{ 634 + recordListDiv.innerHTML = '<div class="record">no records found</div>'; 635 + }} 636 + }}) 637 + .catch(e => {{ 638 + console.error('Error fetching records:', e); 639 + recordListDiv.innerHTML = '<div class="record">error loading records</div>'; 640 + }}); 641 + }}); 642 + }}); 643 + }}); 644 + 645 + field.appendChild(div); 646 + }}); 647 + 648 + // Close detail panel when clicking canvas 649 + const canvas = document.querySelector('.canvas'); 650 + canvas.addEventListener('click', (e) => {{ 651 + if (e.target === canvas) {{ 652 + document.getElementById('detail').classList.remove('visible'); 653 + }} 654 + }}); 655 + }}) 656 + .catch(e => {{ 657 + document.getElementById('field').innerHTML = 'error loading records'; 658 + console.error(e); 659 + }}); 660 + </script> 661 + </body> 662 + </html> 663 + "#, did) 664 + }