├── .github └── workflows │ └── build.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── build.rs └── src └── main.rs /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build Test 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | name: 7 | description: 'Log level' 8 | required: true 9 | default: 'warning' 10 | 11 | jobs: 12 | test: 13 | name: build project 14 | runs-on: ${{ matrix.os }} 15 | strategy: 16 | matrix: 17 | include: 18 | - os: windows-latest 19 | steps: 20 | - name: Checkout 21 | uses: actions/checkout@master 22 | 23 | 24 | - name: build_windows 25 | run: | 26 | $ENV:RUSTFLAGS='-C target-feature=+crt-static' 27 | rustup target add i686-pc-windows-msvc 28 | cargo build --release --target i686-pc-windows-msvc 29 | shell: pwsh 30 | 31 | 32 | - name: before_windows_upload 33 | run: | 34 | mkdir Release 35 | cp target/i686-pc-windows-msvc/release/llob_install.exe Release/llob_install.exe 36 | shell: pwsh 37 | 38 | - name: Strip and run UPX on executables 39 | uses: crazy-max/ghaction-upx@v3 40 | with: 41 | version: latest 42 | files: | 43 | Release/llob_install.exe 44 | 45 | 46 | - name: upload file1 47 | uses: actions/upload-artifact@v3 48 | with: 49 | name: llob_install.exe 50 | path: 51 | Release/llob_install.exe -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.22.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "aes" 22 | version = "0.8.4" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" 25 | dependencies = [ 26 | "cfg-if", 27 | "cipher", 28 | "cpufeatures", 29 | ] 30 | 31 | [[package]] 32 | name = "aho-corasick" 33 | version = "1.1.3" 34 | source = "registry+https://github.com/rust-lang/crates.io-index" 35 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 36 | dependencies = [ 37 | "memchr", 38 | ] 39 | 40 | [[package]] 41 | name = "atomic-waker" 42 | version = "1.1.2" 43 | source = "registry+https://github.com/rust-lang/crates.io-index" 44 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 45 | 46 | [[package]] 47 | name = "autocfg" 48 | version = "1.3.0" 49 | source = "registry+https://github.com/rust-lang/crates.io-index" 50 | checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" 51 | 52 | [[package]] 53 | name = "backtrace" 54 | version = "0.3.73" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" 57 | dependencies = [ 58 | "addr2line", 59 | "cc", 60 | "cfg-if", 61 | "libc", 62 | "miniz_oxide", 63 | "object", 64 | "rustc-demangle", 65 | ] 66 | 67 | [[package]] 68 | name = "base64" 69 | version = "0.22.1" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 72 | 73 | [[package]] 74 | name = "base64ct" 75 | version = "1.6.0" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 78 | 79 | [[package]] 80 | name = "bitflags" 81 | version = "1.3.2" 82 | source = "registry+https://github.com/rust-lang/crates.io-index" 83 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 84 | 85 | [[package]] 86 | name = "bitflags" 87 | version = "2.6.0" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 90 | 91 | [[package]] 92 | name = "block-buffer" 93 | version = "0.10.4" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 96 | dependencies = [ 97 | "generic-array", 98 | ] 99 | 100 | [[package]] 101 | name = "bumpalo" 102 | version = "3.16.0" 103 | source = "registry+https://github.com/rust-lang/crates.io-index" 104 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 105 | 106 | [[package]] 107 | name = "byteorder" 108 | version = "1.5.0" 109 | source = "registry+https://github.com/rust-lang/crates.io-index" 110 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 111 | 112 | [[package]] 113 | name = "bytes" 114 | version = "1.6.1" 115 | source = "registry+https://github.com/rust-lang/crates.io-index" 116 | checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" 117 | 118 | [[package]] 119 | name = "bzip2" 120 | version = "0.4.4" 121 | source = "registry+https://github.com/rust-lang/crates.io-index" 122 | checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" 123 | dependencies = [ 124 | "bzip2-sys", 125 | "libc", 126 | ] 127 | 128 | [[package]] 129 | name = "bzip2-sys" 130 | version = "0.1.11+1.0.8" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" 133 | dependencies = [ 134 | "cc", 135 | "libc", 136 | "pkg-config", 137 | ] 138 | 139 | [[package]] 140 | name = "cc" 141 | version = "1.1.6" 142 | source = "registry+https://github.com/rust-lang/crates.io-index" 143 | checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" 144 | dependencies = [ 145 | "jobserver", 146 | "libc", 147 | ] 148 | 149 | [[package]] 150 | name = "cfg-if" 151 | version = "1.0.0" 152 | source = "registry+https://github.com/rust-lang/crates.io-index" 153 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 154 | 155 | [[package]] 156 | name = "cipher" 157 | version = "0.4.4" 158 | source = "registry+https://github.com/rust-lang/crates.io-index" 159 | checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" 160 | dependencies = [ 161 | "crypto-common", 162 | "inout", 163 | ] 164 | 165 | [[package]] 166 | name = "constant_time_eq" 167 | version = "0.1.5" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" 170 | 171 | [[package]] 172 | name = "core-foundation" 173 | version = "0.9.4" 174 | source = "registry+https://github.com/rust-lang/crates.io-index" 175 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 176 | dependencies = [ 177 | "core-foundation-sys", 178 | "libc", 179 | ] 180 | 181 | [[package]] 182 | name = "core-foundation-sys" 183 | version = "0.8.6" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 186 | 187 | [[package]] 188 | name = "cpufeatures" 189 | version = "0.2.12" 190 | source = "registry+https://github.com/rust-lang/crates.io-index" 191 | checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" 192 | dependencies = [ 193 | "libc", 194 | ] 195 | 196 | [[package]] 197 | name = "crc32fast" 198 | version = "1.4.2" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 201 | dependencies = [ 202 | "cfg-if", 203 | ] 204 | 205 | [[package]] 206 | name = "crossbeam-deque" 207 | version = "0.8.5" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" 210 | dependencies = [ 211 | "crossbeam-epoch", 212 | "crossbeam-utils", 213 | ] 214 | 215 | [[package]] 216 | name = "crossbeam-epoch" 217 | version = "0.9.18" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 220 | dependencies = [ 221 | "crossbeam-utils", 222 | ] 223 | 224 | [[package]] 225 | name = "crossbeam-utils" 226 | version = "0.8.20" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" 229 | 230 | [[package]] 231 | name = "crypto-common" 232 | version = "0.1.6" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 235 | dependencies = [ 236 | "generic-array", 237 | "typenum", 238 | ] 239 | 240 | [[package]] 241 | name = "deranged" 242 | version = "0.3.11" 243 | source = "registry+https://github.com/rust-lang/crates.io-index" 244 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 245 | dependencies = [ 246 | "powerfmt", 247 | ] 248 | 249 | [[package]] 250 | name = "digest" 251 | version = "0.10.7" 252 | source = "registry+https://github.com/rust-lang/crates.io-index" 253 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 254 | dependencies = [ 255 | "block-buffer", 256 | "crypto-common", 257 | "subtle", 258 | ] 259 | 260 | [[package]] 261 | name = "either" 262 | version = "1.13.0" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 265 | 266 | [[package]] 267 | name = "encoding_rs" 268 | version = "0.8.34" 269 | source = "registry+https://github.com/rust-lang/crates.io-index" 270 | checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" 271 | dependencies = [ 272 | "cfg-if", 273 | ] 274 | 275 | [[package]] 276 | name = "equivalent" 277 | version = "1.0.1" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 280 | 281 | [[package]] 282 | name = "errno" 283 | version = "0.3.9" 284 | source = "registry+https://github.com/rust-lang/crates.io-index" 285 | checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" 286 | dependencies = [ 287 | "libc", 288 | "windows-sys 0.52.0", 289 | ] 290 | 291 | [[package]] 292 | name = "fastrand" 293 | version = "2.1.0" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" 296 | 297 | [[package]] 298 | name = "flate2" 299 | version = "1.0.30" 300 | source = "registry+https://github.com/rust-lang/crates.io-index" 301 | checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" 302 | dependencies = [ 303 | "crc32fast", 304 | "miniz_oxide", 305 | ] 306 | 307 | [[package]] 308 | name = "fnv" 309 | version = "1.0.7" 310 | source = "registry+https://github.com/rust-lang/crates.io-index" 311 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 312 | 313 | [[package]] 314 | name = "foreign-types" 315 | version = "0.3.2" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 318 | dependencies = [ 319 | "foreign-types-shared", 320 | ] 321 | 322 | [[package]] 323 | name = "foreign-types-shared" 324 | version = "0.1.1" 325 | source = "registry+https://github.com/rust-lang/crates.io-index" 326 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 327 | 328 | [[package]] 329 | name = "form_urlencoded" 330 | version = "1.2.1" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 333 | dependencies = [ 334 | "percent-encoding", 335 | ] 336 | 337 | [[package]] 338 | name = "futures-channel" 339 | version = "0.3.30" 340 | source = "registry+https://github.com/rust-lang/crates.io-index" 341 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 342 | dependencies = [ 343 | "futures-core", 344 | ] 345 | 346 | [[package]] 347 | name = "futures-core" 348 | version = "0.3.30" 349 | source = "registry+https://github.com/rust-lang/crates.io-index" 350 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 351 | 352 | [[package]] 353 | name = "futures-sink" 354 | version = "0.3.30" 355 | source = "registry+https://github.com/rust-lang/crates.io-index" 356 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 357 | 358 | [[package]] 359 | name = "futures-task" 360 | version = "0.3.30" 361 | source = "registry+https://github.com/rust-lang/crates.io-index" 362 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 363 | 364 | [[package]] 365 | name = "futures-util" 366 | version = "0.3.30" 367 | source = "registry+https://github.com/rust-lang/crates.io-index" 368 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 369 | dependencies = [ 370 | "futures-core", 371 | "futures-task", 372 | "pin-project-lite", 373 | "pin-utils", 374 | ] 375 | 376 | [[package]] 377 | name = "generic-array" 378 | version = "0.14.7" 379 | source = "registry+https://github.com/rust-lang/crates.io-index" 380 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 381 | dependencies = [ 382 | "typenum", 383 | "version_check", 384 | ] 385 | 386 | [[package]] 387 | name = "getrandom" 388 | version = "0.2.15" 389 | source = "registry+https://github.com/rust-lang/crates.io-index" 390 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 391 | dependencies = [ 392 | "cfg-if", 393 | "libc", 394 | "wasi", 395 | ] 396 | 397 | [[package]] 398 | name = "gimli" 399 | version = "0.29.0" 400 | source = "registry+https://github.com/rust-lang/crates.io-index" 401 | checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" 402 | 403 | [[package]] 404 | name = "goblin" 405 | version = "0.8.2" 406 | source = "registry+https://github.com/rust-lang/crates.io-index" 407 | checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47" 408 | dependencies = [ 409 | "log", 410 | "plain", 411 | "scroll", 412 | ] 413 | 414 | [[package]] 415 | name = "h2" 416 | version = "0.4.5" 417 | source = "registry+https://github.com/rust-lang/crates.io-index" 418 | checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" 419 | dependencies = [ 420 | "atomic-waker", 421 | "bytes", 422 | "fnv", 423 | "futures-core", 424 | "futures-sink", 425 | "http", 426 | "indexmap", 427 | "slab", 428 | "tokio", 429 | "tokio-util", 430 | "tracing", 431 | ] 432 | 433 | [[package]] 434 | name = "hashbrown" 435 | version = "0.14.5" 436 | source = "registry+https://github.com/rust-lang/crates.io-index" 437 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 438 | 439 | [[package]] 440 | name = "hermit-abi" 441 | version = "0.3.9" 442 | source = "registry+https://github.com/rust-lang/crates.io-index" 443 | checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 444 | 445 | [[package]] 446 | name = "hmac" 447 | version = "0.12.1" 448 | source = "registry+https://github.com/rust-lang/crates.io-index" 449 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 450 | dependencies = [ 451 | "digest", 452 | ] 453 | 454 | [[package]] 455 | name = "http" 456 | version = "1.1.0" 457 | source = "registry+https://github.com/rust-lang/crates.io-index" 458 | checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 459 | dependencies = [ 460 | "bytes", 461 | "fnv", 462 | "itoa", 463 | ] 464 | 465 | [[package]] 466 | name = "http-body" 467 | version = "1.0.1" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 470 | dependencies = [ 471 | "bytes", 472 | "http", 473 | ] 474 | 475 | [[package]] 476 | name = "http-body-util" 477 | version = "0.1.2" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" 480 | dependencies = [ 481 | "bytes", 482 | "futures-util", 483 | "http", 484 | "http-body", 485 | "pin-project-lite", 486 | ] 487 | 488 | [[package]] 489 | name = "httparse" 490 | version = "1.9.4" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" 493 | 494 | [[package]] 495 | name = "hyper" 496 | version = "1.4.1" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" 499 | dependencies = [ 500 | "bytes", 501 | "futures-channel", 502 | "futures-util", 503 | "h2", 504 | "http", 505 | "http-body", 506 | "httparse", 507 | "itoa", 508 | "pin-project-lite", 509 | "smallvec", 510 | "tokio", 511 | "want", 512 | ] 513 | 514 | [[package]] 515 | name = "hyper-rustls" 516 | version = "0.27.2" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" 519 | dependencies = [ 520 | "futures-util", 521 | "http", 522 | "hyper", 523 | "hyper-util", 524 | "rustls", 525 | "rustls-pki-types", 526 | "tokio", 527 | "tokio-rustls", 528 | "tower-service", 529 | ] 530 | 531 | [[package]] 532 | name = "hyper-tls" 533 | version = "0.6.0" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 536 | dependencies = [ 537 | "bytes", 538 | "http-body-util", 539 | "hyper", 540 | "hyper-util", 541 | "native-tls", 542 | "tokio", 543 | "tokio-native-tls", 544 | "tower-service", 545 | ] 546 | 547 | [[package]] 548 | name = "hyper-util" 549 | version = "0.1.6" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" 552 | dependencies = [ 553 | "bytes", 554 | "futures-channel", 555 | "futures-util", 556 | "http", 557 | "http-body", 558 | "hyper", 559 | "pin-project-lite", 560 | "socket2", 561 | "tokio", 562 | "tower", 563 | "tower-service", 564 | "tracing", 565 | ] 566 | 567 | [[package]] 568 | name = "idna" 569 | version = "0.5.0" 570 | source = "registry+https://github.com/rust-lang/crates.io-index" 571 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 572 | dependencies = [ 573 | "unicode-bidi", 574 | "unicode-normalization", 575 | ] 576 | 577 | [[package]] 578 | name = "indexmap" 579 | version = "2.2.6" 580 | source = "registry+https://github.com/rust-lang/crates.io-index" 581 | checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 582 | dependencies = [ 583 | "equivalent", 584 | "hashbrown", 585 | ] 586 | 587 | [[package]] 588 | name = "inout" 589 | version = "0.1.3" 590 | source = "registry+https://github.com/rust-lang/crates.io-index" 591 | checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" 592 | dependencies = [ 593 | "generic-array", 594 | ] 595 | 596 | [[package]] 597 | name = "ipnet" 598 | version = "2.9.0" 599 | source = "registry+https://github.com/rust-lang/crates.io-index" 600 | checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" 601 | 602 | [[package]] 603 | name = "itoa" 604 | version = "1.0.11" 605 | source = "registry+https://github.com/rust-lang/crates.io-index" 606 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 607 | 608 | [[package]] 609 | name = "jobserver" 610 | version = "0.1.32" 611 | source = "registry+https://github.com/rust-lang/crates.io-index" 612 | checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" 613 | dependencies = [ 614 | "libc", 615 | ] 616 | 617 | [[package]] 618 | name = "js-sys" 619 | version = "0.3.69" 620 | source = "registry+https://github.com/rust-lang/crates.io-index" 621 | checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" 622 | dependencies = [ 623 | "wasm-bindgen", 624 | ] 625 | 626 | [[package]] 627 | name = "lazy_static" 628 | version = "1.5.0" 629 | source = "registry+https://github.com/rust-lang/crates.io-index" 630 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 631 | 632 | [[package]] 633 | name = "libc" 634 | version = "0.2.155" 635 | source = "registry+https://github.com/rust-lang/crates.io-index" 636 | checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" 637 | 638 | [[package]] 639 | name = "linux-raw-sys" 640 | version = "0.4.14" 641 | source = "registry+https://github.com/rust-lang/crates.io-index" 642 | checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" 643 | 644 | [[package]] 645 | name = "llob_install" 646 | version = "0.1.0" 647 | dependencies = [ 648 | "goblin", 649 | "log", 650 | "path-clean", 651 | "regex", 652 | "reqwest", 653 | "serde_json", 654 | "sysinfo", 655 | "time", 656 | "tokio", 657 | "tracing", 658 | "tracing-subscriber", 659 | "winapi", 660 | "winreg 0.50.0", 661 | "winres", 662 | "zip", 663 | ] 664 | 665 | [[package]] 666 | name = "lock_api" 667 | version = "0.4.12" 668 | source = "registry+https://github.com/rust-lang/crates.io-index" 669 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 670 | dependencies = [ 671 | "autocfg", 672 | "scopeguard", 673 | ] 674 | 675 | [[package]] 676 | name = "log" 677 | version = "0.4.22" 678 | source = "registry+https://github.com/rust-lang/crates.io-index" 679 | checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" 680 | 681 | [[package]] 682 | name = "matchers" 683 | version = "0.1.0" 684 | source = "registry+https://github.com/rust-lang/crates.io-index" 685 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 686 | dependencies = [ 687 | "regex-automata 0.1.10", 688 | ] 689 | 690 | [[package]] 691 | name = "memchr" 692 | version = "2.7.4" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 695 | 696 | [[package]] 697 | name = "mime" 698 | version = "0.3.17" 699 | source = "registry+https://github.com/rust-lang/crates.io-index" 700 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 701 | 702 | [[package]] 703 | name = "miniz_oxide" 704 | version = "0.7.4" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" 707 | dependencies = [ 708 | "adler", 709 | ] 710 | 711 | [[package]] 712 | name = "mio" 713 | version = "1.0.1" 714 | source = "registry+https://github.com/rust-lang/crates.io-index" 715 | checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" 716 | dependencies = [ 717 | "hermit-abi", 718 | "libc", 719 | "wasi", 720 | "windows-sys 0.52.0", 721 | ] 722 | 723 | [[package]] 724 | name = "native-tls" 725 | version = "0.2.12" 726 | source = "registry+https://github.com/rust-lang/crates.io-index" 727 | checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" 728 | dependencies = [ 729 | "libc", 730 | "log", 731 | "openssl", 732 | "openssl-probe", 733 | "openssl-sys", 734 | "schannel", 735 | "security-framework", 736 | "security-framework-sys", 737 | "tempfile", 738 | ] 739 | 740 | [[package]] 741 | name = "ntapi" 742 | version = "0.4.1" 743 | source = "registry+https://github.com/rust-lang/crates.io-index" 744 | checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" 745 | dependencies = [ 746 | "winapi", 747 | ] 748 | 749 | [[package]] 750 | name = "nu-ansi-term" 751 | version = "0.46.0" 752 | source = "registry+https://github.com/rust-lang/crates.io-index" 753 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 754 | dependencies = [ 755 | "overload", 756 | "winapi", 757 | ] 758 | 759 | [[package]] 760 | name = "num-conv" 761 | version = "0.1.0" 762 | source = "registry+https://github.com/rust-lang/crates.io-index" 763 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 764 | 765 | [[package]] 766 | name = "num_threads" 767 | version = "0.1.7" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" 770 | dependencies = [ 771 | "libc", 772 | ] 773 | 774 | [[package]] 775 | name = "object" 776 | version = "0.36.2" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" 779 | dependencies = [ 780 | "memchr", 781 | ] 782 | 783 | [[package]] 784 | name = "once_cell" 785 | version = "1.19.0" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 788 | 789 | [[package]] 790 | name = "openssl" 791 | version = "0.10.66" 792 | source = "registry+https://github.com/rust-lang/crates.io-index" 793 | checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" 794 | dependencies = [ 795 | "bitflags 2.6.0", 796 | "cfg-if", 797 | "foreign-types", 798 | "libc", 799 | "once_cell", 800 | "openssl-macros", 801 | "openssl-sys", 802 | ] 803 | 804 | [[package]] 805 | name = "openssl-macros" 806 | version = "0.1.1" 807 | source = "registry+https://github.com/rust-lang/crates.io-index" 808 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 809 | dependencies = [ 810 | "proc-macro2", 811 | "quote", 812 | "syn", 813 | ] 814 | 815 | [[package]] 816 | name = "openssl-probe" 817 | version = "0.1.5" 818 | source = "registry+https://github.com/rust-lang/crates.io-index" 819 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 820 | 821 | [[package]] 822 | name = "openssl-sys" 823 | version = "0.9.103" 824 | source = "registry+https://github.com/rust-lang/crates.io-index" 825 | checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" 826 | dependencies = [ 827 | "cc", 828 | "libc", 829 | "pkg-config", 830 | "vcpkg", 831 | ] 832 | 833 | [[package]] 834 | name = "overload" 835 | version = "0.1.1" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 838 | 839 | [[package]] 840 | name = "parking_lot" 841 | version = "0.12.3" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 844 | dependencies = [ 845 | "lock_api", 846 | "parking_lot_core", 847 | ] 848 | 849 | [[package]] 850 | name = "parking_lot_core" 851 | version = "0.9.10" 852 | source = "registry+https://github.com/rust-lang/crates.io-index" 853 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 854 | dependencies = [ 855 | "cfg-if", 856 | "libc", 857 | "redox_syscall", 858 | "smallvec", 859 | "windows-targets 0.52.6", 860 | ] 861 | 862 | [[package]] 863 | name = "password-hash" 864 | version = "0.4.2" 865 | source = "registry+https://github.com/rust-lang/crates.io-index" 866 | checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" 867 | dependencies = [ 868 | "base64ct", 869 | "rand_core", 870 | "subtle", 871 | ] 872 | 873 | [[package]] 874 | name = "path-clean" 875 | version = "1.0.1" 876 | source = "registry+https://github.com/rust-lang/crates.io-index" 877 | checksum = "17359afc20d7ab31fdb42bb844c8b3bb1dabd7dcf7e68428492da7f16966fcef" 878 | 879 | [[package]] 880 | name = "pbkdf2" 881 | version = "0.11.0" 882 | source = "registry+https://github.com/rust-lang/crates.io-index" 883 | checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" 884 | dependencies = [ 885 | "digest", 886 | "hmac", 887 | "password-hash", 888 | "sha2", 889 | ] 890 | 891 | [[package]] 892 | name = "percent-encoding" 893 | version = "2.3.1" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 896 | 897 | [[package]] 898 | name = "pin-project" 899 | version = "1.1.5" 900 | source = "registry+https://github.com/rust-lang/crates.io-index" 901 | checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" 902 | dependencies = [ 903 | "pin-project-internal", 904 | ] 905 | 906 | [[package]] 907 | name = "pin-project-internal" 908 | version = "1.1.5" 909 | source = "registry+https://github.com/rust-lang/crates.io-index" 910 | checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" 911 | dependencies = [ 912 | "proc-macro2", 913 | "quote", 914 | "syn", 915 | ] 916 | 917 | [[package]] 918 | name = "pin-project-lite" 919 | version = "0.2.14" 920 | source = "registry+https://github.com/rust-lang/crates.io-index" 921 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 922 | 923 | [[package]] 924 | name = "pin-utils" 925 | version = "0.1.0" 926 | source = "registry+https://github.com/rust-lang/crates.io-index" 927 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 928 | 929 | [[package]] 930 | name = "pkg-config" 931 | version = "0.3.30" 932 | source = "registry+https://github.com/rust-lang/crates.io-index" 933 | checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" 934 | 935 | [[package]] 936 | name = "plain" 937 | version = "0.2.3" 938 | source = "registry+https://github.com/rust-lang/crates.io-index" 939 | checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" 940 | 941 | [[package]] 942 | name = "powerfmt" 943 | version = "0.2.0" 944 | source = "registry+https://github.com/rust-lang/crates.io-index" 945 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 946 | 947 | [[package]] 948 | name = "proc-macro2" 949 | version = "1.0.86" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" 952 | dependencies = [ 953 | "unicode-ident", 954 | ] 955 | 956 | [[package]] 957 | name = "quote" 958 | version = "1.0.36" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 961 | dependencies = [ 962 | "proc-macro2", 963 | ] 964 | 965 | [[package]] 966 | name = "rand_core" 967 | version = "0.6.4" 968 | source = "registry+https://github.com/rust-lang/crates.io-index" 969 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 970 | 971 | [[package]] 972 | name = "rayon" 973 | version = "1.10.0" 974 | source = "registry+https://github.com/rust-lang/crates.io-index" 975 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 976 | dependencies = [ 977 | "either", 978 | "rayon-core", 979 | ] 980 | 981 | [[package]] 982 | name = "rayon-core" 983 | version = "1.12.1" 984 | source = "registry+https://github.com/rust-lang/crates.io-index" 985 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 986 | dependencies = [ 987 | "crossbeam-deque", 988 | "crossbeam-utils", 989 | ] 990 | 991 | [[package]] 992 | name = "redox_syscall" 993 | version = "0.5.3" 994 | source = "registry+https://github.com/rust-lang/crates.io-index" 995 | checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" 996 | dependencies = [ 997 | "bitflags 2.6.0", 998 | ] 999 | 1000 | [[package]] 1001 | name = "regex" 1002 | version = "1.10.5" 1003 | source = "registry+https://github.com/rust-lang/crates.io-index" 1004 | checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" 1005 | dependencies = [ 1006 | "aho-corasick", 1007 | "memchr", 1008 | "regex-automata 0.4.7", 1009 | "regex-syntax 0.8.4", 1010 | ] 1011 | 1012 | [[package]] 1013 | name = "regex-automata" 1014 | version = "0.1.10" 1015 | source = "registry+https://github.com/rust-lang/crates.io-index" 1016 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 1017 | dependencies = [ 1018 | "regex-syntax 0.6.29", 1019 | ] 1020 | 1021 | [[package]] 1022 | name = "regex-automata" 1023 | version = "0.4.7" 1024 | source = "registry+https://github.com/rust-lang/crates.io-index" 1025 | checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" 1026 | dependencies = [ 1027 | "aho-corasick", 1028 | "memchr", 1029 | "regex-syntax 0.8.4", 1030 | ] 1031 | 1032 | [[package]] 1033 | name = "regex-syntax" 1034 | version = "0.6.29" 1035 | source = "registry+https://github.com/rust-lang/crates.io-index" 1036 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 1037 | 1038 | [[package]] 1039 | name = "regex-syntax" 1040 | version = "0.8.4" 1041 | source = "registry+https://github.com/rust-lang/crates.io-index" 1042 | checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" 1043 | 1044 | [[package]] 1045 | name = "reqwest" 1046 | version = "0.12.5" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" 1049 | dependencies = [ 1050 | "base64", 1051 | "bytes", 1052 | "encoding_rs", 1053 | "futures-core", 1054 | "futures-util", 1055 | "h2", 1056 | "http", 1057 | "http-body", 1058 | "http-body-util", 1059 | "hyper", 1060 | "hyper-rustls", 1061 | "hyper-tls", 1062 | "hyper-util", 1063 | "ipnet", 1064 | "js-sys", 1065 | "log", 1066 | "mime", 1067 | "native-tls", 1068 | "once_cell", 1069 | "percent-encoding", 1070 | "pin-project-lite", 1071 | "rustls-pemfile", 1072 | "serde", 1073 | "serde_json", 1074 | "serde_urlencoded", 1075 | "sync_wrapper", 1076 | "system-configuration", 1077 | "tokio", 1078 | "tokio-native-tls", 1079 | "tower-service", 1080 | "url", 1081 | "wasm-bindgen", 1082 | "wasm-bindgen-futures", 1083 | "web-sys", 1084 | "winreg 0.52.0", 1085 | ] 1086 | 1087 | [[package]] 1088 | name = "ring" 1089 | version = "0.17.8" 1090 | source = "registry+https://github.com/rust-lang/crates.io-index" 1091 | checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 1092 | dependencies = [ 1093 | "cc", 1094 | "cfg-if", 1095 | "getrandom", 1096 | "libc", 1097 | "spin", 1098 | "untrusted", 1099 | "windows-sys 0.52.0", 1100 | ] 1101 | 1102 | [[package]] 1103 | name = "rustc-demangle" 1104 | version = "0.1.24" 1105 | source = "registry+https://github.com/rust-lang/crates.io-index" 1106 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1107 | 1108 | [[package]] 1109 | name = "rustix" 1110 | version = "0.38.34" 1111 | source = "registry+https://github.com/rust-lang/crates.io-index" 1112 | checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" 1113 | dependencies = [ 1114 | "bitflags 2.6.0", 1115 | "errno", 1116 | "libc", 1117 | "linux-raw-sys", 1118 | "windows-sys 0.52.0", 1119 | ] 1120 | 1121 | [[package]] 1122 | name = "rustls" 1123 | version = "0.23.12" 1124 | source = "registry+https://github.com/rust-lang/crates.io-index" 1125 | checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" 1126 | dependencies = [ 1127 | "once_cell", 1128 | "rustls-pki-types", 1129 | "rustls-webpki", 1130 | "subtle", 1131 | "zeroize", 1132 | ] 1133 | 1134 | [[package]] 1135 | name = "rustls-pemfile" 1136 | version = "2.1.2" 1137 | source = "registry+https://github.com/rust-lang/crates.io-index" 1138 | checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" 1139 | dependencies = [ 1140 | "base64", 1141 | "rustls-pki-types", 1142 | ] 1143 | 1144 | [[package]] 1145 | name = "rustls-pki-types" 1146 | version = "1.7.0" 1147 | source = "registry+https://github.com/rust-lang/crates.io-index" 1148 | checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" 1149 | 1150 | [[package]] 1151 | name = "rustls-webpki" 1152 | version = "0.102.6" 1153 | source = "registry+https://github.com/rust-lang/crates.io-index" 1154 | checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" 1155 | dependencies = [ 1156 | "ring", 1157 | "rustls-pki-types", 1158 | "untrusted", 1159 | ] 1160 | 1161 | [[package]] 1162 | name = "ryu" 1163 | version = "1.0.18" 1164 | source = "registry+https://github.com/rust-lang/crates.io-index" 1165 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 1166 | 1167 | [[package]] 1168 | name = "schannel" 1169 | version = "0.1.23" 1170 | source = "registry+https://github.com/rust-lang/crates.io-index" 1171 | checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" 1172 | dependencies = [ 1173 | "windows-sys 0.52.0", 1174 | ] 1175 | 1176 | [[package]] 1177 | name = "scopeguard" 1178 | version = "1.2.0" 1179 | source = "registry+https://github.com/rust-lang/crates.io-index" 1180 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1181 | 1182 | [[package]] 1183 | name = "scroll" 1184 | version = "0.12.0" 1185 | source = "registry+https://github.com/rust-lang/crates.io-index" 1186 | checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" 1187 | dependencies = [ 1188 | "scroll_derive", 1189 | ] 1190 | 1191 | [[package]] 1192 | name = "scroll_derive" 1193 | version = "0.12.0" 1194 | source = "registry+https://github.com/rust-lang/crates.io-index" 1195 | checksum = "7f81c2fde025af7e69b1d1420531c8a8811ca898919db177141a85313b1cb932" 1196 | dependencies = [ 1197 | "proc-macro2", 1198 | "quote", 1199 | "syn", 1200 | ] 1201 | 1202 | [[package]] 1203 | name = "security-framework" 1204 | version = "2.11.1" 1205 | source = "registry+https://github.com/rust-lang/crates.io-index" 1206 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1207 | dependencies = [ 1208 | "bitflags 2.6.0", 1209 | "core-foundation", 1210 | "core-foundation-sys", 1211 | "libc", 1212 | "security-framework-sys", 1213 | ] 1214 | 1215 | [[package]] 1216 | name = "security-framework-sys" 1217 | version = "2.11.1" 1218 | source = "registry+https://github.com/rust-lang/crates.io-index" 1219 | checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" 1220 | dependencies = [ 1221 | "core-foundation-sys", 1222 | "libc", 1223 | ] 1224 | 1225 | [[package]] 1226 | name = "serde" 1227 | version = "1.0.204" 1228 | source = "registry+https://github.com/rust-lang/crates.io-index" 1229 | checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" 1230 | dependencies = [ 1231 | "serde_derive", 1232 | ] 1233 | 1234 | [[package]] 1235 | name = "serde_derive" 1236 | version = "1.0.204" 1237 | source = "registry+https://github.com/rust-lang/crates.io-index" 1238 | checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" 1239 | dependencies = [ 1240 | "proc-macro2", 1241 | "quote", 1242 | "syn", 1243 | ] 1244 | 1245 | [[package]] 1246 | name = "serde_json" 1247 | version = "1.0.120" 1248 | source = "registry+https://github.com/rust-lang/crates.io-index" 1249 | checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" 1250 | dependencies = [ 1251 | "itoa", 1252 | "ryu", 1253 | "serde", 1254 | ] 1255 | 1256 | [[package]] 1257 | name = "serde_urlencoded" 1258 | version = "0.7.1" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1261 | dependencies = [ 1262 | "form_urlencoded", 1263 | "itoa", 1264 | "ryu", 1265 | "serde", 1266 | ] 1267 | 1268 | [[package]] 1269 | name = "sha1" 1270 | version = "0.10.6" 1271 | source = "registry+https://github.com/rust-lang/crates.io-index" 1272 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1273 | dependencies = [ 1274 | "cfg-if", 1275 | "cpufeatures", 1276 | "digest", 1277 | ] 1278 | 1279 | [[package]] 1280 | name = "sha2" 1281 | version = "0.10.8" 1282 | source = "registry+https://github.com/rust-lang/crates.io-index" 1283 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1284 | dependencies = [ 1285 | "cfg-if", 1286 | "cpufeatures", 1287 | "digest", 1288 | ] 1289 | 1290 | [[package]] 1291 | name = "sharded-slab" 1292 | version = "0.1.7" 1293 | source = "registry+https://github.com/rust-lang/crates.io-index" 1294 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1295 | dependencies = [ 1296 | "lazy_static", 1297 | ] 1298 | 1299 | [[package]] 1300 | name = "signal-hook-registry" 1301 | version = "1.4.2" 1302 | source = "registry+https://github.com/rust-lang/crates.io-index" 1303 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 1304 | dependencies = [ 1305 | "libc", 1306 | ] 1307 | 1308 | [[package]] 1309 | name = "slab" 1310 | version = "0.4.9" 1311 | source = "registry+https://github.com/rust-lang/crates.io-index" 1312 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1313 | dependencies = [ 1314 | "autocfg", 1315 | ] 1316 | 1317 | [[package]] 1318 | name = "smallvec" 1319 | version = "1.13.2" 1320 | source = "registry+https://github.com/rust-lang/crates.io-index" 1321 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1322 | 1323 | [[package]] 1324 | name = "socket2" 1325 | version = "0.5.7" 1326 | source = "registry+https://github.com/rust-lang/crates.io-index" 1327 | checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" 1328 | dependencies = [ 1329 | "libc", 1330 | "windows-sys 0.52.0", 1331 | ] 1332 | 1333 | [[package]] 1334 | name = "spin" 1335 | version = "0.9.8" 1336 | source = "registry+https://github.com/rust-lang/crates.io-index" 1337 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1338 | 1339 | [[package]] 1340 | name = "subtle" 1341 | version = "2.6.1" 1342 | source = "registry+https://github.com/rust-lang/crates.io-index" 1343 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1344 | 1345 | [[package]] 1346 | name = "syn" 1347 | version = "2.0.72" 1348 | source = "registry+https://github.com/rust-lang/crates.io-index" 1349 | checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" 1350 | dependencies = [ 1351 | "proc-macro2", 1352 | "quote", 1353 | "unicode-ident", 1354 | ] 1355 | 1356 | [[package]] 1357 | name = "sync_wrapper" 1358 | version = "1.0.1" 1359 | source = "registry+https://github.com/rust-lang/crates.io-index" 1360 | checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" 1361 | 1362 | [[package]] 1363 | name = "sysinfo" 1364 | version = "0.30.13" 1365 | source = "registry+https://github.com/rust-lang/crates.io-index" 1366 | checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" 1367 | dependencies = [ 1368 | "cfg-if", 1369 | "core-foundation-sys", 1370 | "libc", 1371 | "ntapi", 1372 | "once_cell", 1373 | "rayon", 1374 | "windows", 1375 | ] 1376 | 1377 | [[package]] 1378 | name = "system-configuration" 1379 | version = "0.5.1" 1380 | source = "registry+https://github.com/rust-lang/crates.io-index" 1381 | checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" 1382 | dependencies = [ 1383 | "bitflags 1.3.2", 1384 | "core-foundation", 1385 | "system-configuration-sys", 1386 | ] 1387 | 1388 | [[package]] 1389 | name = "system-configuration-sys" 1390 | version = "0.5.0" 1391 | source = "registry+https://github.com/rust-lang/crates.io-index" 1392 | checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" 1393 | dependencies = [ 1394 | "core-foundation-sys", 1395 | "libc", 1396 | ] 1397 | 1398 | [[package]] 1399 | name = "tempfile" 1400 | version = "3.10.1" 1401 | source = "registry+https://github.com/rust-lang/crates.io-index" 1402 | checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" 1403 | dependencies = [ 1404 | "cfg-if", 1405 | "fastrand", 1406 | "rustix", 1407 | "windows-sys 0.52.0", 1408 | ] 1409 | 1410 | [[package]] 1411 | name = "thread_local" 1412 | version = "1.1.8" 1413 | source = "registry+https://github.com/rust-lang/crates.io-index" 1414 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 1415 | dependencies = [ 1416 | "cfg-if", 1417 | "once_cell", 1418 | ] 1419 | 1420 | [[package]] 1421 | name = "time" 1422 | version = "0.3.36" 1423 | source = "registry+https://github.com/rust-lang/crates.io-index" 1424 | checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" 1425 | dependencies = [ 1426 | "deranged", 1427 | "itoa", 1428 | "libc", 1429 | "num-conv", 1430 | "num_threads", 1431 | "powerfmt", 1432 | "serde", 1433 | "time-core", 1434 | "time-macros", 1435 | ] 1436 | 1437 | [[package]] 1438 | name = "time-core" 1439 | version = "0.1.2" 1440 | source = "registry+https://github.com/rust-lang/crates.io-index" 1441 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 1442 | 1443 | [[package]] 1444 | name = "time-macros" 1445 | version = "0.2.18" 1446 | source = "registry+https://github.com/rust-lang/crates.io-index" 1447 | checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" 1448 | dependencies = [ 1449 | "num-conv", 1450 | "time-core", 1451 | ] 1452 | 1453 | [[package]] 1454 | name = "tinyvec" 1455 | version = "1.8.0" 1456 | source = "registry+https://github.com/rust-lang/crates.io-index" 1457 | checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" 1458 | dependencies = [ 1459 | "tinyvec_macros", 1460 | ] 1461 | 1462 | [[package]] 1463 | name = "tinyvec_macros" 1464 | version = "0.1.1" 1465 | source = "registry+https://github.com/rust-lang/crates.io-index" 1466 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1467 | 1468 | [[package]] 1469 | name = "tokio" 1470 | version = "1.39.2" 1471 | source = "registry+https://github.com/rust-lang/crates.io-index" 1472 | checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" 1473 | dependencies = [ 1474 | "backtrace", 1475 | "bytes", 1476 | "libc", 1477 | "mio", 1478 | "parking_lot", 1479 | "pin-project-lite", 1480 | "signal-hook-registry", 1481 | "socket2", 1482 | "tokio-macros", 1483 | "windows-sys 0.52.0", 1484 | ] 1485 | 1486 | [[package]] 1487 | name = "tokio-macros" 1488 | version = "2.4.0" 1489 | source = "registry+https://github.com/rust-lang/crates.io-index" 1490 | checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" 1491 | dependencies = [ 1492 | "proc-macro2", 1493 | "quote", 1494 | "syn", 1495 | ] 1496 | 1497 | [[package]] 1498 | name = "tokio-native-tls" 1499 | version = "0.3.1" 1500 | source = "registry+https://github.com/rust-lang/crates.io-index" 1501 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 1502 | dependencies = [ 1503 | "native-tls", 1504 | "tokio", 1505 | ] 1506 | 1507 | [[package]] 1508 | name = "tokio-rustls" 1509 | version = "0.26.0" 1510 | source = "registry+https://github.com/rust-lang/crates.io-index" 1511 | checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" 1512 | dependencies = [ 1513 | "rustls", 1514 | "rustls-pki-types", 1515 | "tokio", 1516 | ] 1517 | 1518 | [[package]] 1519 | name = "tokio-util" 1520 | version = "0.7.11" 1521 | source = "registry+https://github.com/rust-lang/crates.io-index" 1522 | checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" 1523 | dependencies = [ 1524 | "bytes", 1525 | "futures-core", 1526 | "futures-sink", 1527 | "pin-project-lite", 1528 | "tokio", 1529 | ] 1530 | 1531 | [[package]] 1532 | name = "toml" 1533 | version = "0.5.11" 1534 | source = "registry+https://github.com/rust-lang/crates.io-index" 1535 | checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" 1536 | dependencies = [ 1537 | "serde", 1538 | ] 1539 | 1540 | [[package]] 1541 | name = "tower" 1542 | version = "0.4.13" 1543 | source = "registry+https://github.com/rust-lang/crates.io-index" 1544 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 1545 | dependencies = [ 1546 | "futures-core", 1547 | "futures-util", 1548 | "pin-project", 1549 | "pin-project-lite", 1550 | "tokio", 1551 | "tower-layer", 1552 | "tower-service", 1553 | ] 1554 | 1555 | [[package]] 1556 | name = "tower-layer" 1557 | version = "0.3.2" 1558 | source = "registry+https://github.com/rust-lang/crates.io-index" 1559 | checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" 1560 | 1561 | [[package]] 1562 | name = "tower-service" 1563 | version = "0.3.2" 1564 | source = "registry+https://github.com/rust-lang/crates.io-index" 1565 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 1566 | 1567 | [[package]] 1568 | name = "tracing" 1569 | version = "0.1.40" 1570 | source = "registry+https://github.com/rust-lang/crates.io-index" 1571 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 1572 | dependencies = [ 1573 | "pin-project-lite", 1574 | "tracing-attributes", 1575 | "tracing-core", 1576 | ] 1577 | 1578 | [[package]] 1579 | name = "tracing-attributes" 1580 | version = "0.1.27" 1581 | source = "registry+https://github.com/rust-lang/crates.io-index" 1582 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 1583 | dependencies = [ 1584 | "proc-macro2", 1585 | "quote", 1586 | "syn", 1587 | ] 1588 | 1589 | [[package]] 1590 | name = "tracing-core" 1591 | version = "0.1.32" 1592 | source = "registry+https://github.com/rust-lang/crates.io-index" 1593 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 1594 | dependencies = [ 1595 | "once_cell", 1596 | "valuable", 1597 | ] 1598 | 1599 | [[package]] 1600 | name = "tracing-log" 1601 | version = "0.2.0" 1602 | source = "registry+https://github.com/rust-lang/crates.io-index" 1603 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 1604 | dependencies = [ 1605 | "log", 1606 | "once_cell", 1607 | "tracing-core", 1608 | ] 1609 | 1610 | [[package]] 1611 | name = "tracing-subscriber" 1612 | version = "0.3.18" 1613 | source = "registry+https://github.com/rust-lang/crates.io-index" 1614 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 1615 | dependencies = [ 1616 | "matchers", 1617 | "nu-ansi-term", 1618 | "once_cell", 1619 | "regex", 1620 | "sharded-slab", 1621 | "smallvec", 1622 | "thread_local", 1623 | "time", 1624 | "tracing", 1625 | "tracing-core", 1626 | "tracing-log", 1627 | ] 1628 | 1629 | [[package]] 1630 | name = "try-lock" 1631 | version = "0.2.5" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 1634 | 1635 | [[package]] 1636 | name = "typenum" 1637 | version = "1.17.0" 1638 | source = "registry+https://github.com/rust-lang/crates.io-index" 1639 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 1640 | 1641 | [[package]] 1642 | name = "unicode-bidi" 1643 | version = "0.3.15" 1644 | source = "registry+https://github.com/rust-lang/crates.io-index" 1645 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 1646 | 1647 | [[package]] 1648 | name = "unicode-ident" 1649 | version = "1.0.12" 1650 | source = "registry+https://github.com/rust-lang/crates.io-index" 1651 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 1652 | 1653 | [[package]] 1654 | name = "unicode-normalization" 1655 | version = "0.1.23" 1656 | source = "registry+https://github.com/rust-lang/crates.io-index" 1657 | checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" 1658 | dependencies = [ 1659 | "tinyvec", 1660 | ] 1661 | 1662 | [[package]] 1663 | name = "untrusted" 1664 | version = "0.9.0" 1665 | source = "registry+https://github.com/rust-lang/crates.io-index" 1666 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 1667 | 1668 | [[package]] 1669 | name = "url" 1670 | version = "2.5.2" 1671 | source = "registry+https://github.com/rust-lang/crates.io-index" 1672 | checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" 1673 | dependencies = [ 1674 | "form_urlencoded", 1675 | "idna", 1676 | "percent-encoding", 1677 | ] 1678 | 1679 | [[package]] 1680 | name = "valuable" 1681 | version = "0.1.0" 1682 | source = "registry+https://github.com/rust-lang/crates.io-index" 1683 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 1684 | 1685 | [[package]] 1686 | name = "vcpkg" 1687 | version = "0.2.15" 1688 | source = "registry+https://github.com/rust-lang/crates.io-index" 1689 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1690 | 1691 | [[package]] 1692 | name = "version_check" 1693 | version = "0.9.5" 1694 | source = "registry+https://github.com/rust-lang/crates.io-index" 1695 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 1696 | 1697 | [[package]] 1698 | name = "want" 1699 | version = "0.3.1" 1700 | source = "registry+https://github.com/rust-lang/crates.io-index" 1701 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 1702 | dependencies = [ 1703 | "try-lock", 1704 | ] 1705 | 1706 | [[package]] 1707 | name = "wasi" 1708 | version = "0.11.0+wasi-snapshot-preview1" 1709 | source = "registry+https://github.com/rust-lang/crates.io-index" 1710 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1711 | 1712 | [[package]] 1713 | name = "wasm-bindgen" 1714 | version = "0.2.92" 1715 | source = "registry+https://github.com/rust-lang/crates.io-index" 1716 | checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" 1717 | dependencies = [ 1718 | "cfg-if", 1719 | "wasm-bindgen-macro", 1720 | ] 1721 | 1722 | [[package]] 1723 | name = "wasm-bindgen-backend" 1724 | version = "0.2.92" 1725 | source = "registry+https://github.com/rust-lang/crates.io-index" 1726 | checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" 1727 | dependencies = [ 1728 | "bumpalo", 1729 | "log", 1730 | "once_cell", 1731 | "proc-macro2", 1732 | "quote", 1733 | "syn", 1734 | "wasm-bindgen-shared", 1735 | ] 1736 | 1737 | [[package]] 1738 | name = "wasm-bindgen-futures" 1739 | version = "0.4.42" 1740 | source = "registry+https://github.com/rust-lang/crates.io-index" 1741 | checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" 1742 | dependencies = [ 1743 | "cfg-if", 1744 | "js-sys", 1745 | "wasm-bindgen", 1746 | "web-sys", 1747 | ] 1748 | 1749 | [[package]] 1750 | name = "wasm-bindgen-macro" 1751 | version = "0.2.92" 1752 | source = "registry+https://github.com/rust-lang/crates.io-index" 1753 | checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" 1754 | dependencies = [ 1755 | "quote", 1756 | "wasm-bindgen-macro-support", 1757 | ] 1758 | 1759 | [[package]] 1760 | name = "wasm-bindgen-macro-support" 1761 | version = "0.2.92" 1762 | source = "registry+https://github.com/rust-lang/crates.io-index" 1763 | checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" 1764 | dependencies = [ 1765 | "proc-macro2", 1766 | "quote", 1767 | "syn", 1768 | "wasm-bindgen-backend", 1769 | "wasm-bindgen-shared", 1770 | ] 1771 | 1772 | [[package]] 1773 | name = "wasm-bindgen-shared" 1774 | version = "0.2.92" 1775 | source = "registry+https://github.com/rust-lang/crates.io-index" 1776 | checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" 1777 | 1778 | [[package]] 1779 | name = "web-sys" 1780 | version = "0.3.69" 1781 | source = "registry+https://github.com/rust-lang/crates.io-index" 1782 | checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" 1783 | dependencies = [ 1784 | "js-sys", 1785 | "wasm-bindgen", 1786 | ] 1787 | 1788 | [[package]] 1789 | name = "winapi" 1790 | version = "0.3.9" 1791 | source = "registry+https://github.com/rust-lang/crates.io-index" 1792 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1793 | dependencies = [ 1794 | "winapi-i686-pc-windows-gnu", 1795 | "winapi-x86_64-pc-windows-gnu", 1796 | ] 1797 | 1798 | [[package]] 1799 | name = "winapi-i686-pc-windows-gnu" 1800 | version = "0.4.0" 1801 | source = "registry+https://github.com/rust-lang/crates.io-index" 1802 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1803 | 1804 | [[package]] 1805 | name = "winapi-x86_64-pc-windows-gnu" 1806 | version = "0.4.0" 1807 | source = "registry+https://github.com/rust-lang/crates.io-index" 1808 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1809 | 1810 | [[package]] 1811 | name = "windows" 1812 | version = "0.52.0" 1813 | source = "registry+https://github.com/rust-lang/crates.io-index" 1814 | checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" 1815 | dependencies = [ 1816 | "windows-core", 1817 | "windows-targets 0.52.6", 1818 | ] 1819 | 1820 | [[package]] 1821 | name = "windows-core" 1822 | version = "0.52.0" 1823 | source = "registry+https://github.com/rust-lang/crates.io-index" 1824 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 1825 | dependencies = [ 1826 | "windows-targets 0.52.6", 1827 | ] 1828 | 1829 | [[package]] 1830 | name = "windows-sys" 1831 | version = "0.48.0" 1832 | source = "registry+https://github.com/rust-lang/crates.io-index" 1833 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 1834 | dependencies = [ 1835 | "windows-targets 0.48.5", 1836 | ] 1837 | 1838 | [[package]] 1839 | name = "windows-sys" 1840 | version = "0.52.0" 1841 | source = "registry+https://github.com/rust-lang/crates.io-index" 1842 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1843 | dependencies = [ 1844 | "windows-targets 0.52.6", 1845 | ] 1846 | 1847 | [[package]] 1848 | name = "windows-targets" 1849 | version = "0.48.5" 1850 | source = "registry+https://github.com/rust-lang/crates.io-index" 1851 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 1852 | dependencies = [ 1853 | "windows_aarch64_gnullvm 0.48.5", 1854 | "windows_aarch64_msvc 0.48.5", 1855 | "windows_i686_gnu 0.48.5", 1856 | "windows_i686_msvc 0.48.5", 1857 | "windows_x86_64_gnu 0.48.5", 1858 | "windows_x86_64_gnullvm 0.48.5", 1859 | "windows_x86_64_msvc 0.48.5", 1860 | ] 1861 | 1862 | [[package]] 1863 | name = "windows-targets" 1864 | version = "0.52.6" 1865 | source = "registry+https://github.com/rust-lang/crates.io-index" 1866 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1867 | dependencies = [ 1868 | "windows_aarch64_gnullvm 0.52.6", 1869 | "windows_aarch64_msvc 0.52.6", 1870 | "windows_i686_gnu 0.52.6", 1871 | "windows_i686_gnullvm", 1872 | "windows_i686_msvc 0.52.6", 1873 | "windows_x86_64_gnu 0.52.6", 1874 | "windows_x86_64_gnullvm 0.52.6", 1875 | "windows_x86_64_msvc 0.52.6", 1876 | ] 1877 | 1878 | [[package]] 1879 | name = "windows_aarch64_gnullvm" 1880 | version = "0.48.5" 1881 | source = "registry+https://github.com/rust-lang/crates.io-index" 1882 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 1883 | 1884 | [[package]] 1885 | name = "windows_aarch64_gnullvm" 1886 | version = "0.52.6" 1887 | source = "registry+https://github.com/rust-lang/crates.io-index" 1888 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1889 | 1890 | [[package]] 1891 | name = "windows_aarch64_msvc" 1892 | version = "0.48.5" 1893 | source = "registry+https://github.com/rust-lang/crates.io-index" 1894 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 1895 | 1896 | [[package]] 1897 | name = "windows_aarch64_msvc" 1898 | version = "0.52.6" 1899 | source = "registry+https://github.com/rust-lang/crates.io-index" 1900 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1901 | 1902 | [[package]] 1903 | name = "windows_i686_gnu" 1904 | version = "0.48.5" 1905 | source = "registry+https://github.com/rust-lang/crates.io-index" 1906 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 1907 | 1908 | [[package]] 1909 | name = "windows_i686_gnu" 1910 | version = "0.52.6" 1911 | source = "registry+https://github.com/rust-lang/crates.io-index" 1912 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1913 | 1914 | [[package]] 1915 | name = "windows_i686_gnullvm" 1916 | version = "0.52.6" 1917 | source = "registry+https://github.com/rust-lang/crates.io-index" 1918 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1919 | 1920 | [[package]] 1921 | name = "windows_i686_msvc" 1922 | version = "0.48.5" 1923 | source = "registry+https://github.com/rust-lang/crates.io-index" 1924 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 1925 | 1926 | [[package]] 1927 | name = "windows_i686_msvc" 1928 | version = "0.52.6" 1929 | source = "registry+https://github.com/rust-lang/crates.io-index" 1930 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1931 | 1932 | [[package]] 1933 | name = "windows_x86_64_gnu" 1934 | version = "0.48.5" 1935 | source = "registry+https://github.com/rust-lang/crates.io-index" 1936 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 1937 | 1938 | [[package]] 1939 | name = "windows_x86_64_gnu" 1940 | version = "0.52.6" 1941 | source = "registry+https://github.com/rust-lang/crates.io-index" 1942 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1943 | 1944 | [[package]] 1945 | name = "windows_x86_64_gnullvm" 1946 | version = "0.48.5" 1947 | source = "registry+https://github.com/rust-lang/crates.io-index" 1948 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 1949 | 1950 | [[package]] 1951 | name = "windows_x86_64_gnullvm" 1952 | version = "0.52.6" 1953 | source = "registry+https://github.com/rust-lang/crates.io-index" 1954 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1955 | 1956 | [[package]] 1957 | name = "windows_x86_64_msvc" 1958 | version = "0.48.5" 1959 | source = "registry+https://github.com/rust-lang/crates.io-index" 1960 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 1961 | 1962 | [[package]] 1963 | name = "windows_x86_64_msvc" 1964 | version = "0.52.6" 1965 | source = "registry+https://github.com/rust-lang/crates.io-index" 1966 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1967 | 1968 | [[package]] 1969 | name = "winreg" 1970 | version = "0.50.0" 1971 | source = "registry+https://github.com/rust-lang/crates.io-index" 1972 | checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 1973 | dependencies = [ 1974 | "cfg-if", 1975 | "windows-sys 0.48.0", 1976 | ] 1977 | 1978 | [[package]] 1979 | name = "winreg" 1980 | version = "0.52.0" 1981 | source = "registry+https://github.com/rust-lang/crates.io-index" 1982 | checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" 1983 | dependencies = [ 1984 | "cfg-if", 1985 | "windows-sys 0.48.0", 1986 | ] 1987 | 1988 | [[package]] 1989 | name = "winres" 1990 | version = "0.1.12" 1991 | source = "registry+https://github.com/rust-lang/crates.io-index" 1992 | checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c" 1993 | dependencies = [ 1994 | "toml", 1995 | ] 1996 | 1997 | [[package]] 1998 | name = "zeroize" 1999 | version = "1.8.1" 2000 | source = "registry+https://github.com/rust-lang/crates.io-index" 2001 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 2002 | 2003 | [[package]] 2004 | name = "zip" 2005 | version = "0.6.6" 2006 | source = "registry+https://github.com/rust-lang/crates.io-index" 2007 | checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" 2008 | dependencies = [ 2009 | "aes", 2010 | "byteorder", 2011 | "bzip2", 2012 | "constant_time_eq", 2013 | "crc32fast", 2014 | "crossbeam-utils", 2015 | "flate2", 2016 | "hmac", 2017 | "pbkdf2", 2018 | "sha1", 2019 | "time", 2020 | "zstd", 2021 | ] 2022 | 2023 | [[package]] 2024 | name = "zstd" 2025 | version = "0.11.2+zstd.1.5.2" 2026 | source = "registry+https://github.com/rust-lang/crates.io-index" 2027 | checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" 2028 | dependencies = [ 2029 | "zstd-safe", 2030 | ] 2031 | 2032 | [[package]] 2033 | name = "zstd-safe" 2034 | version = "5.0.2+zstd.1.5.2" 2035 | source = "registry+https://github.com/rust-lang/crates.io-index" 2036 | checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" 2037 | dependencies = [ 2038 | "libc", 2039 | "zstd-sys", 2040 | ] 2041 | 2042 | [[package]] 2043 | name = "zstd-sys" 2044 | version = "2.0.12+zstd.1.5.6" 2045 | source = "registry+https://github.com/rust-lang/crates.io-index" 2046 | checksum = "0a4e40c320c3cb459d9a9ff6de98cff88f4751ee9275d140e2be94a2b74e4c13" 2047 | dependencies = [ 2048 | "cc", 2049 | "pkg-config", 2050 | ] 2051 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "llob_install" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | goblin = "0.8.0" 10 | log = "0.4.21" 11 | path-clean = "1.0.1" 12 | regex = "1.10.4" 13 | reqwest = "0.12.2" 14 | serde_json = "1.0.115" 15 | sysinfo = "0.30.7" 16 | time = { version = "0.3.36", features = ["formatting", "macros", "local-offset"] } 17 | tokio = { version = "1", features = ["full"] } 18 | tracing = "0.1.40" 19 | tracing-subscriber = { version = "0.3.18", features = ["env-filter", "time", "local-time"] } 20 | winapi = { version = "0.3.9", features = ["processthreadsapi", "securitybaseapi"] } 21 | zip = "0.6.6" 22 | 23 | 24 | [build-dependencies] 25 | winres = "0.1.12" 26 | 27 | 28 | [target.'cfg(windows)'.dependencies] 29 | winreg = "0.50.0" 30 | 31 | [profile.release] 32 | panic = "abort" # Strip expensive panic clean-up logic 33 | codegen-units = 1 # Compile crates one after another so the compiler can optimize better 34 | lto = true # Enables link to optimizations 35 | opt-level = "s" # Optimize for binary size 36 | strip = true # Remove debug symbols 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 super1207 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 因近期账号冻结严重,请暂时停用此安装器 2 | ## 使用llonebot提供的[一键包](https://github.com/LLOneBot/LLOneBot/releases) 3 | 4 | ## Introduction 5 | 6 | 在windows上全自动安装 [LiteLoaderQQNT](https://github.com/LiteLoaderQQNT/LiteLoaderQQNT) 和 [LLOnebOT](https://github.com/LLOneBot/LLOneBot)。 7 | 8 | Fully automatic installation of LLOneboT and LiteLoaderQQNT on Windows. 9 | 10 | 推荐操作时间:3分钟。 11 | 12 | Recommended operation time: 3 minutes. 13 | 14 | ## Usage 15 | 16 | 双击exe是你需要的全部,如果遇到网络问题,就多尝试几次。 17 | 18 | Double clicking the exe is all you need, just try a few more times if you have network problems. 19 | 20 | ## Installation Location 21 | 22 | 你可以通过编写配置文件`llob_install.json`来指定`QQ.exe`的目录,如: 23 | ```json 24 | { 25 | "qq_exe_path":"D:\\NTQQ\\QQ.exe" 26 | } 27 | ``` 28 | 29 | 你也可以将`llob_install.exe`拖入`QQ.exe`所在目录再运行。 30 | 31 | **否则,将自动从Windows注册表中读取`QQ.exe`的安装路径。** 32 | 33 | 优先级:配置文件 > llob_install.exe 目录 > 注册表 34 | 35 | You can specify the directory of `QQ.exe` by writing a configuration file `llob_install.json`, like this: 36 | ```json 37 | { 38 | "qq_exe_path":"D:\\NTQQ\\QQ.exe" 39 | } 40 | ``` 41 | 42 | Alternatively, you can drag `llob_install.exe` into the directory where `QQ.exe` is located and then run it. 43 | 44 | **Otherwise, the installation path of `QQ.exe` will be automatically read from the Windows registry.** 45 | 46 | Priority: Configuration file > llob_install.exe directory > Registry 47 | 48 | ## Thanks 49 | 50 | [LiteLoaderQQNT](https://github.com/LiteLoaderQQNT/LiteLoaderQQNT) 51 | 52 | [LLOnebOT](https://github.com/LLOneBot/LLOneBot) 53 | 54 | [QQNTFileVerifyPatch](https://github.com/LiteLoaderQQNT/QQNTFileVerifyPatch) 55 | 56 | [LiteLoaderQQNT_Install](https://github.com/Mzdyl/LiteLoaderQQNT_Install) 57 | 58 | ## License 59 | 60 | MIT 61 | 62 | ## 其它注意事项 63 | 1. 确保您已经安装最新版本的NTQQ,您应该在[QQ官网](https://im.qq.com/pcqq/index.shtml)下载的最新版本的NTQQ,并且通过双击QQ安装包来安装QQ。 64 | 2. 确保使用install_llob.exe之前,QQ处于关闭状态。 65 | 3. 如果QQ自动更新了,您可以重新运行install_llob.exe来安装llonebot,您的配置信息不会丢失。 66 | 4. 如果您仍然对安装过程有所疑惑,可以看看安装视频:[视频链接](https://files.catbox.moe/psdz7v.mp4) 67 | 68 | ## 如何卸载 69 | 70 | 如果需要完全去除此安装程序带来的影响,你可以按如下步骤操作。 71 | 72 | 1:打开windows控制面板->程序和功能,右键卸载QQ 73 | 74 | 2:手动删除QQ的安装文件夹,默认是:`C:\Program Files\Tencent\QQNT` 75 | 76 | 3(可选):重新安装QQ 77 | 78 | 4(可选):删除[用户文件夹](https://www.baidu.com/s?wd=windows%20%E7%94%A8%E6%88%B7%E6%96%87%E4%BB%B6%E5%A4%B9%E6%98%AF%E4%BB%80%E4%B9%88)下的`LiteLoaderQQNT-main`文件夹 79 | 80 | -------------------------------------------------------------------------------- /build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | let mut res = winres::WindowsResource::new(); 3 | res.set_manifest( 4 | r#" 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | "#, 15 | ); 16 | if let Err(error) = res.compile() { 17 | eprint!("{error}"); 18 | std::process::exit(1); 19 | } 20 | } -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use std::{ 2 | fs::{self}, 3 | path::PathBuf, 4 | str::FromStr, 5 | sync::Arc, 6 | }; 7 | 8 | use ::time::format_description; 9 | use path_clean::PathClean; 10 | use reqwest::header::{HeaderName, HeaderValue}; 11 | use time::UtcOffset; 12 | 13 | use std::mem::{size_of, zeroed}; 14 | use std::ptr::null_mut; 15 | use winapi::um::handleapi::CloseHandle; 16 | use winapi::um::processthreadsapi::{GetCurrentProcess, OpenProcessToken}; 17 | use winapi::um::securitybaseapi::GetTokenInformation; 18 | use winapi::um::winnt::{TokenElevation, TOKEN_ELEVATION, TOKEN_QUERY}; 19 | 20 | fn get_apath(path: &PathBuf) -> PathBuf { 21 | let apath; 22 | if path.is_absolute() { 23 | apath = path.clean(); 24 | } else { 25 | apath = std::env::current_dir().unwrap().join(path).clean(); 26 | } 27 | apath 28 | } 29 | 30 | fn get_qq_path_by_reg() -> Result> { 31 | let hkcu = winreg::RegKey::predef(winreg::enums::HKEY_LOCAL_MACHINE); 32 | let qq_setting; 33 | if let Ok(val) = hkcu.open_subkey(r#"Software\Microsoft\Windows\CurrentVersion\Uninstall\QQ"#) { 34 | qq_setting = val; 35 | } else { 36 | qq_setting = hkcu.open_subkey(r#"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ"#)?; 37 | } 38 | let qq_path: String = qq_setting.get_value("UninstallString")?; 39 | let q = PathBuf::from_str(&qq_path)? 40 | .parent() 41 | .ok_or("can't find qq path")? 42 | .to_owned(); 43 | Ok(q) 44 | } 45 | 46 | fn get_qq_path_by_current_exe_path() -> Result> { 47 | let current_exe_path = std::env::current_exe()?; 48 | let current_path = current_exe_path.parent().ok_or("can't find current path")?; 49 | let qq_path = current_path.join("QQ.exe"); 50 | if qq_path.is_file() { 51 | return Ok(current_path.to_path_buf()); 52 | } 53 | Err("can't find qq.exe on current path".into()) 54 | } 55 | 56 | fn get_qq_path_by_cfg() -> Result> { 57 | let current_exe_path = std::env::current_exe()?; 58 | let current_path = current_exe_path.parent().ok_or("can't find current path")?; 59 | let cfg_file = current_path.join("llob_install.json"); 60 | let json_str = fs::read_to_string(cfg_file)?; 61 | let json: serde_json::Value = serde_json::from_str(&json_str)?; 62 | let qq_path_str = json["qq_exe_path"] 63 | .as_str() 64 | .ok_or("failed to get qq_exe_path")?; 65 | let qq_exe_path = PathBuf::from(qq_path_str); 66 | let qq_exe_path_t = get_apath(&qq_exe_path); 67 | if qq_exe_path_t.is_file() { 68 | return Ok(qq_exe_path_t 69 | .parent() 70 | .ok_or("can't find qq path")? 71 | .to_path_buf()); 72 | } 73 | Err("can't find qq.exe llob_install.json".into()) 74 | } 75 | 76 | fn get_qq_path() -> Result> { 77 | // 先看配置文件 78 | if let Ok(qq_path) = get_qq_path_by_cfg() { 79 | log::info!("从配置文件获取到QQ.exe"); 80 | return Ok(qq_path); 81 | } 82 | // 再看当前目录 83 | if let Ok(qq_path) = get_qq_path_by_current_exe_path() { 84 | log::info!("从当前位置获取到QQ.exe"); 85 | return Ok(qq_path); 86 | } 87 | // 再看注册表 88 | if let Ok(qq_path) = get_qq_path_by_reg() { 89 | log::info!("从注册表获取到QQ.exe"); 90 | return Ok(qq_path); 91 | } 92 | Err("can't find qq path".into()) 93 | } 94 | 95 | fn is_qq_run(qq_path:&PathBuf) -> Result> { 96 | let system = sysinfo::System::new_all(); 97 | let process_name = "QQ.exe"; 98 | if let Some(process) = system.processes_by_name(process_name).next() { 99 | let process_exe_path = process.exe().ok_or("can't get process exe path")?; 100 | if let Some(process_path) = process_exe_path.parent() { 101 | if process_path == qq_path { 102 | return Ok(true) 103 | } 104 | } 105 | } 106 | Ok(false) 107 | } 108 | 109 | fn http_post(rt_ptr: Arc, url: &str, user_agent: Option<&str>) -> Result, Box> { 110 | let bin = rt_ptr.block_on(async { 111 | let client = reqwest::Client::builder() 112 | .danger_accept_invalid_certs(true) 113 | .no_proxy() 114 | .build() 115 | .unwrap(); 116 | let mut req = client 117 | .get(url) 118 | .body(reqwest::Body::from(vec![])) 119 | .build() 120 | .unwrap(); 121 | if let Some(ua) = user_agent { 122 | req.headers_mut().append( 123 | HeaderName::from_str("User-Agent").unwrap(), 124 | HeaderValue::from_str(ua).unwrap(), 125 | ); 126 | } 127 | let ret = client.execute(req).await; 128 | if ret.is_err() { 129 | log::error!("Failed to download file{:?}", ret.err().unwrap()); 130 | return Err("Failed to download file".into()); 131 | } 132 | let ret = ret.unwrap(); 133 | let bin = ret.bytes().await; 134 | if bin.is_err() { 135 | log::error!("Failed to download file{:?}", bin.err().unwrap()); 136 | return Err("Failed to download file".into()); 137 | } 138 | let bin = bin.unwrap(); 139 | Ok(bin.to_vec()) 140 | }); 141 | bin 142 | } 143 | 144 | fn is_admin() -> Result> { 145 | let mut token: winapi::um::winnt::HANDLE = null_mut(); 146 | let process = unsafe { GetCurrentProcess() }; 147 | 148 | if unsafe { OpenProcessToken(process, TOKEN_QUERY, &mut token) } != 0 { 149 | let mut elevation: TOKEN_ELEVATION = unsafe { zeroed() }; 150 | let mut ret_length = 0; 151 | 152 | let success = unsafe { 153 | GetTokenInformation( 154 | token, 155 | TokenElevation, 156 | &mut elevation as *mut _ as winapi::shared::minwindef::LPVOID, 157 | size_of::() as u32, 158 | &mut ret_length, 159 | ) 160 | }; 161 | 162 | unsafe { CloseHandle(token) }; 163 | 164 | if success != 0 && elevation.TokenIsElevated != 0 { 165 | Ok(true) 166 | } else { 167 | Ok(false) 168 | } 169 | } else { 170 | Ok(false) 171 | } 172 | } 173 | 174 | fn init_log() { 175 | // 初始化日志 176 | let format = "[year]-[month]-[day] [hour]:[minute]:[second]"; 177 | 178 | // 获得utc偏移 179 | let utc_offset; 180 | if let Ok(v) = UtcOffset::current_local_offset() { 181 | utc_offset = v; 182 | } else { 183 | // 中国是东八区,所以这里写8 hour 184 | utc_offset = UtcOffset::from_hms(8, 0, 0).unwrap(); 185 | } 186 | 187 | tracing_subscriber::fmt() 188 | .with_timer(tracing_subscriber::fmt::time::OffsetTime::new( 189 | utc_offset, 190 | format_description::parse(format).unwrap(), 191 | )) 192 | .with_ansi(false) 193 | .with_max_level(tracing::Level::INFO) 194 | .init(); 195 | } 196 | 197 | fn app_exit() -> ! { 198 | loop { 199 | let time_struct = core::time::Duration::from_millis(500); 200 | std::thread::sleep(time_struct); 201 | } 202 | } 203 | 204 | fn is_x86_64(exe_data: &[u8]) -> Result> { 205 | use goblin::Object; 206 | match Object::parse(exe_data)? { 207 | Object::PE(pe) => Ok(pe.is_64), 208 | _ => Err("File is not a Windows PE file.".into()), 209 | } 210 | } 211 | 212 | fn iswin32(qq_exe_path: &PathBuf) -> Result> { 213 | let content = std::fs::read(qq_exe_path)?; 214 | if is_x86_64(&content)? { 215 | return Ok(false); 216 | } 217 | Ok(true) 218 | } 219 | 220 | pub async fn github_proxy() -> Option { 221 | let urls_to_test = [ 222 | "https://kkgithub.com", 223 | "https://dgithub.xyz", 224 | "https://gh-proxy.com/https://github.com", 225 | "https://github.com", 226 | ]; 227 | let (tx, mut rx) = tokio::sync::mpsc::channel(urls_to_test.len() + 1); 228 | for url in urls_to_test { 229 | let tx = tx.clone(); 230 | tokio::spawn(async move { 231 | let client = reqwest::Client::builder() 232 | .danger_accept_invalid_certs(true) 233 | .no_proxy() 234 | .build() 235 | .unwrap(); 236 | let uri = reqwest::Url::from_str(&(url.to_owned() + "/LiteLoaderQQNT/QQNTFileVerifyPatch/releases/download/DllHijack_1.0.8/dbghelp_x64.dll")).unwrap(); 237 | let req = client.get(uri).build().unwrap(); 238 | if let Ok(ret) = client.execute(req).await { 239 | if ret.status() == reqwest::StatusCode::OK { 240 | if let Ok(bin) = ret.bytes().await { 241 | if bin.starts_with(&[b'M', b'Z']) { 242 | let _err = tx.send(url).await; 243 | } 244 | } 245 | } 246 | }; 247 | }); 248 | } 249 | tokio::spawn(async move { 250 | tokio::time::sleep(std::time::Duration::from_secs(10)).await; 251 | let _err = tx.send("timeout").await; 252 | }); 253 | let ret = rx.recv().await; 254 | if let Some(r) = ret { 255 | if r != "timeout" { 256 | return Some(r.to_owned()); 257 | } 258 | } 259 | None 260 | } 261 | 262 | fn fix_index_js(index_js_path:&PathBuf,userdir:&PathBuf) -> Result<(), Box> { 263 | let mut to_write = r#"const fs = require("fs"); 264 | const path = require("path"); 265 | const package_path = path.join(process.resourcesPath, "app/package.json"); 266 | const package = require(package_path); 267 | package.main = "./application/app_launcher/index.js"; 268 | fs.writeFileSync(package_path, JSON.stringify(package, null, 4), "utf-8"); 269 | "#.to_owned(); 270 | to_write.push_str(&("require(String.raw`".to_owned() 271 | + &userdir 272 | .join("LiteLoaderQQNT-main") 273 | .to_string_lossy() 274 | .to_string() 275 | + "`);\r\n")); 276 | to_write.push_str("require('../major.node').load('internal_index', module);\r\n"); 277 | 278 | to_write.push_str("setTimeout(() => {\n"); 279 | to_write.push_str(" package.main = \"./app_launcher/index.js\";\n"); 280 | to_write.push_str(" fs.writeFileSync(package_path, JSON.stringify(package, null, 4), \"utf-8\");\n"); 281 | to_write.push_str("}, 0);\n"); 282 | 283 | fs::write( 284 | index_js_path, 285 | to_write, 286 | )?; 287 | Ok(()) 288 | } 289 | 290 | fn extrat(from: &PathBuf, to: &PathBuf, flag: bool) -> Result<(), Box> { 291 | let file = std::fs::File::open(from)?; 292 | 293 | let mut archive = zip::ZipArchive::new(file)?; 294 | for i in 0..archive.len() { 295 | let mut file = archive.by_index(i)?; 296 | let outpath = match file.enclosed_name() { 297 | Some(path) => { 298 | // write by chatgpt4 299 | let deal_path = path; 300 | let components: Vec<_> = deal_path.components().collect(); 301 | if flag { 302 | // println!("components:{components:?}"); 303 | if components.len() > 1 { 304 | // 从第二个组件开始收集,直到倒数第二个(不包括最后一个组件) 305 | let new_path = components[1..components.len()] 306 | .iter() 307 | .map(|c| c.as_os_str()) 308 | .collect::(); 309 | to.join(new_path) 310 | } else { 311 | continue; 312 | //return Err("Path is too short to remove the last component".into()); 313 | } 314 | } else { 315 | let new_path = components[0..components.len()] 316 | .iter() 317 | .map(|c| c.as_os_str()) 318 | .collect::(); 319 | to.join(new_path) 320 | } 321 | } 322 | None => continue, 323 | }; 324 | 325 | { 326 | let comment = file.comment(); 327 | if !comment.is_empty() { 328 | log::error!("File {i} comment: {comment}"); 329 | } 330 | } 331 | 332 | if (*file.name()).ends_with('/') { 333 | // log::info!("File {} extracted to \"{}\"", i, outpath.display()); 334 | std::fs::create_dir_all(&outpath)?; 335 | } else { 336 | // log::info!( 337 | // "File {} extracted to \"{}\" ({} bytes)", 338 | // i, 339 | // outpath.display(), 340 | // file.size() 341 | // ); 342 | if let Some(p) = outpath.parent() { 343 | if !p.exists() { 344 | std::fs::create_dir_all(p)?; 345 | } 346 | } 347 | let mut outfile = std::fs::File::create(&outpath)?; 348 | std::io::copy(&mut file, &mut outfile)?; 349 | } 350 | 351 | // Get and Set permissions 352 | #[cfg(unix)] 353 | { 354 | use std::os::unix::fs::PermissionsExt; 355 | 356 | if let Some(mode) = file.unix_mode() { 357 | std::fs::set_permissions(&outpath, std::fs::Permissions::from_mode(mode))?; 358 | } 359 | } 360 | } 361 | Ok(()) 362 | } 363 | 364 | fn get_qq_version(qqpath:&PathBuf) -> Result> { 365 | let config_json_path = qqpath.join("versions").join("config.json"); 366 | let config_str = fs::read_to_string(config_json_path)?; 367 | let config_json:serde_json::Value = serde_json::from_str(&config_str)?; 368 | let cur_version = config_json["curVersion"].as_str().ok_or("解析config.json失败")?; 369 | return Ok(cur_version.to_owned()); 370 | } 371 | 372 | fn main() { 373 | if let Err(e) = mymain() { 374 | log::error!("{e:?}"); 375 | app_exit(); 376 | } 377 | app_exit(); 378 | } 379 | 380 | fn fix_package_json(package_json_path:&PathBuf) -> Result<(), Box> { 381 | let json_str = fs::read_to_string(package_json_path)?; 382 | let mut json:serde_json::Value = serde_json::from_str(&json_str)?; 383 | let json_main = json.get_mut("main").ok_or("没有在package.json中找到main字段")?; 384 | *json_main = serde_json::json!("./app_launcher/index.js"); 385 | fs::write( 386 | package_json_path, 387 | serde_json::to_string_pretty(&json)?, 388 | )?; 389 | Ok(()) 390 | } 391 | 392 | fn mymain() -> Result<(), Box> { 393 | let rt_ptr: Arc = Arc::new(tokio::runtime::Runtime::new().unwrap()); 394 | 395 | init_log(); 396 | 397 | log::info!("欢迎使用LLOB安装器0.0.10 by super1207"); 398 | 399 | if let Ok(_) = std::env::var("LITELOADERQQNT_PROFILE") { 400 | log::error!("检测到您的环境变量中存在LITELOADERQQNT_PROFILE,你可能已经手动安装过LiteLoaderQQNT,程序终止!"); 401 | app_exit(); 402 | } 403 | 404 | let has_admin = is_admin().unwrap(); 405 | if has_admin { 406 | log::info!("拥有管理员权限"); 407 | } else { 408 | log::error!("没有管理员权限"); 409 | app_exit(); 410 | } 411 | 412 | log::info!("正在查询QQ安装位置..."); 413 | let qq_path; 414 | if let Ok(qq_path_t) = get_qq_path() { 415 | qq_path = qq_path_t; 416 | log::info!("QQ安装位置: {:?}", qq_path); 417 | } else { 418 | log::error!("未找到QQ安装位置,请去安装QQ!:https://im.qq.com/pcqq/index.shtml"); 419 | app_exit(); 420 | } 421 | 422 | let qq_version = match get_qq_version(&qq_path) { 423 | Ok(ver) => ver, 424 | Err(err) => { 425 | log::error!("获取QQ版本号失败,注意当前安装器支持的最低NTQQ版本是9.9.15-28060:{err:?}\r\n如果您使用之前的NTQQ版本,请使用旧版安装器!"); 426 | app_exit(); 427 | }, 428 | }; 429 | 430 | let qq_inner_path = qq_path.join("versions").join(qq_version).join("resources").join("app"); 431 | let package_json_path = qq_inner_path.join("package.json"); 432 | let index_js_path = qq_inner_path.join("app_launcher").join("index.js"); 433 | 434 | 435 | match is_qq_run(&qq_path) { 436 | Ok(is_run) => { 437 | if !is_run { 438 | // log::info!("QQ未运行"); 439 | } else { 440 | log::error!("QQ正在运行,安装LLONEBOT需要确保QQ处于未运行状态,请先结束QQ"); 441 | app_exit(); 442 | } 443 | } 444 | Err(err) => { 445 | log::error!("无法检查QQ是否正在运行:{err:?}"); 446 | app_exit(); 447 | } 448 | } 449 | let is_win32 = iswin32(&qq_path.join("QQ.exe"))?; 450 | 451 | log::info!("正在获取github下载代理..."); 452 | let git_proxy = rt_ptr.block_on(async { 453 | if let Some(proxy_t) = github_proxy().await { 454 | if proxy_t == "https://github.com" { 455 | log::info!("无需使用代理即可连接github"); 456 | } else { 457 | log::info!("使用代理: {:?}", proxy_t); 458 | } 459 | return proxy_t; 460 | } else { 461 | log::error!("无法获取github代理"); 462 | app_exit(); 463 | } 464 | }); 465 | 466 | log::info!("正在获取最新QQNTFileVerifyPatch版本号..."); 467 | let url = "https://api.github.com/repos/LiteLoaderQQNT/QQNTFileVerifyPatch/releases/latest"; 468 | let bin = match http_post(rt_ptr.clone(), url, Some("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36")) { 469 | Ok(bin) => bin, 470 | Err(_) => { 471 | log::warn!("无法访问GitHub,尝试使用备用URL"); 472 | let backup_url = "https://api.hydroroll.team/api/version?repo=LiteLoaderQQNT/QQNTFileVerifyPatch&type=github-releases-latest"; 473 | match http_post(rt_ptr.clone(), backup_url, Some("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36")) { 474 | Ok(bin) => bin, 475 | Err(_) => { 476 | log::error!("无法获取最新QQNTFileVerifyPatch版本号"); 477 | app_exit(); 478 | } 479 | } 480 | } 481 | }; 482 | let version_json: serde_json::Value = serde_json::from_slice(&bin)?; 483 | let tag_name = version_json["tag_name"] 484 | .as_str() 485 | .ok_or("Failed to get tag_name")?; 486 | log::info!("最新QQNTFileVerifyPatch版本号:{tag_name}"); 487 | 488 | log::info!("正在下载修补文件..."); 489 | let patch_url; 490 | if is_win32 { 491 | patch_url = format!("{git_proxy}/LiteLoaderQQNT/QQNTFileVerifyPatch/releases/download/{tag_name}/dbghelp_x86.dll"); 492 | } else { 493 | patch_url = format!("{git_proxy}/LiteLoaderQQNT/QQNTFileVerifyPatch/releases/download/{tag_name}/dbghelp_x64.dll"); 494 | } 495 | let bin = match http_post(rt_ptr.clone(), &patch_url, None) { 496 | Ok(bin) => bin, 497 | Err(_) => { 498 | log::error!("修补文件下载失败"); 499 | app_exit(); 500 | } 501 | }; 502 | log::info!("修补文件下载完成"); 503 | 504 | log::info!("正在修补..."); 505 | fs::write(qq_path.join("dbghelp.dll"), bin)?; 506 | log::info!("修补完成"); 507 | 508 | log::info!("正在下载LiteLoader项目..."); 509 | let patch_url = format!("{git_proxy}/LiteLoaderQQNT/LiteLoaderQQNT/archive/master.zip"); 510 | let bin = match http_post(rt_ptr.clone(), &patch_url, None) { 511 | Ok(bin) => bin, 512 | Err(_) => { 513 | log::error!("LiteLoader项目下载失败"); 514 | app_exit(); 515 | } 516 | }; 517 | log::info!("下载完成"); 518 | 519 | log::info!("正在解压..."); 520 | let userdir = PathBuf::from_str(&std::env::var("USERPROFILE")?)?; 521 | let zip_path = userdir.join("LiteLoaderQQNT-main.zip"); 522 | fs::write(&zip_path, bin)?; 523 | extrat( 524 | &zip_path, 525 | &zip_path 526 | .parent() 527 | .ok_or("can't get parent")? 528 | .join("LiteLoaderQQNT-main"), 529 | true, 530 | )?; 531 | log::info!("解压完成"); 532 | fix_index_js(&index_js_path,&userdir)?; 533 | fix_package_json(&package_json_path)?; 534 | log::info!("LiteLoaderQQNT安装完成"); 535 | 536 | log::info!("正在获取最新LLOB版本号..."); 537 | let url = "https://api.github.com/repos/LLOneBot/LLOneBot/releases/latest"; 538 | let bin = match http_post(rt_ptr.clone(), url, Some("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36")) { 539 | Ok(bin) => bin, 540 | Err(_) => { 541 | log::warn!("无法访问GitHub,尝试使用备用URL"); 542 | let backup_url = "https://api.hydroroll.team/api/version?repo=LLOneBot/LLOneBot&type=github-releases-latest"; 543 | match http_post(rt_ptr.clone(), backup_url, Some("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36")) { 544 | Ok(bin) => bin, 545 | Err(_) => { 546 | log::error!("无法获取最新LLOB版本号"); 547 | app_exit(); 548 | } 549 | } 550 | } 551 | }; 552 | let version_json: serde_json::Value = serde_json::from_slice(&bin)?; 553 | let tag_name = version_json["tag_name"] 554 | .as_str() 555 | .ok_or("Failed to get tag_name")?; 556 | log::info!("最新LLOB版本号:{tag_name}"); 557 | 558 | log::info!("正在下载LLOB项目..."); 559 | let patch_url = format!("{git_proxy}/LLOneBot/LLOneBot/releases/download/{tag_name}/LLOneBot.zip"); 560 | let bin = match http_post(rt_ptr.clone(), &patch_url, None) { 561 | Ok(bin) => bin, 562 | Err(_) => { 563 | log::error!("LLOB项目下载失败"); 564 | app_exit(); 565 | } 566 | }; 567 | log::info!("下载完成"); 568 | 569 | log::info!("正在安装LLOnebOT..."); 570 | let zip_path = userdir 571 | .join("LiteLoaderQQNT-main") 572 | .join("plugins") 573 | .join(format!("LLOneBot{tag_name}.zip")); 574 | std::fs::create_dir_all(zip_path.parent().ok_or("can't get parent")?)?; 575 | // 有时候没这个目录会报错 576 | std::fs::create_dir_all(userdir.join("LiteLoaderQQNT-main").join("data"))?; 577 | fs::write(&zip_path, bin)?; 578 | extrat( 579 | &zip_path, 580 | &zip_path 581 | .parent() 582 | .ok_or("can't get parent")? 583 | .join("LLOneBot"), 584 | false, 585 | )?; 586 | log::info!("安装完成"); 587 | 588 | log::info!("安装成功!!!!!!!!!享受快乐时光吧"); 589 | 590 | Ok(()) 591 | } 592 | --------------------------------------------------------------------------------