├── .gitignore ├── files ├── demo.toml ├── gha-self-hosted.toml ├── rustc │ ├── ninja.toml │ ├── llvm-mingw.toml │ ├── gnu.toml │ ├── solaris.toml │ ├── gcc.toml │ ├── freebsd.toml │ ├── android.toml │ ├── netbsd.toml │ ├── llvm.toml │ ├── mingw.toml │ ├── misc.toml │ └── sccache.toml ├── stdarch.toml └── libc.toml ├── src ├── utils.rs ├── downloader.rs ├── storage.rs ├── main.rs └── manifest.rs ├── Cargo.toml ├── LICENSE-MIT ├── .github └── workflows │ └── ci.yml ├── README.md ├── LICENSE-APACHE └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /files/demo.toml: -------------------------------------------------------------------------------- 1 | # Demo file to ensure the tooling works :D 2 | [[files]] 3 | name = "bors-r-plus.png" 4 | source = "https://www.pietroalbini.org/bors-r-plus.png" 5 | sha256 = "2d58773aebf52adcc8917e914d77bcd0315719f39baf5c22a26e9dcae6be71d9" 6 | license = "Pietro created it at some point I guess" 7 | -------------------------------------------------------------------------------- /src/utils.rs: -------------------------------------------------------------------------------- 1 | use sha2::{Digest, Sha256}; 2 | 3 | pub fn to_hex(sha: &Sha256) -> String { 4 | let sha = sha.clone().finalize(); 5 | let bytes = sha.as_slice(); 6 | let mut result = String::new(); 7 | for byte in bytes { 8 | result.push_str(&format!("{byte:0>2x}")); 9 | } 10 | result 11 | } 12 | -------------------------------------------------------------------------------- /files/gha-self-hosted.toml: -------------------------------------------------------------------------------- 1 | [[files]] 2 | name = "gha-self-hosted/qemu-efi-aarch64_2022.11-6.deb" 3 | source = "http://ftp.debian.org/debian/pool/main/e/edk2/qemu-efi-aarch64_2022.11-6+deb12u2_all.deb" 4 | sha256 = "9a55c7b94fdf13a28928359a77d42e5364aa3ae2e558bd1fd5361955bf479d81" 5 | license = "BSD" 6 | rename-from = "qemu-efi-aarch64_2022.11-6+deb12u2_all.deb" 7 | -------------------------------------------------------------------------------- /files/rustc/ninja.toml: -------------------------------------------------------------------------------- 1 | [[files]] 2 | name = "rustc/2017-03-15-ninja-win.zip" 3 | sha256 = "95b36a597d33c1fe672829cfe47b5ab34b3a1a4c6bf628e5d150b6075df4ef50" 4 | legacy = true 5 | 6 | [[files]] 7 | name = "rustc/2024-03-28-v1.11.1-ninja-win.zip" 8 | sha256 = "524b344a1a9a55005eaf868d991e090ab8ce07fa109f1820d40e74642e289abc" 9 | legacy = true 10 | 11 | [[files]] 12 | name = "rustc/ninja-linux-1.10.1" 13 | sha256 = "654835515dc08b38e498233d5eea02cfd4f41202a204015f19ba554a897e6093" 14 | legacy = true 15 | 16 | [[files]] 17 | name = "rustc/ninja-linux-1.10.1.zip" 18 | sha256 = "7ee7f467a1a747c5b5e02342904af9c24e84df4ca993541f1c4d0f113cab27aa" 19 | legacy = true 20 | -------------------------------------------------------------------------------- /files/rustc/llvm-mingw.toml: -------------------------------------------------------------------------------- 1 | [[files]] 2 | name = "rustc/llvm-mingw-20251104-ucrt-aarch64.zip" 3 | sha256 = "a71358c7302cfa55a7ec1b86c75ab3672d11c21399fc5d5fa039c0b335b090db" 4 | source = "https://github.com/mstorsjo/llvm-mingw/releases/download/20251104/llvm-mingw-20251104-ucrt-aarch64.zip" 5 | license = "Apache License v2.0 with LLVM Exceptions" 6 | 7 | [[files]] 8 | name = "rustc/llvm-mingw-20251104-ucrt-x86_64.zip" 9 | sha256 = "171b298f46fa4b5653dc7b01cc5e709caca645991be8e1b0724466c4a282a1ac" 10 | source = "https://github.com/mstorsjo/llvm-mingw/releases/download/20251104/llvm-mingw-20251104-ucrt-x86_64.zip" 11 | license = "Apache License v2.0 with LLVM Exceptions" 12 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ci-mirrors" 3 | version = "0.0.0" 4 | edition = "2024" 5 | license = "MIT OR Apache-2.0" 6 | 7 | [dependencies] 8 | anyhow = "1.0.97" 9 | aws-config = { version = "1.6.1", features = ["behavior-version-latest"] } 10 | aws-sdk-s3 = "1.82.0" 11 | clap = { version = "4.5.35", default-features = false, features = ["std", "derive", "help"] } 12 | futures = "0.3.31" 13 | reqwest = { version = "0.12.15", features = ["stream"] } 14 | serde = { version = "1.0.219", features = ["derive"] } 15 | sha2 = "0.10.8" 16 | tempfile = "3.19.1" 17 | tokio = { version = "1.44.1", features = ["fs", "macros", "rt", "rt-multi-thread"] } 18 | tokio-util = { version = "0.7.14", features = ["io"] } 19 | toml = "0.8.20" 20 | -------------------------------------------------------------------------------- /files/stdarch.toml: -------------------------------------------------------------------------------- 1 | [[files]] 2 | name = "stdarch/sde-external-9.48.0-2024-11-25-lin.tar.xz" 3 | sha256 = "3173d2a5369e3385226b488d8b75403951bc14af601435fe707d9f83e0b533e6" 4 | legacy = true 5 | 6 | [[files]] 7 | name = "stdarch/sde-external-9.53.0-2025-03-16-lin.tar.xz" 8 | sha256 = "f55138df53378198e8c0a89598351cdb3c5e7f8819e63e472b0bc179afaad34c" 9 | legacy = true 10 | 11 | [[files]] 12 | name = "stdarch/sde-external-9.58.0-2025-06-16-lin.tar.xz" 13 | source = "https://downloadmirror.intel.com/859732/sde-external-9.58.0-2025-06-16-lin.tar.xz" 14 | sha256 = "f849acecad4c9b108259c643b2688fd65c35723cd23368abe5dd64b917cc18c0" 15 | license = "https://www.intel.com/content/www/us/en/developer/articles/license/end-user-license-agreement.html" 16 | -------------------------------------------------------------------------------- /files/rustc/gnu.toml: -------------------------------------------------------------------------------- 1 | [[files]] 2 | name = "rustc/binutils-2.40.tar.bz2" 3 | source = "https://sourceware.org/pub/binutils/releases/binutils-2.40.tar.bz2" 4 | sha256 = "f8298eb153a4b37d112e945aa5cb2850040bcf26a3ea65b5a715c83afe05e48a" 5 | license = "GNU General Public License" 6 | 7 | [[files]] 8 | name = "rustc/binutils-2.44.tar.xz" 9 | source = "https://sourceware.org/pub/binutils/releases/binutils-2.44.tar.xz" 10 | sha256 = "ce2017e059d63e67ddb924e09d4ec49c2893605035cd60e92ad53177f4377237" 11 | license = "GNU General Public License" 12 | 13 | [[files]] 14 | name = "rustc/gcc-8.4.0.tar.xz" 15 | source = "https://bigsearcher.com/mirrors/gcc/releases/gcc-8.4.0/gcc-8.4.0.tar.xz" 16 | sha256 = "e3a06e52d1e01f27ed55104ad233c3b0d1e99cfb5ff98ab022dc941edd1b2dd4" 17 | license = "GNU General Public License" 18 | -------------------------------------------------------------------------------- /files/rustc/solaris.toml: -------------------------------------------------------------------------------- 1 | [[files]] 2 | name = "rustc/solaris-11.4.42.111.0-i386-sysroot-v2025-02-21.tar.bz2" 3 | source = "https://github.com/psumbera/solaris-sysroot/releases/download/v2025-02-21/solaris-11.4.42.111.0-i386-sysroot-v2025-02-21.tar.bz2" 4 | sha256 = "e82b78c14464cc2dc71f3cdab312df3dd63441d7c23eeeaf34d41d8b947688d3" 5 | license = "https://www.oracle.com/downloads/licenses/solaris-ea-license.html" 6 | 7 | [[files]] 8 | name = "rustc/solaris-11.4.42.111.0-sparc-sysroot-v2025-02-21.tar.bz2" 9 | source = "https://github.com/psumbera/solaris-sysroot/releases/download/v2025-02-21/solaris-11.4.42.111.0-sparc-sysroot-v2025-02-21.tar.bz2" 10 | sha256 = "e249a7ef781b9b3297419bd014fa5074807030981d84e113d6af3a897a8b4ffc" 11 | license = "https://www.oracle.com/downloads/licenses/solaris-ea-license.html" 12 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | Permission is hereby granted, free of charge, to any person obtaining a copy of 2 | this software and associated documentation files (the "Software"), to deal in 3 | the Software without restriction, including without limitation the rights to 4 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 5 | the Software, and to permit persons to whom the Software is furnished to do so, 6 | subject to the following conditions: 7 | 8 | The above copyright notice and this permission notice shall be included in all 9 | copies or substantial portions of the Software. 10 | 11 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 12 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 13 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 14 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 15 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 16 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 17 | -------------------------------------------------------------------------------- /files/rustc/gcc.toml: -------------------------------------------------------------------------------- 1 | [[files]] 2 | name = "rustc/gcc/gmp-6.3.0.tar.bz2" 3 | source = "https://gmplib.org/download/gmp/gmp-6.3.0.tar.bz2" 4 | sha256 = "ac28211a7cfb609bae2e2c8d6058d66c8fe96434f740cf6fe2e47b000d1c20cb" 5 | license = "GNU General Public License" 6 | 7 | [[files]] 8 | name = "rustc/gcc/mpfr-4.2.2.tar.bz2" 9 | source = "https://www.mpfr.org/mpfr-current/mpfr-4.2.2.tar.bz2" 10 | sha256 = "9ad62c7dc910303cd384ff8f1f4767a655124980bb6d8650fe62c815a231bb7b" 11 | license = "GNU General Public License" 12 | 13 | [[files]] 14 | name = "rustc/gcc/mpc-1.3.1.tar.gz" 15 | source = "https://ftp.gnu.org/gnu/mpc/mpc-1.3.1.tar.gz" 16 | sha256 = "ab642492f5cf882b74aa0cb730cd410a81edcdbec895183ce930e706c1c759b8" 17 | license = "GNU General Public License" 18 | 19 | [[files]] 20 | name = "rustc/gcc/gcc-9.2.0.tar.xz" 21 | sha256 = "ea6ef08f121239da5695f76c9b33637a118dcf63e24164422231917fa61fb206" 22 | source = "https://ftp.gnu.org/gnu/gcc/gcc-9.2.0/gcc-9.2.0.tar.xz" 23 | license = "GNU General Public License" 24 | 25 | [[files]] 26 | name = "rustc/gcc/gcc-9.5.0.tar.xz" 27 | sha256 = "27769f64ef1d4cd5e2be8682c0c93f9887983e6cfd1a927ce5a0a2915a95cf8f" 28 | source = "https://ftp.gnu.org/gnu/gcc/gcc-9.5.0/gcc-9.5.0.tar.xz" 29 | license = "GNU General Public License" 30 | -------------------------------------------------------------------------------- /files/rustc/freebsd.toml: -------------------------------------------------------------------------------- 1 | [[files]] 2 | name = "rustc/2019-04-04-freebsd-amd64-10.3-RELEASE-base.txz" 3 | sha256 = "e7c4c961694e34b2b60598d9668a185b5de1c6241bedfc4891cd9ea8fbff2dc4" 4 | legacy = true 5 | 6 | [[files]] 7 | name = "rustc/2019-04-04-freebsd-i386-10.3-RELEASE-base.txz" 8 | sha256 = "311faed2f5484184d4942399edc49e7add0fdccf30bdb22ee404f0c5d5cd768a" 9 | legacy = true 10 | 11 | [[files]] 12 | name = "rustc/2020-08-09-freebsd-amd64-11.4-RELEASE-base.txz" 13 | sha256 = "3bac8257bdd5e5b071f7b80cc591ebecd01b9314ca7839a2903096cbf82169f9" 14 | legacy = true 15 | 16 | [[files]] 17 | name = "rustc/2020-08-09-freebsd-i386-11.4-RELEASE-base.txz" 18 | sha256 = "ae602552ff4c26f31b304e4a1ffc066db826e75d07ba9a4bf33649e9549bf27b" 19 | legacy = true 20 | 21 | [[files]] 22 | name = "rustc/2022-05-06-freebsd-12.3-amd64-base.txz" 23 | sha256 = "e85b256930a2fbc04b80334106afecba0f11e52e32ffa197a88d7319cf059840" 24 | legacy = true 25 | 26 | [[files]] 27 | name = "rustc/2022-05-06-freebsd-12.3-i386-base.txz" 28 | sha256 = "789c9a08bdf9ece4a6e73454daf4940f79889efdc0e8b37db02cc26147a93a47" 29 | legacy = true 30 | 31 | [[files]] 32 | name = "rustc/2024-02-18-freebsd-13.2-amd64-base.txz" 33 | sha256 = "3a9250f7afd730bbe274691859756948b3c57a99bcda30d65d46ae30025906f0" 34 | legacy = true 35 | 36 | [[files]] 37 | name = "rustc/2024-02-18-freebsd-13.2-i386-base.txz" 38 | sha256 = "f784eabacca2eead765b14f664d7775f8f6a12aa74d8c657be851d1e090b187d" 39 | legacy = true 40 | 41 | [[files]] 42 | name = "rustc/2024-09-13-freebsd-13.4-amd64-base.txz" 43 | sha256 = "8e13b0a93daba349b8d28ad246d7beb327659b2ef4fe44d89f447392daec5a7c" 44 | legacy = true 45 | 46 | [[files]] 47 | name = "rustc/2024-09-13-freebsd-13.4-i386-base.txz" 48 | sha256 = "fc8f624bc3f60d2f04fadfc7de50f5b7ed22fe0314faf637bf46bbdd173f41d8" 49 | legacy = true 50 | -------------------------------------------------------------------------------- /files/rustc/android.toml: -------------------------------------------------------------------------------- 1 | [[files]] 2 | name = "rustc/android/3534162-studio.sdk-patcher.zip" 3 | sha256 = "18f9b8f27ea656e06b05d8f14d881df8e19803c9221c0be3e801632bcef18bed" 4 | legacy = true 5 | 6 | [[files]] 7 | name = "rustc/android/android-18_r03.zip" 8 | sha256 = "166ae9cf299747a5faa8f04168f0ee47cd7466a975d8b44acaaa62a43e767568" 9 | legacy = true 10 | 11 | [[files]] 12 | name = "rustc/android/android-21_r02.zip" 13 | sha256 = "a76cd7ad3080ac6ce9f037cb935b399a1bad396c0605d4ff42f693695f1dcefe" 14 | legacy = true 15 | 16 | [[files]] 17 | name = "rustc/android/emulator-linux-5264690.zip" 18 | sha256 = "6821047a6444e722c8f3d52a621bb6ecb2651be84bde6cd26b404f234f45fdc4" 19 | legacy = true 20 | 21 | [[files]] 22 | name = "rustc/android/emulator-linux_x64-11237101.zip" 23 | sha256 = "cfd54ce620ad5f9f786682ecad88b8b9da7ac48827d57406cc2a31bb8f6e73fe" 24 | legacy = true 25 | 26 | [[files]] 27 | name = "rustc/android/emulator-linux_x64-11772612.zip" 28 | sha256 = "6df97f72ab3108ba124e701348025125755f9f378131c45467890d9960a47e13" 29 | legacy = true 30 | 31 | [[files]] 32 | name = "rustc/android/emulator-linux_x64-12038310.zip" 33 | sha256 = "621c9384efa919ecf42d94b29e47abbc097261fa7bff667adf4bddb9a35f7254" 34 | legacy = true 35 | 36 | [[files]] 37 | name = "rustc/android/platform-tools_r28.0.2-linux.zip" 38 | sha256 = "3ddee83a3dbbed7129607e4ef5dcfa73fd1b9f7d124d30881d955a67e916ccf8" 39 | legacy = true 40 | 41 | [[files]] 42 | name = "rustc/android/platform-tools_r34.0.5-linux.zip" 43 | sha256 = "362f8f6218af0f4c61e5aaafb8e255a426c7a0ee00127dfab7371775081d3124" 44 | legacy = true 45 | 46 | [[files]] 47 | name = "rustc/android/sdk-tools-linux-4333796.zip" 48 | sha256 = "92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9" 49 | legacy = true 50 | 51 | [[files]] 52 | name = "rustc/android/sys-img/android/arm64-v8a-21_r04.zip" 53 | sha256 = "6f9f8ab64641ccbea92a02cc85c130a60c3464b87aa9d49952a8d8292f84d073" 54 | legacy = true 55 | 56 | [[files]] 57 | name = "rustc/android/sys-img/android/armeabi-v7a-18_r05.zip" 58 | sha256 = "4200009917fad970953855a93cf197d0b5739262ff37395f0747a5f49d5485e7" 59 | legacy = true 60 | 61 | [[files]] 62 | name = "rustc/android/sys-img/android/armeabi-v7a-21_r04.zip" 63 | sha256 = "4f20bb4abff1fcda7fdde510993d2004b0ca330ae6e7a798ffecc3fbf6d48520" 64 | legacy = true 65 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | pull_request: 5 | merge_group: 6 | 7 | jobs: 8 | build: 9 | name: Build and test 10 | runs-on: ubuntu-latest 11 | permissions: 12 | contents: read 13 | steps: 14 | - name: Checkout the source code 15 | uses: actions/checkout@v4 16 | 17 | - name: Check formatting 18 | run: cargo fmt --check 19 | 20 | - name: Build the tool 21 | run: cargo build 22 | 23 | - name: Try a dry run of the changes 24 | run: cargo run -- upload --skip-upload 25 | if: github.event_name == 'pull_request' 26 | 27 | - name: Upload tool to artifacts 28 | uses: actions/upload-artifact@v4 29 | with: 30 | name: tool 31 | path: target/debug/ci-mirrors 32 | if-no-files-found: error 33 | 34 | - name: Upload TOML files to artifacts 35 | uses: actions/upload-artifact@v4 36 | with: 37 | name: files-manifests 38 | path: files/ 39 | if-no-files-found: error 40 | 41 | apply: 42 | name: Apply to production 43 | runs-on: ubuntu-latest 44 | needs: [ build ] 45 | if: github.event_name == 'merge_group' 46 | 47 | permissions: 48 | id-token: write 49 | environment: 50 | name: upload 51 | url: https://ci-mirrors.rust-lang.org 52 | 53 | steps: 54 | - name: Download the tool 55 | uses: actions/download-artifact@v4 56 | with: 57 | name: tool 58 | 59 | - name: Download TOML files 60 | uses: actions/download-artifact@v4 61 | with: 62 | name: files-manifests 63 | path: files/ 64 | 65 | - name: Authenticate with AWS 66 | uses: aws-actions/configure-aws-credentials@v4 67 | with: 68 | aws-region: us-west-1 69 | role-to-assume: arn:aws:iam::890664054962:role/ci--rust-lang--ci-mirrors 70 | 71 | - name: Mark the tool as executable 72 | run: chmod +x ./ci-mirrors 73 | 74 | - name: Run the tool 75 | run: ./ci-mirrors upload 76 | 77 | finished: 78 | name: Build finished 79 | runs-on: ubuntu-latest 80 | needs: [ build, apply ] 81 | if: "${{ !cancelled() }}" 82 | env: 83 | NEEDS: "${{ toJson(needs) }}" 84 | steps: 85 | - name: Check if all jobs were successful or skipped 86 | run: echo "${NEEDS}" | jq --exit-status 'all(.result == "success" or .result == "skipped")' 87 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ci-mirrors tooling 2 | 3 | This repository contains the tooling to manage the contents of 4 | [ci-mirrors.rust-lang.org](https://ci-mirrors.rust-lang.org). 5 | 6 | The contents of this repository are licensed under either the MIT or the Apache 7 | 2.0 license, at your option. 8 | 9 | > [!WARNING] 10 | > 11 | > ci-mirrors is designed to be used by repositories managed by the Rust project 12 | > only. We provide no guarantees for third parties. 13 | 14 | ## Uploading new files 15 | 16 | To upload a new file to ci-mirrors, open a new PR adding a new entry to one of 17 | the TOML files in the `files/` directory. Each entry has the following schema: 18 | 19 | * **`name`**: the name the file will have on ci-mirrors. It's possible to use 20 | slashes to define an hierarchy, for example prefixing the name of the file 21 | with the repository that uses it. 22 | 23 | * **`source`**: the URL of the original file to mirror. The tooling will 24 | download the file from there automatically, so make sure no user interaction 25 | nor JavaScript is required to start the download. Redirects are followed. 26 | 27 | * **`sha256`**: the SHA256 of the file to mirror. The upload will fail if the 28 | mirrored file doesn't match the hash. 29 | 30 | * **`license`**: the licensing of the file. This is a *freeform* field: for 31 | artifacts built from open source code you should put the license identifier, 32 | for everything else you should put a link to the licensing terms. 33 | 34 | * **`rename-from`**: in case the `source` file has a different name than `name`, 35 | you need to add this field to explicitly mark that this is expected with the 36 | file name from `source`. 37 | 38 | You can add a new entry either by manually modifying a TOML file in the `files` directory, 39 | or by using the following command: 40 | 41 | ```bash 42 | $ cargo run -- add-file --path --toml-files [--license ] 43 | ``` 44 | 45 | Once the PR is merged, the file will be available at: 46 | 47 | ``` 48 | https://ci-mirrors.rust-lang.org/${name} 49 | ``` 50 | 51 | > [!NOTE] 52 | > 53 | > Some files are marked with `legacy = true`, and don't have a source nor a 54 | > license. Those files were added to ci-mirrors before this tool was introduced. 55 | > No new files should be marked with it. 56 | 57 | ## Modifying or deleting an uploaded file 58 | 59 | It is not currently supported to modify or delete an uploaded file. Doing so 60 | would break the repositories currently relying on that file. If you *really* 61 | need to do so, please ask the infra team on Zulip. 62 | 63 | > [!NOTE] 64 | > 65 | > Storage space in ci-mirrors is not a concern. If you need to upload a new 66 | > version of a file, add it separately without deleting the old one. 67 | -------------------------------------------------------------------------------- /files/libc.toml: -------------------------------------------------------------------------------- 1 | [[files]] 2 | name = "libc/2016-11-06/freebsd.qcow2.gz" 3 | sha256 = "0c69e10b8bfeb829e560150559de1966ff796cf31c4757cef91653da28b7cbf3" 4 | legacy = true 5 | 6 | [[files]] 7 | name = "libc/2016-11-06/openbsd-6.0-without-pkgs.qcow2" 8 | sha256 = "525595ce32176a3e43722efb26336169ea48a0d488a1fa5ad133b41c9c8f51de" 9 | legacy = true 10 | 11 | [[files]] 12 | name = "libc/2018-03-15/FreeBSD-11.1-RELEASE-amd64.qcow2.xz" 13 | sha256 = "5d1e7b4ecbf490d2d4798a1b86b847761667c1a1014c8309a1871c175a495bd1" 14 | legacy = true 15 | 16 | [[files]] 17 | name = "libc/OpenWrt-SDK-ar71xx-generic_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2" 18 | sha256 = "e31adea0bad3a36f56c87309dde8e7e1205b71b1be908eca00504bc15198ce62" 19 | legacy = true 20 | 21 | [[files]] 22 | name = "libc/OpenWrt-Toolchain-malta-le_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2" 23 | sha256 = "ad41df333c059e552171b9ece2efbc177e9da389062a564b1883b6f60ca329fd" 24 | legacy = true 25 | skip-validation = true # duplicate hash 26 | 27 | [[files]] 28 | name = "libc/musl-1.1.24.tar.gz" 29 | sha256 = "1370c9a812b2cf2a7d92802510cca0058cc37e66a7bedd70051f0a34015022a3" 30 | source = "https://www.musl-libc.org/releases/musl-1.1.24.tar.gz" 31 | license = "MIT" 32 | 33 | [[files]] 34 | name = "libc/musl-1.2.3.tar.gz" 35 | sha256 = "7d5b0b6062521e4627e099e4c9dc8248d32a30285e959b7eecaa780cf8cfd4a4" 36 | source = "https://www.musl-libc.org/releases/musl-1.2.3.tar.gz" 37 | license = "MIT" 38 | 39 | [[files]] 40 | name = "libc/musl-1.2.5.tar.gz" 41 | sha256 = "a9a118bbe84d8764da0ea0d28b3ab3fae8477fc7e4085d90102b8596fc7c75e4" 42 | source = "https://www.musl-libc.org/releases/musl-1.2.5.tar.gz" 43 | license = "MIT" 44 | 45 | # The `libc/linux-*` paths are unused. 46 | [[files]] 47 | name = "libc/linux-6.6.tar.xz" 48 | sha256 = "d926a06c63dd8ac7df3f86ee1ffc2ce2a3b81a2d168484e76b5b389aba8e56d0" 49 | source = "https://kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz" 50 | license = "GPL-2.0-only WITH Linux-syscall-note" 51 | 52 | [[files]] 53 | name = "libc/linux-6.14.tar.xz" 54 | sha256 = "a294b683e7b161bb0517bb32ec7ed1d2ea7603dfbabad135170ed12d00c47670" 55 | source = "https://kernel.org/pub/linux/kernel/v6.x/linux-6.14.tar.xz" 56 | license = "GPL-2.0-only WITH Linux-syscall-note" 57 | 58 | [[files]] 59 | name = "libc/linux-6.18.tar.xz" 60 | sha256 = "9106a4605da9e31ff17659d958782b815f9591ab308d03b0ee21aad6c7dced4b" 61 | source = "https://kernel.org/pub/linux/kernel/v6.x/linux-6.18.tar.xz" 62 | license = "GPL-2.0-only WITH Linux-syscall-note" 63 | 64 | [[files]] 65 | name = "linux/kernel/v6.x/linux-6.6.tar.xz" 66 | sha256 = "d926a06c63dd8ac7df3f86ee1ffc2ce2a3b81a2d168484e76b5b389aba8e56d0" 67 | source = "https://kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz" 68 | license = "GPL-2.0-only WITH Linux-syscall-note" 69 | 70 | [[files]] 71 | name = "linux/kernel/v6.x/linux-6.14.tar.xz" 72 | sha256 = "a294b683e7b161bb0517bb32ec7ed1d2ea7603dfbabad135170ed12d00c47670" 73 | source = "https://kernel.org/pub/linux/kernel/v6.x/linux-6.14.tar.xz" 74 | license = "GPL-2.0-only WITH Linux-syscall-note" 75 | 76 | [[files]] 77 | name = "linux/kernel/v6.x/linux-6.18.tar.xz" 78 | sha256 = "9106a4605da9e31ff17659d958782b815f9591ab308d03b0ee21aad6c7dced4b" 79 | source = "https://kernel.org/pub/linux/kernel/v6.x/linux-6.18.tar.xz" 80 | license = "GPL-2.0-only WITH Linux-syscall-note" 81 | -------------------------------------------------------------------------------- /files/rustc/netbsd.toml: -------------------------------------------------------------------------------- 1 | [[files]] 2 | name = "rustc/2017-01-13-netbsd-patch1.patch" 3 | sha256 = "997eced279cb59c17d4ac44612a1ce5c86223a068aa73eefbb8faf44ccc78aeb" 4 | legacy = true 5 | 6 | [[files]] 7 | name = "rustc/2017-01-13-netbsd-patch2.patch" 8 | sha256 = "f8435a62a3b198a29ee85a068cadc008dec7b3aac5d91d384a8c819052eba1bc" 9 | legacy = true 10 | 11 | [[files]] 12 | name = "rustc/2017-01-16-netbsd-base.tgz" 13 | sha256 = "0190ce444401a409bc306f2f7901d18c335677ca62ee58c785b0747ebbcf694c" 14 | legacy = true 15 | skip-validation = true # duplicate hash 16 | 17 | [[files]] 18 | name = "rustc/2017-01-16-netbsd-comp.tgz" 19 | sha256 = "e7d78a1eb98c31a6f76b35583611b265078017b6385585f9f2054d9ffa93eec6" 20 | legacy = true 21 | 22 | [[files]] 23 | name = "rustc/2017-03-17-netbsd-base.tgz" 24 | sha256 = "0190ce444401a409bc306f2f7901d18c335677ca62ee58c785b0747ebbcf694c" 25 | legacy = true 26 | skip-validation = true # duplicate hash 27 | 28 | [[files]] 29 | name = "rustc/2017-03-17-netbsd-comp.tgz" 30 | sha256 = "e7d78a1eb98c31a6f76b35583611b265078017b6385585f9f2054d9ffa93eec6" 31 | legacy = true 32 | 33 | [[files]] 34 | name = "rustc/2017-03-17-netbsd-gnusrc.tgz" 35 | sha256 = "91d59a01f256b3c7711617a60b88206b2f1ea317d570c4e767d993ae271fc885" 36 | legacy = true 37 | 38 | [[files]] 39 | name = "rustc/2017-03-17-netbsd-sharesrc.tgz" 40 | sha256 = "c99326ea0c036f68da50e967918c64f2d5c92b8e865935f6a30f596503a150c3" 41 | legacy = true 42 | 43 | [[files]] 44 | name = "rustc/2017-03-17-netbsd-src.tgz" 45 | sha256 = "75ea4d97c264e66e74cdb32cbb31748d13a202217997c6a0f1aaa3e1b5c535d3" 46 | legacy = true 47 | 48 | [[files]] 49 | name = "rustc/2017-03-17-netbsd-syssrc.tgz" 50 | sha256 = "5ccae35936a2c025c811c463b4fdfaf56e3d5b5612c068296fc68000f706732d" 51 | legacy = true 52 | 53 | [[files]] 54 | name = "rustc/2018-03-01-netbsd-base.tgz" 55 | sha256 = "bcd6c515792cdfad56d5dcf310bc7c59e13f10a59c3529635dfc845dfe5d83de" 56 | legacy = true 57 | 58 | [[files]] 59 | name = "rustc/2018-03-01-netbsd-comp.tgz" 60 | sha256 = "07eb16adcf48120619af9eae7232f4cabf4df7daaa05acd9d5bc0336c3a55645" 61 | legacy = true 62 | 63 | [[files]] 64 | name = "rustc/2018-03-01-netbsd-gnusrc.tgz" 65 | sha256 = "bcecea39ab684719765acd260f8f0bbbe1569082c1f2557fc86cb15dc7ff28c7" 66 | legacy = true 67 | 68 | [[files]] 69 | name = "rustc/2018-03-01-netbsd-sharesrc.tgz" 70 | sha256 = "cb9c280f42793a183a1b23e5b77cd0bfe6118dcb347077ee7633b65e56500eba" 71 | legacy = true 72 | 73 | [[files]] 74 | name = "rustc/2018-03-01-netbsd-src.tgz" 75 | sha256 = "bdc31de9a3880f780ea05b39daff6cc7e53d63ee8a7d43220514d3222e2cedee" 76 | legacy = true 77 | 78 | [[files]] 79 | name = "rustc/2018-03-01-netbsd-syssrc.tgz" 80 | sha256 = "c41d12346cfeb36265c51f1f78314748f5ffce4eeb31dcc0c9243ab61852cce1" 81 | legacy = true 82 | 83 | [[files]] 84 | name = "rustc/2025-03-14-netbsd-9.0-amd64-binary-base.tar.xz" 85 | sha256 = "d9f7dcf163f33f22fd7f839cbeb7021bbcacdf145763460be9ab85a68a3d6323" 86 | legacy = true 87 | 88 | [[files]] 89 | name = "rustc/2025-03-14-netbsd-9.0-amd64-binary-comp.tar.xz" 90 | sha256 = "501cb586f62d2aec2623a5568891ff9cea4c0a3a7fc6ec255d14109ffa338367" 91 | legacy = true 92 | 93 | [[files]] 94 | name = "rustc/2025-03-14-netbsd-9.0-src-gnusrc.tgz" 95 | sha256 = "d5136683f6ca024b064deee45d04742042ca133d74350c03bcf7950bb912668c" 96 | legacy = true 97 | 98 | [[files]] 99 | name = "rustc/2025-03-14-netbsd-9.0-src-sharesrc.tgz" 100 | sha256 = "d2f3363eb70c8ad1f90ae0997c4fa170259f57641213ffad1b6a9da3b5fca378" 101 | legacy = true 102 | 103 | [[files]] 104 | name = "rustc/2025-03-14-netbsd-9.0-src-src.tgz" 105 | sha256 = "b5df75211fc32c270f2eaa9c47ddcf447de4a2ae18a4e430a01707a1d7e02e85" 106 | legacy = true 107 | 108 | [[files]] 109 | name = "rustc/2025-03-14-netbsd-9.0-src-syssrc.tgz" 110 | sha256 = "2830afe4c607c7a6909430ca6cd3ca4d38de2388fd741c606d01be98a1c0d805" 111 | legacy = true 112 | 113 | [[files]] 114 | name = "rustc/2025-03-14-netbsd-9.0-src-xsrc.tgz" 115 | sha256 = "13822e98067ab3e4674b4f9ff42b55d2c95c91729075f5ff1777257ec6f1d231" 116 | legacy = true 117 | -------------------------------------------------------------------------------- /src/downloader.rs: -------------------------------------------------------------------------------- 1 | use crate::manifest::{MirrorFile, Source}; 2 | use crate::utils::to_hex; 3 | use anyhow::{Error, bail}; 4 | use futures::TryStreamExt as _; 5 | use reqwest::{Client, Url}; 6 | use sha2::{Digest as _, Sha256}; 7 | use std::path::PathBuf; 8 | use std::pin::Pin; 9 | use std::task::{Context, Poll}; 10 | use tempfile::TempDir; 11 | use tokio::fs::File; 12 | use tokio::io::{AsyncWrite, BufWriter}; 13 | use tokio_util::io::StreamReader; 14 | 15 | pub(crate) struct Downloader { 16 | storage: TempDir, 17 | http: Client, 18 | } 19 | 20 | impl Downloader { 21 | pub(crate) fn new() -> Result { 22 | Ok(Self { 23 | storage: TempDir::new()?, 24 | http: Client::builder() 25 | .user_agent("https://github.com/rust-lang/ci-mirrors") 26 | .build()?, 27 | }) 28 | } 29 | 30 | pub(crate) async fn download(&self, file: &MirrorFile) -> Result<(), Error> { 31 | let url = match &file.source { 32 | Source::Url(url) => url, 33 | Source::Legacy => bail!("cannot download legacy file {}", file.name), 34 | }; 35 | eprintln!("downloading {url}..."); 36 | 37 | let resp = self.http.get(url.clone()).send().await?; 38 | if !resp.status().is_success() { 39 | bail!( 40 | "failed to download with status {}: {url}\n=== body ===\n{}\n============\n", 41 | resp.status(), 42 | resp.text().await? 43 | ); 44 | } 45 | 46 | let mut reader = StreamReader::new(resp.bytes_stream().map_err(std::io::Error::other)); 47 | 48 | let dest = File::create(self.path_for(file)).await?; 49 | let mut writer = Sha256Writer::new(BufWriter::new(dest)); 50 | tokio::io::copy(&mut reader, &mut writer).await?; 51 | 52 | eprintln!(" -> success! the size is {}", format_size(writer.len)); 53 | 54 | let sha256 = to_hex(&writer.sha256); 55 | if sha256 != file.sha256 { 56 | bail!( 57 | "the hash of {} doesn't match (expected {}, downloaded {})", 58 | url, 59 | file.sha256, 60 | sha256 61 | ); 62 | } 63 | 64 | Ok(()) 65 | } 66 | 67 | pub(crate) async fn get_file_hash(&self, url: &Url) -> Result { 68 | let mut writer = Sha256Writer::new(tokio::io::sink()); 69 | eprintln!("downloading {url}..."); 70 | 71 | let mut reader = StreamReader::new( 72 | self.http 73 | .get(url.clone()) 74 | .send() 75 | .await? 76 | .error_for_status()? 77 | .bytes_stream() 78 | .map_err(std::io::Error::other), 79 | ); 80 | tokio::io::copy(&mut reader, &mut writer).await?; 81 | 82 | eprintln!(" -> success! the size is {}", format_size(writer.len)); 83 | Ok(writer.sha256) 84 | } 85 | 86 | pub(crate) fn path_for(&self, file: &MirrorFile) -> PathBuf { 87 | self.storage.path().join(&file.sha256) 88 | } 89 | } 90 | 91 | fn format_size(size: usize) -> String { 92 | let mut size = size as f64; 93 | for unit in ["bytes", "kB", "MB", "GB"] { 94 | if size / 1000.0 < 1.0 { 95 | return format!("{size:.2} {unit}"); 96 | } 97 | size /= 1000.0; 98 | } 99 | format!("{size:.2} TB") 100 | } 101 | 102 | pub struct Sha256Writer { 103 | sha256: Sha256, 104 | len: usize, 105 | writer: Pin>, 106 | } 107 | 108 | impl Sha256Writer { 109 | fn new(writer: W) -> Self { 110 | Self { 111 | sha256: Sha256::new(), 112 | len: 0, 113 | writer: Box::pin(writer), 114 | } 115 | } 116 | } 117 | 118 | impl AsyncWrite for Sha256Writer { 119 | fn poll_write( 120 | mut self: Pin<&mut Self>, 121 | cx: &mut Context<'_>, 122 | buf: &[u8], 123 | ) -> Poll> { 124 | use sha2::Digest; 125 | 126 | match self.writer.as_mut().poll_write(cx, buf) { 127 | Poll::Ready(Ok(written)) => { 128 | self.sha256.update(&buf[..written]); 129 | self.len += written; 130 | Poll::Ready(Ok(written)) 131 | } 132 | other => other, 133 | } 134 | } 135 | 136 | fn poll_flush( 137 | mut self: Pin<&mut Self>, 138 | cx: &mut Context<'_>, 139 | ) -> Poll> { 140 | self.writer.as_mut().poll_flush(cx) 141 | } 142 | 143 | fn poll_shutdown( 144 | mut self: Pin<&mut Self>, 145 | cx: &mut Context<'_>, 146 | ) -> Poll> { 147 | self.writer.as_mut().poll_shutdown(cx) 148 | } 149 | } 150 | -------------------------------------------------------------------------------- /files/rustc/llvm.toml: -------------------------------------------------------------------------------- 1 | [[files]] 2 | name = "rustc/LLVM-10.0.0-win64.exe" 3 | sha256 = "893f8a12506f8ad29ca464d868fb432fdadd782786a10655b86575fc7fc1a562" 4 | legacy = true 5 | 6 | [[files]] 7 | name = "rustc/LLVM-10.0.0-win64.tar.gz" 8 | sha256 = "469215a8acb5f64fab155f406fbcaa1530aaa997d3198a012212fac2f545d2f3" 9 | legacy = true 10 | 11 | [[files]] 12 | name = "rustc/LLVM-12.0.0-win64.exe" 13 | sha256 = "8426d57f2af2bf07f80014bfd359e87ed10f5521a236a10cfe9fc4870d1b1b25" 14 | legacy = true 15 | 16 | [[files]] 17 | name = "rustc/LLVM-14.0.2-win64.exe" 18 | sha256 = "b3e32ef8e10d8ba3259cc9da65639d3604e430bb38016702cb94f84370060e01" 19 | legacy = true 20 | 21 | [[files]] 22 | name = "rustc/LLVM-14.0.5-win64.exe" 23 | sha256 = "7b3f8f9255eb36422fadefc2828e33b55f7cda0270860defe196cb24fd06abfe" 24 | legacy = true 25 | 26 | [[files]] 27 | name = "rustc/LLVM-18.1.4-win64.exe" 28 | sha256 = "78d8f528a132e131b978e6b3276aa45af759a068a25c006240f59ab28df5f621" 29 | legacy = true 30 | 31 | [[files]] 32 | name = "rustc/LLVM-6.0.0-win64.exe" 33 | sha256 = "2501887b2f638d3f65b0336f354b96f8108b563522d81e841d5c88c34af283dd" 34 | legacy = true 35 | 36 | [[files]] 37 | name = "rustc/LLVM-7.0.0-win64.exe" 38 | sha256 = "74b197a3959b0408adf0824be01db8dddfa2f9a967f4085af3fad900ed5fdbf6" 39 | legacy = true 40 | 41 | [[files]] 42 | name = "rustc/LLVM-7.0.0-win64.tar.gz" 43 | sha256 = "5a08e164609213ea914acbd334e5d35abc869f8853f12942b2e3940b896f1045" 44 | legacy = true 45 | 46 | [[files]] 47 | name = "rustc/LLVM-8.0.0-win64.exe" 48 | sha256 = "56d582eed2d5def6accaedabbe11ae368186600798e2a6a7eb86a727fa7bb20c" 49 | legacy = true 50 | 51 | [[files]] 52 | name = "rustc/LLVM-9.0.0-win64.tar.gz" 53 | sha256 = "7b161fa80bf86908a6d77b72873dce46d215a41c9aa3e6539aa143b5ccfa003b" 54 | legacy = true 55 | 56 | [[files]] 57 | name = "rustc/clang+llvm-10.0.0-x86_64-apple-darwin.tar.xz" 58 | sha256 = "633a833396bf2276094c126b072d52b59aca6249e7ce8eae14c728016edb5e61" 59 | legacy = true 60 | 61 | [[files]] 62 | name = "rustc/clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz" 63 | sha256 = "b25f592a0c00686f03e3b7db68ca6dc87418f681f4ead4df4745a01d9be63843" 64 | legacy = true 65 | 66 | [[files]] 67 | name = "rustc/clang+llvm-12.0.0-x86_64-apple-darwin.tar.xz" 68 | sha256 = "7bc2259bf75c003f644882460fc8e844ddb23b27236fe43a2787870a4cd8ab50" 69 | legacy = true 70 | 71 | [[files]] 72 | name = "rustc/clang+llvm-14.0.2-x86_64-apple-darwin.tar.xz" 73 | sha256 = "7037efca192eb04a569a7422bd5d974a0af315b979252b6d956d2657ac33d672" 74 | legacy = true 75 | 76 | [[files]] 77 | name = "rustc/clang+llvm-14.0.5-x86_64-apple-darwin.tar.xz" 78 | sha256 = "66cf1b8e00289a567b2f5f740f068b7682e27ccf048647b836d3624376a64705" 79 | legacy = true 80 | 81 | [[files]] 82 | name = "rustc/clang+llvm-15.0.7-x86_64-apple-darwin21.0.tar.xz" 83 | sha256 = "d16b6d536364c5bec6583d12dd7e6cf841b9f508c4430d9ee886726bd9983f1c" 84 | legacy = true 85 | 86 | [[files]] 87 | name = "rustc/clang+llvm-7.0.0-x86_64-apple-darwin.tar.xz" 88 | sha256 = "b3ad93c3d69dfd528df9c5bb1a434367babb8f3baea47fbb99bf49f1b03c94ca" 89 | legacy = true 90 | 91 | [[files]] 92 | name = "rustc/clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-14.04.tar.xz" 93 | sha256 = "9ef854b71949f825362a119bf2597f744836cb571131ae6b721cd102ffea8cd0" 94 | legacy = true 95 | 96 | [[files]] 97 | name = "rustc/clang+llvm-9.0.0-x86_64-darwin-apple.tar.xz" 98 | sha256 = "b46e3fe3829d4eb30ad72993bf28c76b1e1f7e38509fbd44192a2ef7c0126fc7" 99 | legacy = true 100 | 101 | [[files]] 102 | name = "rustc/clang+llvm-9.0.0-x86_64-linux-gnu-ubuntu-14.04.tar.xz" 103 | sha256 = "bea706c8f6992497d08488f44e77b8f0f87f5b275295b974aa8b194efba18cb8" 104 | legacy = true 105 | 106 | [[files]] 107 | name = "rustc/2021-01-14-clang+llvm-11.0.1-x86_64-linux-gnu-ubuntu-16.04.tar.xz" 108 | sha256 = "67f18660231d7dd09dc93502f712613247b7b4395e6f48c11226629b250b53c5" 109 | legacy = true 110 | 111 | [[files]] 112 | name = "rustc/2022-05-10-clang+llvm-14.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz" 113 | sha256 = "61582215dafafb7b576ea30cc136be92c877ba1f1c31ddbbd372d6d65622fef5" 114 | legacy = true 115 | 116 | [[files]] 117 | name = "rustc/2022-12-06-clang+llvm-15.0.6-x86_64-linux-gnu-ubuntu-18.04.tar.xz" 118 | sha256 = "38bc7f5563642e73e69ac5626724e206d6d539fbef653541b34cae0ba9c3f036" 119 | legacy = true 120 | 121 | [[files]] 122 | name = "rustc/2023-05-17-clang+llvm-16.0.4-x86_64-linux-gnu-ubuntu-22.04.tar.xz" 123 | sha256 = "fd464333bd55b482eb7385f2f4e18248eb43129a3cda4c0920ad9ac3c12bdacf" 124 | legacy = true 125 | 126 | [[files]] 127 | name = "rustc/LLVM-20.1.3-win64.exe" 128 | source = "https://github.com/llvm/llvm-project/releases/download/llvmorg-20.1.3/LLVM-20.1.3-win64.exe" 129 | sha256 = "a018ea761147a7de69d6dd60ef81b74096e5255aec6caff22d45da85188614af" 130 | license = "Apache License v2.0 with LLVM Exceptions" 131 | 132 | [[files]] 133 | name = "rustc/LLVM-20.1.3-woa64.exe" 134 | source = "https://github.com/llvm/llvm-project/releases/download/llvmorg-20.1.3/LLVM-20.1.3-woa64.exe" 135 | sha256 = "cadc1d94e170d37300b077c0d071f39ef6b02a8415322be0891031da00a2ea29" 136 | license = "Apache License v2.0 with LLVM Exceptions" 137 | -------------------------------------------------------------------------------- /files/rustc/mingw.toml: -------------------------------------------------------------------------------- 1 | 2 | [[files]] 3 | name = "rustc/x86_64-12.2.0-release-posix-seh-rt_v10-rev0.7z" 4 | sha256 = "17fcd3ec733108788428ff551c83d54b2f80b426b7d40292d3f581895b9e1038" 5 | legacy = true 6 | 7 | [[files]] 8 | name = "rustc/x86_64-14.1.0-release-posix-seh-msvcrt-rt_v12-rev0.7z" 9 | sha256 = "bc0de4321141730e83fd2457b1f7639946cc66787bf98ba9b03770d06d414df1" 10 | legacy = true 11 | 12 | [[files]] 13 | name = "rustc/x86_64-4.9.2-release-win32-seh-rt_v4-rev4.7z" 14 | sha256 = "0fe055365d51619c8905187e9564cb7e1d41ec0ba6976e3a39b6b836f5bdd2df" 15 | legacy = true 16 | 17 | [[files]] 18 | name = "rustc/x86_64-6.2.0-release-posix-seh-rt_v5-rev1.7z" 19 | sha256 = "2d3269dd14689c9a55ae2d8ab50c834dd411eae0ebc9a74515b8eedbb1b98486" 20 | legacy = true 21 | 22 | [[files]] 23 | name = "rustc/x86_64-6.2.0-release-win32-seh-rt_v5-rev1.7z" 24 | sha256 = "5dc4b62038f5062f7239c99ab7b7d51a40cb6e482944fdaaf4e16d235492f9f4" 25 | legacy = true 26 | 27 | [[files]] 28 | name = "rustc/x86_64-6.3.0-release-posix-seh-rt_v5-rev2.7z" 29 | sha256 = "e93c3eeeb410ead1ab04898693fe691f69a930d397455de86313260c0ad1eaf0" 30 | legacy = true 31 | 32 | [[files]] 33 | name = "rustc/x86_64-6.3.0-release-posix-seh-rt_v5-rev2.tar.gz" 34 | sha256 = "8a784616cbf103e80f988825236c1f1d675cf55fa24ec0992c2fadb5db48e39f" 35 | legacy = true 36 | 37 | [[files]] 38 | name = "rustc/x86_64-6.3.0-release-posix-seh-rt_v5-rev2.zip" 39 | sha256 = "30d9c16639994f6a79b547cd55aa5edb1baac09e2a690ce441d5379db2b7472c" 40 | legacy = true 41 | 42 | [[files]] 43 | name = "rustc/x86_64-6.3.0-release-win32-seh-rt_v5-rev1.7z" 44 | sha256 = "9b416b02503979d43436837a5a8a2c80ad77d01f8fc98ab242059355a7b0a2d2" 45 | legacy = true 46 | 47 | [[files]] 48 | name = "rustc/x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z" 49 | sha256 = "853970527b5de4a55ec8ca4d3fd732c00ae1c69974cc930c82604396d43e79f8" 50 | legacy = true 51 | 52 | [[files]] 53 | name = "rustc/i686-12.2.0-release-posix-dwarf-rt_v10-rev0.7z" 54 | sha256 = "057ea5fdb9a5a2928e0a5d0595d08fe2835de4f3e3951d59c7e2221cfd84f58e" 55 | legacy = true 56 | 57 | [[files]] 58 | name = "rustc/i686-14.1.0-release-posix-dwarf-msvcrt-rt_v12-rev0.7z" 59 | sha256 = "e4f2aed5eba0c47b72d37fb3e2328784a0f4b2f6207b0783ad8c231c0b3cac22" 60 | legacy = true 61 | 62 | [[files]] 63 | name = "rustc/i686-4.9.2-release-win32-dwarf-rt_v4-rev4.7z" 64 | sha256 = "cc11b95f873ad77deceac3079193534030d0023d6100566c9d6ee6ddfa1241a0" 65 | legacy = true 66 | 67 | [[files]] 68 | name = "rustc/i686-6.2.0-release-posix-dwarf-rt_v5-rev1.7z" 69 | sha256 = "e1caa88a4a2d2e4adee67c9acd24d06d7d01a596bcca2a5b61e63b75ebb88b81" 70 | legacy = true 71 | 72 | [[files]] 73 | name = "rustc/i686-6.2.0-release-win32-dwarf-rt_v5-rev1.7z" 74 | sha256 = "330184c3d0976f48ea264fbbf7ede5beb204d4c96deb9458a5406cad9aaf1139" 75 | legacy = true 76 | 77 | [[files]] 78 | name = "rustc/i686-6.3.0-release-posix-dwarf-rt_v5-rev2.7z" 79 | sha256 = "55c529c0c0860d1c48acdaa32b141ced83437bfbadaa576310d1f60003698e45" 80 | legacy = true 81 | 82 | [[files]] 83 | name = "rustc/i686-6.3.0-release-posix-dwarf-rt_v5-rev2.tar.gz" 84 | sha256 = "16e43cb9326156b5872315f5d733d620789832c89afcbcde672d6787e053c503" 85 | legacy = true 86 | 87 | [[files]] 88 | name = "rustc/i686-6.3.0-release-posix-dwarf-rt_v5-rev2.zip" 89 | sha256 = "a0e544c3c60297a7879f4a93cd3aa1ec191823d8387d6df78cacc73458fa8cb4" 90 | legacy = true 91 | 92 | [[files]] 93 | name = "rustc/i686-6.3.0-release-win32-dwarf-rt_v5-rev1.7z" 94 | sha256 = "4ce8b4e2d97291bd2231babd30553e5d5c7971b70586245156bb47fd92e7a6f2" 95 | legacy = true 96 | 97 | [[files]] 98 | name = "rustc/i686-8.1.0-release-posix-dwarf-rt_v6-rev0.7z" 99 | sha256 = "adb84b70094c0225dd30187ff995e311d19424b1eb8f60934c60e4903297f946" 100 | legacy = true 101 | 102 | [[files]] 103 | name = "rustc/msys2-repo/mingw/i686/mingw-w64-i686-ca-certificates-20180409-1-any.pkg.tar.xz" 104 | sha256 = "f4bc34f1b07bff014cc8fecb2c32b892f39b9dd0d3daf850337a0d07dec63269" 105 | legacy = true 106 | 107 | [[files]] 108 | name = "rustc/msys2-repo/mingw/i686/mingw-w64-i686-ca-certificates-20180409-1-any.pkg.tar.xz.sig" 109 | sha256 = "3c362f057ee1c4a0e30a84bcf8a24a98a084c284b3992f91e7626df77aadf7f5" 110 | legacy = true 111 | 112 | [[files]] 113 | name = "rustc/msys2-repo/mingw/x86_64/mingw-w64-x86_64-ca-certificates-20180409-1-any.pkg.tar.xz" 114 | sha256 = "f2a35875ca5d36aa6be084a3f2273d91ac269e018689b8029b52e40cf5e341a6" 115 | legacy = true 116 | 117 | [[files]] 118 | name = "rustc/msys2-repo/mingw/x86_64/mingw-w64-x86_64-ca-certificates-20180409-1-any.pkg.tar.xz.sig" 119 | sha256 = "409575572cd67fef9f32af8943a85dba1743310768ccf1c1a9e2232dc1fd96a0" 120 | legacy = true 121 | 122 | [[files]] 123 | name = "rustc/msys2-repo/msys/x86_64/libzstd-1.4.4-2-x86_64.pkg.tar.xz" 124 | sha256 = "9167d228d293665ad13a17b990cd75a2664f7d39322ca0e86a98a5357240fd71" 125 | legacy = true 126 | 127 | [[files]] 128 | name = "rustc/msys2-repo/msys/x86_64/pacman-5.2.1-6-x86_64.pkg.tar.xz" 129 | sha256 = "0a3fb9db3f066b29571d2542c28b031db2b310f58d55617848e0ee9c53db4da3" 130 | legacy = true 131 | 132 | [[files]] 133 | name = "rustc/msys2-repo/msys/x86_64/zstd-1.4.4-2-x86_64.pkg.tar.xz" 134 | sha256 = "b7cbd3bf4cc1992d413bc220bf06e29ad36f042ed14c144c761de036174c1445" 135 | legacy = true 136 | -------------------------------------------------------------------------------- /src/storage.rs: -------------------------------------------------------------------------------- 1 | use anyhow::{Error, bail}; 2 | use aws_sdk_s3::error::SdkError; 3 | use aws_sdk_s3::operation::get_object::GetObjectError; 4 | use aws_sdk_s3::operation::head_object::HeadObjectError; 5 | use aws_sdk_s3::primitives::ByteStream; 6 | use reqwest::StatusCode; 7 | use std::path::Path; 8 | 9 | pub(crate) enum Storage { 10 | ReadOnly(CdnReader), 11 | ReadWrite(S3Storage), 12 | } 13 | 14 | impl Storage { 15 | pub(crate) async fn file_status(&self, path: &str) -> Result { 16 | if let Some(hash) = self.get_file(&format!("{path}.sha256")).await? { 17 | Ok(FileStatus::Present { 18 | sha256: hash.trim().to_string(), 19 | }) 20 | } else if self.file_exists(path).await? { 21 | Ok(FileStatus::Legacy) 22 | } else { 23 | Ok(FileStatus::Missing) 24 | } 25 | } 26 | 27 | pub(crate) async fn upload_file(&self, path: &str, file: &Path) -> Result<(), Error> { 28 | match self { 29 | Storage::ReadOnly(_) => panic!("unsupported in read-only mode"), 30 | Storage::ReadWrite(s3) => { 31 | s3.put_object(path, ByteStream::from_path(file).await?) 32 | .await 33 | } 34 | } 35 | } 36 | 37 | pub(crate) async fn write_contents(&self, path: &str, content: &[u8]) -> Result<(), Error> { 38 | match self { 39 | Storage::ReadOnly(_) => panic!("unsupported in read-only mode"), 40 | Storage::ReadWrite(s3) => { 41 | s3.put_object(path, ByteStream::from(content.to_vec())) 42 | .await 43 | } 44 | } 45 | } 46 | 47 | async fn get_file(&self, path: &str) -> Result, Error> { 48 | match self { 49 | Storage::ReadOnly(storage) => { 50 | let url = format!("{}/{}", storage.cdn_url, path.replace("+", "%2B")); 51 | let response = storage.http.get(&url).send().await?; 52 | match response.status() { 53 | StatusCode::OK => Ok(Some(response.text().await?)), 54 | StatusCode::NOT_FOUND | StatusCode::FORBIDDEN => Ok(None), 55 | status => bail!("unexpected status {status} when requesting {url}"), 56 | } 57 | } 58 | Storage::ReadWrite(storage) => { 59 | let response = storage 60 | .s3 61 | .get_object() 62 | .bucket(&storage.s3_bucket) 63 | .key(path) 64 | .send() 65 | .await; 66 | match response { 67 | Ok(success) => Ok(Some(String::from_utf8( 68 | success.body.collect().await?.to_vec(), 69 | )?)), 70 | Err(error) => { 71 | if let SdkError::ServiceError(service) = &error { 72 | if let GetObjectError::NoSuchKey(_) = service.err() { 73 | return Ok(None); 74 | } 75 | } 76 | Err(error.into()) 77 | } 78 | } 79 | } 80 | } 81 | } 82 | 83 | async fn file_exists(&self, path: &str) -> Result { 84 | match self { 85 | Storage::ReadOnly(storage) => { 86 | let url = format!("{}/{path}", storage.cdn_url); 87 | let response = storage.http.head(&url).send().await?; 88 | match response.status() { 89 | StatusCode::OK => Ok(true), 90 | StatusCode::NOT_FOUND | StatusCode::FORBIDDEN => Ok(false), 91 | status => bail!("unexpected status {status} when requesting {url}"), 92 | } 93 | } 94 | Storage::ReadWrite(storage) => { 95 | let response = storage 96 | .s3 97 | .head_object() 98 | .bucket(&storage.s3_bucket) 99 | .key(path) 100 | .send() 101 | .await; 102 | match response { 103 | Ok(_) => Ok(true), 104 | Err(error) => { 105 | if let SdkError::ServiceError(service) = &error { 106 | if let HeadObjectError::NotFound(_) = service.err() { 107 | return Ok(false); 108 | } 109 | } 110 | Err(error.into()) 111 | } 112 | } 113 | } 114 | } 115 | } 116 | } 117 | 118 | pub(crate) struct CdnReader { 119 | http: reqwest::Client, 120 | cdn_url: String, 121 | } 122 | 123 | impl CdnReader { 124 | pub(crate) fn new(cdn_url: String) -> Self { 125 | Self { 126 | http: reqwest::Client::new(), 127 | cdn_url, 128 | } 129 | } 130 | } 131 | 132 | pub(crate) struct S3Storage { 133 | s3: aws_sdk_s3::Client, 134 | s3_bucket: String, 135 | } 136 | 137 | impl S3Storage { 138 | pub(crate) async fn new(s3_bucket: String) -> Result { 139 | let config = aws_config::load_from_env().await; 140 | Ok(S3Storage { 141 | s3: aws_sdk_s3::Client::new(&config), 142 | s3_bucket, 143 | }) 144 | } 145 | 146 | async fn put_object(&self, key: &str, body: ByteStream) -> Result<(), Error> { 147 | self.s3 148 | .put_object() 149 | .bucket(&self.s3_bucket) 150 | .key(key) 151 | .body(body) 152 | // Prevent overriding an existing file. Note that the IAM policy used to upload 153 | // objects in CI *enforces* the present of this line. If you remove it without 154 | // first changing the policy, the request will fail. 155 | .if_none_match("*") 156 | .send() 157 | .await?; 158 | Ok(()) 159 | } 160 | } 161 | 162 | pub(crate) enum FileStatus { 163 | Missing, 164 | Legacy, 165 | Present { sha256: String }, 166 | } 167 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use crate::downloader::Downloader; 2 | use crate::manifest::{ManifestFileManaged, load_manifests}; 3 | use crate::storage::{CdnReader, FileStatus, S3Storage, Storage}; 4 | use crate::utils::to_hex; 5 | use anyhow::Error; 6 | use clap::Parser; 7 | use reqwest::Url; 8 | use std::fs::OpenOptions; 9 | use std::path::PathBuf; 10 | use std::sync::Arc; 11 | use tokio::sync::Semaphore; 12 | use tokio::task::JoinSet; 13 | 14 | mod downloader; 15 | mod manifest; 16 | mod storage; 17 | mod utils; 18 | 19 | /// Manage mirrored files on rust-lang CDN. 20 | #[derive(Debug, Parser)] 21 | enum Cli { 22 | /// Upload files to the CDN and check that the local files are consistent. 23 | Upload(UploadArgs), 24 | /// Add a new mirrored file entry. 25 | AddFile(AddFileArgs), 26 | } 27 | 28 | #[derive(Debug, Parser)] 29 | struct UploadArgs { 30 | /// Path to the manifest to synchronize. 31 | #[arg(default_value = "files/")] 32 | manifests_dir: PathBuf, 33 | 34 | /// Only check which changes are needed (no credentials required). 35 | #[arg(long)] 36 | skip_upload: bool, 37 | 38 | /// Base URL of the CDN where mirrored files are served. 39 | #[arg(long, default_value = "https://ci-mirrors.rust-lang.org")] 40 | cdn_url: String, 41 | 42 | /// Name of the S3 bucket containing the files. 43 | #[arg(long, default_value = "rust-lang-ci-mirrors")] 44 | s3_bucket: String, 45 | 46 | #[arg(short, long, default_value = "100")] 47 | jobs: usize, 48 | } 49 | 50 | #[derive(Debug, Parser)] 51 | struct AddFileArgs { 52 | /// URL that should be mirrored. 53 | url: Url, 54 | /// Path under which the file should be available on the CDN. 55 | #[arg(long)] 56 | path: String, 57 | /// TOML file into which should the mirrored entry be added. 58 | #[arg(long)] 59 | toml_file: PathBuf, 60 | /// License of the file. 61 | #[arg(long)] 62 | license: Option, 63 | } 64 | 65 | #[tokio::main] 66 | async fn main() -> Result<(), Error> { 67 | let args = Cli::parse(); 68 | match args { 69 | Cli::Upload(args) => { 70 | upload(args).await?; 71 | } 72 | Cli::AddFile(args) => { 73 | add_file(args).await?; 74 | } 75 | } 76 | 77 | Ok(()) 78 | } 79 | 80 | async fn upload(args: UploadArgs) -> anyhow::Result<()> { 81 | let (files, mut errors) = load_manifests(&args.manifests_dir)?; 82 | 83 | let storage = Arc::new(if args.skip_upload { 84 | Storage::ReadOnly(CdnReader::new(args.cdn_url)) 85 | } else { 86 | Storage::ReadWrite(S3Storage::new(args.s3_bucket).await?) 87 | }); 88 | 89 | // Collect all errors that happen during the check phase and show them at the end. This way, if 90 | // there are multiple errors in CI users won't have to retry the build multiple times. 91 | eprintln!( 92 | "calculating the changes to execute ({} files, {} parallelism)...", 93 | files.len(), 94 | args.jobs 95 | ); 96 | 97 | // Check the status of all files in parallel. 98 | let concurrency_limiter = Arc::new(Semaphore::new(args.jobs)); 99 | let mut taskset = JoinSet::new(); 100 | for file in files { 101 | let storage = storage.clone(); 102 | let concurrency_limiter = concurrency_limiter.clone(); 103 | taskset.spawn(async move { 104 | let _permit = concurrency_limiter.acquire().await.unwrap(); 105 | let status = storage.file_status(&file.name).await; 106 | (file, status) 107 | }); 108 | } 109 | 110 | let mut to_upload = Vec::new(); 111 | for (file, status) in taskset.join_all().await { 112 | let name = &file.name; 113 | match status? { 114 | FileStatus::Legacy => errors.push(format!( 115 | "file {name} was already uploaded without this tool" 116 | )), 117 | FileStatus::Present { sha256 } if sha256 != file.sha256 => errors.push(format!( 118 | "file {name} was already uploaded with different content" 119 | )), 120 | FileStatus::Missing => to_upload.push(file), 121 | FileStatus::Present { .. } => {} 122 | } 123 | } 124 | 125 | // We download eagerly to be able to detect errors during the check phase. 126 | let downloader = Downloader::new()?; 127 | for file in &to_upload { 128 | if let Err(err) = downloader.download(file).await { 129 | errors.push(format!("{err:?}")); 130 | } 131 | } 132 | 133 | if !errors.is_empty() { 134 | eprintln!("Found {} error(s)", errors.len()); 135 | for error in errors { 136 | eprintln!("error: {error}"); 137 | } 138 | std::process::exit(1); 139 | } else if to_upload.is_empty() { 140 | eprintln!("everything is up to date!"); 141 | return Ok(()); 142 | } else if args.skip_upload { 143 | eprintln!("skipping upload due to --skip-upload"); 144 | return Ok(()); 145 | } 146 | 147 | for file in &to_upload { 148 | eprintln!("uploading {}...", file.name); 149 | storage 150 | .upload_file(&file.name, &downloader.path_for(file)) 151 | .await?; 152 | storage 153 | .write_contents(&format!("{}.sha256", &file.name), file.sha256.as_bytes()) 154 | .await?; 155 | } 156 | Ok(()) 157 | } 158 | 159 | async fn add_file(args: AddFileArgs) -> anyhow::Result<()> { 160 | use std::io::Write; 161 | 162 | let hash = Downloader::new()?.get_file_hash(&args.url).await?; 163 | 164 | let file_existed = args.toml_file.is_file(); 165 | let mut file = OpenOptions::new() 166 | .create(true) 167 | .append(true) 168 | .open(&args.toml_file)?; 169 | 170 | let rename_from = if let Some(file_name) = args.url.path().split('/').last() 171 | && let Some(path_name) = args.path.split('/').last() 172 | && file_name != path_name 173 | { 174 | Some(file_name.to_string()) 175 | } else { 176 | None 177 | }; 178 | 179 | let entry = ManifestFileManaged::new( 180 | args.path, 181 | to_hex(&hash), 182 | args.url, 183 | args.license.unwrap_or(String::new()), 184 | rename_from, 185 | ); 186 | let entry = toml::to_string(&entry)?; 187 | 188 | let space = if file_existed { "\n" } else { "" }; 189 | write!( 190 | file, 191 | r#"{space}[[files]] 192 | {entry}"#, 193 | )?; 194 | 195 | Ok(()) 196 | } 197 | -------------------------------------------------------------------------------- /files/rustc/misc.toml: -------------------------------------------------------------------------------- 1 | [[files]] 2 | name = "rustc/2017-03-17-stamp-x86_64-apple-darwin" 3 | sha256 = "26ed2959e10dc9eb6668722a99f0cfaf968d1a36a25abbbd699a33d317598846" 4 | legacy = true 5 | 6 | [[files]] 7 | name = "rustc/2017-03-17-stamp-x86_64-pc-windows-msvc" 8 | sha256 = "b38ffb6cfc7fc328bfc1b5614505f7a5115021b09e2a919de2f35b3428fa7faf" 9 | legacy = true 10 | 11 | [[files]] 12 | name = "rustc/2017-03-17-stamp-x86_64-unknown-linux-musl" 13 | sha256 = "e8365317a8a1d9d4a5ecc4576875cd1a220abc41a50016fa25bbaff361b4861a" 14 | legacy = true 15 | 16 | [[files]] 17 | name = "rustc/2017-04-20-32bit-gdborig.exe" 18 | sha256 = "5dcef090a55b956a54ee16aa1068355b471378f6b89385bacc47c31317d14ecc" 19 | legacy = true 20 | 21 | [[files]] 22 | name = "rustc/2017-04-20-64bit-gdborig.exe" 23 | sha256 = "74c28e3b30e7c70a4492c902377cf30e3b4f32d3e2a395111f6fb21177189494" 24 | legacy = true 25 | 26 | [[files]] 27 | name = "rustc/2017-05-15-Handle.zip" 28 | sha256 = "c3fd53b8cc363e466bcc5fc853a4a3c60ffd0230e322923a33a915feb0464214" 29 | legacy = true 30 | 31 | [[files]] 32 | name = "rustc/2017-07-11-sysroot-mips.tar.xz" 33 | sha256 = "0840b22b9443357e42f499ca093153e051a4267e41ca52c8a1c1335a0f3b2f02" 34 | legacy = true 35 | 36 | [[files]] 37 | name = "rustc/2017-07-11-sysroot-mipsel.tar.xz" 38 | sha256 = "9ce920263497fd76420df6fb0e004770acd0ec5bc69be0a3a8037d7491decc8c" 39 | legacy = true 40 | 41 | [[files]] 42 | name = "rustc/2017-08-22-is.exe" 43 | sha256 = "0432d5d91f769fa39ede83f425458f4f03b03209d650c302c5bf134023431b44" 44 | legacy = true 45 | 46 | [[files]] 47 | name = "rustc/2019-07-27-awscli.tar" 48 | sha256 = "537327eb34c2a495ed2c8b8a03aa926bf4ae61ce062476cdadb199d2c25d6103" 49 | legacy = true 50 | 51 | [[files]] 52 | name = "rustc/2022-11-27-relibc-install.tar.gz" 53 | sha256 = "891bfb0a0627c209c689180c6ec79f774284dc622f6d432d8b6a5c3c9f891d0b" 54 | legacy = true 55 | 56 | [[files]] 57 | name = "rustc/2023-04-28-awscli.tar" 58 | sha256 = "55d142c0295b285ccbe0bc11d02373363311edf681ffb8dcc7abf77674c1da6e" 59 | legacy = true 60 | 61 | [[files]] 62 | name = "rustc/OpenWrt-Toolchain-ar71xx-generic_gcc-5.3.0_musl-1.1.16.Linux-x86_64.tar.bz2" 63 | sha256 = "e71db90cc8c269f2331c5662d6c83026f21df5023a85f0c804d7d02bafd14d8b" 64 | legacy = true 65 | 66 | [[files]] 67 | name = "rustc/OpenWrt-Toolchain-malta-le_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2" 68 | sha256 = "ad41df333c059e552171b9ece2efbc177e9da389062a564b1883b6f60ca329fd" 69 | legacy = true 70 | skip-validation = true # duplicate hash 71 | 72 | [[files]] 73 | name = "rustc/cmake-3.11.1-win64-x64.zip" 74 | sha256 = "ed23c3d22e164fae7300c82db3e72eac4648e016eabdeace1bd573a9a6ecd218" 75 | legacy = true 76 | 77 | [[files]] 78 | name = "rustc/crosstool-ng-1.24.0.tar.gz" 79 | sha256 = "36c0067a2da265aa88f8d91c1647d152c98a100b8e2ce416cf47dedf08c069e9" 80 | legacy = true 81 | 82 | [[files]] 83 | name = "rustc/curl-7.66.0.tar.xz" 84 | sha256 = "dbb48088193016d079b97c5c3efde8efa56ada2ebf336e8a97d04eb8e2ed98c1" 85 | legacy = true 86 | 87 | [[files]] 88 | name = "rustc/gcc/gettext-0.22.tar.gz" 89 | sha256 = "49f089be11b490170bbf09ed2f51e5f5177f55be4cc66504a5861820e0fb06ab" 90 | legacy = true 91 | 92 | [[files]] 93 | name = "rustc/gcc/gmp-6.2.1.tar.bz2" 94 | sha256 = "eae9326beb4158c386e39a356818031bd28f3124cf915f8c5b1dc4c7a36b4d7c" 95 | legacy = true 96 | 97 | [[files]] 98 | name = "rustc/gcc/isl-0.24.tar.bz2" 99 | sha256 = "fcf78dd9656c10eb8cf9fbd5f59a0b6b01386205fe1934b3b287a0a1898145c0" 100 | legacy = true 101 | 102 | [[files]] 103 | name = "rustc/gcc/mpc-1.2.1.tar.gz" 104 | sha256 = "17503d2c395dfcf106b622dc142683c1199431d095367c6aacba6eec30340459" 105 | legacy = true 106 | 107 | [[files]] 108 | name = "rustc/gcc/mpfr-4.1.0.tar.bz2" 109 | sha256 = "feced2d430dd5a97805fa289fed3fc8ff2b094c02d05287fd6133e7f1f0ec926" 110 | legacy = true 111 | 112 | [[files]] 113 | name = "rustc/glibc-2.17-157-2020-11-25.el7.ppc64le.rpm" 114 | sha256 = "95677b9274777e78dacc7477f775a5aa6eaa8bb73076a7fb9b56282b7f5205c4" 115 | legacy = true 116 | 117 | [[files]] 118 | name = "rustc/glibc-devel-2.17-157-2020-11-25.el7.ppc64le.rpm" 119 | sha256 = "1b7c984235e369eeb3d9d5b6c390ca5713ab0a9f9e0182b4fef41a17050a541c" 120 | legacy = true 121 | 122 | [[files]] 123 | name = "rustc/glibc-headers-2.17-157-2020-11-25.el7.ppc64le.rpm" 124 | sha256 = "394881fdbf4f42c02e5758dbd8b5e8851104696f99aae5b17e012b0a257af15c" 125 | legacy = true 126 | 127 | [[files]] 128 | name = "rustc/isl-0.14.tar.xz" 129 | sha256 = "b1044f02819da0708fc7071fa2a558ce5d3c29d6676c8cb113caaedd5903ff03" 130 | legacy = true 131 | 132 | [[files]] 133 | name = "rustc/isl-0.20.tar.xz" 134 | sha256 = "a5596a9fb8a5b365cb612e4b9628735d6e67e9178fae134a816ae195017e77aa" 135 | legacy = true 136 | 137 | [[files]] 138 | name = "rustc/isl-0.24.tar.bz2" 139 | sha256 = "fcf78dd9656c10eb8cf9fbd5f59a0b6b01386205fe1934b3b287a0a1898145c0" 140 | legacy = true 141 | 142 | [[files]] 143 | name = "rustc/isl-0.26.tar.bz2" 144 | sha256 = "5eac8664e9d67be6bd0bee5085d6840b8baf738c06814df47eaf4166d9776436" 145 | legacy = true 146 | 147 | [[files]] 148 | name = "rustc/kernel-headers-3.10.0-514-2020-11-25.el7.ppc64le.rpm" 149 | sha256 = "3ab4a39e7d33c02080765342c4544f57153d5b045aa9e0afdb3bfa40eab3a663" 150 | legacy = true 151 | 152 | [[files]] 153 | name = "rustc/msp430-gcc-6.4.0.32_linux64.tar.bz2" 154 | sha256 = "86dbe86cf0d0a2146c493055d6b80ce768618f3f7a437541714ab676a528b66a" 155 | legacy = true 156 | 157 | [[files]] 158 | name = "rustc/openssl-1.0.2k.tar.gz" 159 | sha256 = "6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" 160 | legacy = true 161 | 162 | [[files]] 163 | name = "rustc/openssl-1.0.2m.tar.gz" 164 | sha256 = "8c6ff15ec6b319b50788f42c7abc2890c08ba5a1cdcd3810eb9092deada37b0f" 165 | legacy = true 166 | 167 | [[files]] 168 | name = "rustc/openssl-1.0.2n.tar.gz" 169 | sha256 = "370babb75f278c39e0c50e8c4e7493bc0f18db6867478341a832a982fd15a8fe" 170 | legacy = true 171 | 172 | [[files]] 173 | name = "rustc/python-3.7.4-embed-amd64.zip" 174 | sha256 = "fb65e5cd595ad01049f73b47bc0ee23fd03f0cbadc56cb318990cee83b37761b" 175 | legacy = true 176 | 177 | [[files]] 178 | name = "rustc/riscv32-elf-ubuntu-22.04-gcc-nightly-2023.10.18-nightly.tar.gz" 179 | sha256 = "0cff7b05d90af9679ca7e1f8e7040d3e4d0757123b4207af28bd9ac796bf425b" 180 | legacy = true 181 | 182 | [[files]] 183 | name = "rustc/riscv64-elf-ubuntu-22.04-gcc-nightly-2023.10.18-nightly.tar.gz" 184 | sha256 = "24fabc64df0fc11cad155390f089eb87431ccd862fe0511446d76fbe54cbde57" 185 | legacy = true 186 | 187 | [[files]] 188 | name = "rustc/rustc-perf-4f313add609f43e928e98132358e8426ed3969ae.zip" 189 | sha256 = "ed7ace9a80e9509afafa6a96a427559080f558b44501b03cbbdf7894219fdeac" 190 | legacy = true 191 | 192 | [[files]] 193 | name = "rustc/rustc-perf-8b2ac3042e1ff2c0074455a0a3618adef97156b1.zip" 194 | sha256 = "32b4a27599596fbc5bc604cb93488e2d90ddc2fb6b22341a9503d37832cb096b" 195 | legacy = true 196 | 197 | [[files]] 198 | name = "rustc/sabotage-linux-tarballs/linux-headers-4.19.88.tar.xz" 199 | sha256 = "d3f3acf6d16bdb005d3f2589ade1df8eff2e1c537f92e6cd9222218ead882feb" 200 | legacy = true 201 | 202 | [[files]] 203 | name = "rustc/sde-external-8.9.0-2017-08-06-lin.tar.bz2" 204 | sha256 = "d3868ac4d6f92e57376924a62e8d52f36d7a326561ec0bbd1d5681759a947134" 205 | legacy = true 206 | 207 | [[files]] 208 | name = "rustc/vexpress-v2p-ca15-tc1.dtb" 209 | sha256 = "0abd5abfceef9df5848254caaf933c4ede795dd4b618a9751f4a2727e95e7ff2" 210 | legacy = true 211 | 212 | [[files]] 213 | name = "rustc/wix311-binaries.zip" 214 | sha256 = "37f0a533b0978a454efb5dc3bd3598becf9660aaf4287e55bf68ca6b527d051d" 215 | legacy = true 216 | -------------------------------------------------------------------------------- /files/rustc/sccache.toml: -------------------------------------------------------------------------------- 1 | [[files]] 2 | name = "rustc/2017-02-24-sccache-x86_64-apple-darwin" 3 | sha256 = "68744d3a22bbbad4cf0c63f08414e4a741be5c9fd629d530ed4b90a6fa77d945" 4 | legacy = true 5 | 6 | [[files]] 7 | name = "rustc/2017-02-24-sccache-x86_64-pc-windows-msvc" 8 | sha256 = "5363ad3aa85e869f8282540b4a85994de5c8eee5d9c63b8429d368229a928d69" 9 | legacy = true 10 | 11 | [[files]] 12 | name = "rustc/2017-02-24-sccache-x86_64-unknown-linux-gnu" 13 | sha256 = "4b2ae37d793e6b846d05b5ac4a8bf55982d5b4fd5405789d1c895b7d2d88435a" 14 | legacy = true 15 | 16 | [[files]] 17 | name = "rustc/2017-02-25-sccache-x86_64-apple-darwin" 18 | sha256 = "926484403e410163daae2d2af3d114605f994a8026bb7012b1e59921fb444bcc" 19 | legacy = true 20 | 21 | [[files]] 22 | name = "rustc/2017-02-25-sccache-x86_64-pc-windows-msvc" 23 | sha256 = "d61f90a2dd78eb62ab9a435b7971cf3cd54de9e41fa9446aa41ece7c00e7754f" 24 | legacy = true 25 | 26 | [[files]] 27 | name = "rustc/2017-02-25-sccache-x86_64-unknown-linux-musl" 28 | sha256 = "2e6a427c41d311ee23e04a71ce0f2ca8edf4d098b46911dc9a7c13622976ae69" 29 | legacy = true 30 | 31 | [[files]] 32 | name = "rustc/2017-03-16-sccache-x86_64-apple-darwin" 33 | sha256 = "fb43600cfce057dcd8030f9183e14e823995138e5548c28ba8c02a34449a01b1" 34 | legacy = true 35 | 36 | [[files]] 37 | name = "rustc/2017-03-16-sccache-x86_64-pc-windows-msvc" 38 | sha256 = "95ac6025b2b35154ac65ac9a76f3165775746d93f5430972575c69a16b161ed3" 39 | legacy = true 40 | 41 | [[files]] 42 | name = "rustc/2017-03-16-sccache-x86_64-unknown-linux-musl" 43 | sha256 = "e83d68ec1356ce32dd0a8c612767efc564d4650dfa355833ee9c4fd0e6e04708" 44 | legacy = true 45 | 46 | [[files]] 47 | name = "rustc/2017-03-20-sccache-x86_64-apple-darwin" 48 | sha256 = "35025a6352de3d9a3884658d0493400bf7d4f62ccde5a32ac1125e80c26b9785" 49 | legacy = true 50 | 51 | [[files]] 52 | name = "rustc/2017-03-20-sccache-x86_64-pc-windows-msvc" 53 | sha256 = "d9678473433ac838ed3dda6ef924b19687e00c3b5e899c8fb421c5009a70936d" 54 | legacy = true 55 | 56 | [[files]] 57 | name = "rustc/2017-03-20-sccache-x86_64-unknown-linux-musl" 58 | sha256 = "f7e41595e9cdc92351b825309e677245f57f95c85b369c505b7fc81c9613bc8c" 59 | legacy = true 60 | 61 | [[files]] 62 | name = "rustc/2017-03-21-sccache-x86_64-apple-darwin" 63 | sha256 = "814c4a931336fbd5e48f91e13d7df8ba0e33a62160209cd87b823b168cfeeaca" 64 | legacy = true 65 | 66 | [[files]] 67 | name = "rustc/2017-03-21-sccache-x86_64-pc-windows-msvc" 68 | sha256 = "f4c96c920da286b043e7d69bbaf97cb7aaae7ad22c70445a6c6034604891a886" 69 | legacy = true 70 | 71 | [[files]] 72 | name = "rustc/2017-03-21-sccache-x86_64-unknown-linux-musl" 73 | sha256 = "c4bb57741ebe69a393444be20c980c6c9098969c1240e887cb6d86fe8b0ad3d2" 74 | legacy = true 75 | 76 | [[files]] 77 | name = "rustc/2017-03-22-sccache-x86_64-apple-darwin" 78 | sha256 = "c95f2495e0714d98af0fc0556cfb98778046603fb2e9d37a04db6174adac5998" 79 | legacy = true 80 | 81 | [[files]] 82 | name = "rustc/2017-03-22-sccache-x86_64-pc-windows-msvc" 83 | sha256 = "b6c9739a7ed91e29b0f40ca84e374b12a053a11d7ac65d6fb87277fd7075f1a9" 84 | legacy = true 85 | 86 | [[files]] 87 | name = "rustc/2017-03-22-sccache-x86_64-unknown-linux-musl" 88 | sha256 = "e84012e555cb585d8f33426ef5f3aebd654d79bd7cef21c81e7805f06cbff590" 89 | legacy = true 90 | 91 | [[files]] 92 | name = "rustc/2017-03-24-sccache-x86_64-apple-darwin" 93 | sha256 = "57a6df275129fff66408d875b1bc1b1a1cef9710f16745530863e0ea1dafc7bf" 94 | legacy = true 95 | 96 | [[files]] 97 | name = "rustc/2017-03-24-sccache-x86_64-pc-windows-msvc" 98 | sha256 = "43233d06bad0e14aa35913060595d068bb2f5852e35c67c4cc510e6b6a50d110" 99 | legacy = true 100 | 101 | [[files]] 102 | name = "rustc/2017-03-24-sccache-x86_64-unknown-linux-musl" 103 | sha256 = "0c32a788f12c04ea322b4a5c7bad4f1652b4ad2a4633fa7f3e4938df582e403d" 104 | legacy = true 105 | 106 | [[files]] 107 | name = "rustc/2017-04-04-sccache-x86_64-apple-darwin" 108 | sha256 = "f1fff4742d78b6818229d85827aab6db53de542d43c3637add5da725b027720f" 109 | legacy = true 110 | 111 | [[files]] 112 | name = "rustc/2017-04-04-sccache-x86_64-pc-windows-msvc" 113 | sha256 = "7e7320305d3287b4b63cb6c94871b435660c919fb9a28edad52bced7182b7cc0" 114 | legacy = true 115 | 116 | [[files]] 117 | name = "rustc/2017-04-04-sccache-x86_64-unknown-linux-musl" 118 | sha256 = "d31abdcab2c44e63bcf6314ebb833ccc8aacc02c79b85d280961c25025d83d6a" 119 | legacy = true 120 | 121 | [[files]] 122 | name = "rustc/2017-04-19-sccache-x86_64-apple-darwin" 123 | sha256 = "da11286fb428dc3138ec8c7d13df8633c575ebaa22dd4d21cae5a4b6273f809a" 124 | legacy = true 125 | 126 | [[files]] 127 | name = "rustc/2017-04-19-sccache-x86_64-pc-windows-msvc" 128 | sha256 = "5baa600f523de5535310ceeca82f93ec3359c0de7ef8ecfd1336e0a11dea9397" 129 | legacy = true 130 | 131 | [[files]] 132 | name = "rustc/2017-04-19-sccache-x86_64-unknown-linux-musl" 133 | sha256 = "71d7fd6197696dfcfa45997382d09600d578ce8b55f0eb97cdae2087c06035fc" 134 | legacy = true 135 | 136 | [[files]] 137 | name = "rustc/2017-04-29-sccache-x86_64-apple-darwin" 138 | sha256 = "267eabedbcca123757281c1c4ac78b0b2dedac203958daa22f9da18dcc09797e" 139 | legacy = true 140 | 141 | [[files]] 142 | name = "rustc/2017-04-29-sccache-x86_64-pc-windows-msvc" 143 | sha256 = "a88884ebae66bde37ffb17e6099ab7c10c3133b6834dbdfd453515eee3c15413" 144 | legacy = true 145 | 146 | [[files]] 147 | name = "rustc/2017-04-29-sccache-x86_64-unknown-linux-musl" 148 | sha256 = "87f767c6eeb7b93127fd748cf5615c08900b52474ab0dbadd565fadc87609a83" 149 | legacy = true 150 | 151 | [[files]] 152 | name = "rustc/2017-05-12-sccache-x86_64-apple-darwin" 153 | sha256 = "bd4fef90266f9598c4aadd9d83d454f344020ea403356d4ac3c41dd5b8eaefd7" 154 | legacy = true 155 | 156 | [[files]] 157 | name = "rustc/2017-05-12-sccache-x86_64-pc-windows-msvc" 158 | sha256 = "626467671dcdb96ab4b86b788631d0ecacf05910eb99c9eb0f49f025cee65d4b" 159 | legacy = true 160 | 161 | [[files]] 162 | name = "rustc/2017-05-12-sccache-x86_64-unknown-linux-musl" 163 | sha256 = "02e57b7f229641444975680a7d9d360478db4c62fd95078edd3a7beaec10a7c9" 164 | legacy = true 165 | 166 | [[files]] 167 | name = "rustc/2018-03-01-sccache-x86_64-apple-darwin" 168 | sha256 = "f4c445084fafa028454b28f59763197a907ea33766321f5d16bd98d0830754f3" 169 | legacy = true 170 | 171 | [[files]] 172 | name = "rustc/2018-03-01-sccache-x86_64-pc-windows-msvc" 173 | sha256 = "be80a836481153644bb7e6c4d587314d010f2d7136044842dcbc04765cca8455" 174 | legacy = true 175 | 176 | [[files]] 177 | name = "rustc/2018-03-01-sccache-x86_64-unknown-linux-musl" 178 | sha256 = "9f254b19407c479749280a4b8b9fbde34d390f2e3de54ef7fd19e15c9c765eaf" 179 | legacy = true 180 | 181 | [[files]] 182 | name = "rustc/2018-03-12-sccache-x86_64-apple-darwin" 183 | sha256 = "b1b058ad15a22b00e8c039c65c9fab11f3f138e4a424d544cc2d5a0736345708" 184 | legacy = true 185 | 186 | [[files]] 187 | name = "rustc/2018-03-12-sccache-x86_64-pc-windows-msvc" 188 | sha256 = "450ac4ca4164a4efd5f07c97122da58a544d4717e3fa61485fd1b029981e3700" 189 | legacy = true 190 | 191 | [[files]] 192 | name = "rustc/2018-03-12-sccache-x86_64-unknown-linux-musl" 193 | sha256 = "5349192f80b07e91b60745b7fef3523f76b166b629f67da08ca2868d7ba515aa" 194 | legacy = true 195 | 196 | [[files]] 197 | name = "rustc/2018-04-02-sccache-x86_64-apple-darwin" 198 | sha256 = "27422f26fd77f020b130d1b4dc8449804ca3d14dbd0c2779a57798b2b4b14e56" 199 | legacy = true 200 | 201 | [[files]] 202 | name = "rustc/2018-04-02-sccache-x86_64-pc-windows-msvc" 203 | sha256 = "d436b7b28f3749651de26b3e8a522b73661fd4097e762aa560b06b1b2ca9dcfd" 204 | legacy = true 205 | 206 | [[files]] 207 | name = "rustc/2018-04-02-sccache-x86_64-unknown-linux-musl" 208 | sha256 = "f9937acda5e049b8dab5cbf22fff9c0e877a08a2d449b6b39caf92725c988e35" 209 | legacy = true 210 | 211 | [[files]] 212 | name = "rustc/2018-04-26-sccache-x86_64-pc-windows-msvc" 213 | sha256 = "dba306f2b1283110e526e0e8ea68081032e1e170ca8234f3a083479fc7be7fcf" 214 | legacy = true 215 | 216 | [[files]] 217 | name = "rustc/2021-08-24-sccache-v0.2.15-x86_64-unknown-linux-musl" 218 | sha256 = "6075534342ea713d178142c61d3676f8a68f9fb8fa299e554e2a4a4635bd28d3" 219 | legacy = true 220 | 221 | [[files]] 222 | name = "rustc/2021-08-25-sccache-v0.2.15-aarch64-unknown-linux-musl" 223 | sha256 = "bfd790d021cde2c6d3f7f0e74c5cb0e5b3a9e516089d7fc9d27890f34178575d" 224 | legacy = true 225 | 226 | [[files]] 227 | name = "rustc/2021-08-25-sccache-v0.2.15-x86_64-apple-darwin" 228 | sha256 = "adbd229cd2e31eec194b5842ff92eb6faf79ba33792af707bd3ffe553ab6c6b5" 229 | legacy = true 230 | 231 | [[files]] 232 | name = "rustc/2021-08-25-sccache-v0.2.15-x86_64-pc-windows-msvc" 233 | sha256 = "b4a06b86f940e352c93af32810e137de056423d13c9e1345ed9e8b11e95f126f" 234 | legacy = true 235 | 236 | [[files]] 237 | name = "rustc/2022-11-13-sccache-v0.3.1-aarch64-unknown-linux-musl" 238 | sha256 = "d3c8964d0be239a4a38692b7d4c938d206752f2ae51ab0b74b5b0194ada69b6c" 239 | legacy = true 240 | 241 | [[files]] 242 | name = "rustc/2022-12-08-sccache-v0.3.3-x86_64-unknown-linux-musl" 243 | sha256 = "8fbcf63f454afce6755fd5865db3e207cdd408b8553e5223c9ed0ed2c6a92a09" 244 | legacy = true 245 | 246 | [[files]] 247 | name = "rustc/2025-01-07-sccache-v0.9.1-aarch64-unknown-linux-musl" 248 | sha256 = "af220834d081cc863c744e610054ac6fb25c8a2818d56d12001361b1f6a95006" 249 | legacy = true 250 | 251 | [[files]] 252 | name = "rustc/2025-01-07-sccache-v0.9.1-x86_64-unknown-linux-musl" 253 | sha256 = "c211f6ea94e7c78e1d05f28723651884acff6dbad652bb21aba5a60d6cb500f3" 254 | legacy = true 255 | 256 | [[files]] 257 | name = "rustc/2025-02-24-sccache-v0.10.0-aarch64-unknown-linux-musl" 258 | sha256 = "8df5d557b50aa19c1c818b1a6465454a9dd807917af678f3feae11ee5c9dbe27" 259 | legacy = true 260 | 261 | [[files]] 262 | name = "rustc/2025-02-24-sccache-v0.10.0-x86_64-apple-darwin" 263 | sha256 = "0925fe78012c21e39790653b5e6b20b7498441718cb8bb3a043866896f378568" 264 | legacy = true 265 | 266 | [[files]] 267 | name = "rustc/2025-02-24-sccache-v0.10.0-x86_64-pc-windows-msvc.exe" 268 | sha256 = "f3eff6014d973578498dbabcf1510fec2a624043d4035e15f2dc660fb35200d7" 269 | legacy = true 270 | 271 | [[files]] 272 | name = "rustc/2025-02-24-sccache-v0.10.0-x86_64-unknown-linux-musl" 273 | sha256 = "c205ba0911ce383e90263df8d83e445becccfff1bc0bb2e69ec57d1aa3090a4b" 274 | legacy = true 275 | 276 | [[files]] 277 | name = "rustc/2019-12-17-sccache-aarch64-unknown-linux-gnu" 278 | sha256 = "bf198b548e82f334dd092e493c2dc1adf7b8557a6651a3a2c37249aff801db42" 279 | legacy = true 280 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | https://www.apache.org/licenses/LICENSE-2.0 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | https://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /src/manifest.rs: -------------------------------------------------------------------------------- 1 | use anyhow::{Context, Error}; 2 | use reqwest::Url; 3 | use serde::de::Error as _; 4 | use serde::{Deserialize, Deserializer, Serialize, Serializer}; 5 | use std::cmp::Ordering; 6 | use std::collections::{BTreeSet, HashMap}; 7 | use std::path::{Path, PathBuf}; 8 | 9 | #[derive(PartialEq, Eq, Clone)] 10 | struct Span(std::ops::Range); 11 | 12 | impl PartialOrd for Span { 13 | fn partial_cmp(&self, other: &Self) -> Option { 14 | Some(self.cmp(other)) 15 | } 16 | } 17 | 18 | impl Ord for Span { 19 | fn cmp(&self, other: &Self) -> Ordering { 20 | self.0 21 | .start 22 | .partial_cmp(&other.0.start) 23 | .unwrap() 24 | .then(self.0.end.partial_cmp(&other.0.end).unwrap()) 25 | } 26 | } 27 | 28 | #[derive(Ord, PartialOrd, Eq, PartialEq, Clone)] 29 | struct Location { 30 | file: PathBuf, 31 | span: Span, 32 | } 33 | 34 | #[derive(Default)] 35 | struct LocationCache { 36 | seen_urls: HashMap>, 37 | seen_hashes: HashMap>, 38 | seen_paths: HashMap>, 39 | } 40 | 41 | /// Returns (files, found errors). 42 | /// Errors are returned explicitly so that they can be merged with follow-up errors, rather than 43 | /// exiting immediately. 44 | pub(crate) fn load_manifests(load_from: &Path) -> Result<(Vec, Vec), Error> { 45 | let mut result = Vec::new(); 46 | let mut cache = LocationCache::default(); 47 | let mut errors = Vec::new(); 48 | 49 | fn emit_error( 50 | error: String, 51 | mirror_file: &MirrorFile, 52 | file_source: &str, 53 | cache: &LocationCache, 54 | errors: &mut Vec, 55 | ) { 56 | let location = cache 57 | .seen_paths 58 | .get(&mirror_file.name) 59 | .unwrap() 60 | .first() 61 | .unwrap(); 62 | let (src_line, snippet) = span_info(&file_source, location); 63 | errors.push(format!( 64 | "{error}:\n\ 65 | # {} (line {src_line})\n{snippet}\n", 66 | location.file.display() 67 | )); 68 | } 69 | 70 | fn load_inner( 71 | load_from: &Path, 72 | result: &mut Vec, 73 | cache: &mut LocationCache, 74 | errors: &mut Vec, 75 | ) -> anyhow::Result<()> { 76 | for entry in load_from.read_dir()? { 77 | let path = entry?.path(); 78 | if path.is_file() && path.extension().and_then(|s| s.to_str()) == Some("toml") { 79 | let file_source = std::fs::read_to_string(&path) 80 | .map_err(Error::from) 81 | .with_context(|| format!("failed to read {}", path.display()))?; 82 | let manifest = toml::from_str::(&file_source) 83 | .map_err(Error::from) 84 | .with_context(|| format!("failed to read {}", path.display()))?; 85 | record_locations(&path, &manifest, cache); 86 | 87 | for file in manifest.files { 88 | let mirror_file = match file.into_inner() { 89 | ManifestFile::Legacy(legacy) => MirrorFile { 90 | name: legacy.name, 91 | sha256: legacy.sha256, 92 | source: Source::Legacy, 93 | rename_from: None, 94 | }, 95 | ManifestFile::Managed(managed) => MirrorFile { 96 | name: managed.name, 97 | sha256: managed.sha256, 98 | source: Source::Url(managed.source), 99 | rename_from: managed.rename_from, 100 | }, 101 | }; 102 | if mirror_file.name.starts_with('/') { 103 | emit_error( 104 | "Mirrored path cannot start with a slash (/)".to_string(), 105 | &mirror_file, 106 | &file_source, 107 | cache, 108 | errors, 109 | ); 110 | } 111 | 112 | if let Source::Url(ref source) = mirror_file.source { 113 | if let Some(file_name) = source.path().split('/').last() 114 | && let Some(path_name) = mirror_file.name.split('/').last() 115 | { 116 | match mirror_file.rename_from { 117 | Some(ref rename_from) => { 118 | if path_name == file_name { 119 | emit_error( 120 | format!( 121 | "`rename-from` field isn't needed since `source` and `name` field have the same file name (`{file_name}`)" 122 | ), 123 | &mirror_file, 124 | &file_source, 125 | cache, 126 | errors, 127 | ); 128 | } else if rename_from != file_name { 129 | emit_error( 130 | format!( 131 | "`rename-from` field value doesn't match name from the URL `{source}` (`{file_name}` != `{rename_from}`)" 132 | ), 133 | &mirror_file, 134 | &file_source, 135 | cache, 136 | errors, 137 | ); 138 | } 139 | } 140 | None => { 141 | if path_name != file_name { 142 | emit_error( 143 | format!( 144 | "The name from the URL `{source}` doesn't match the `name` field (`{file_name}` != `{path_name}`). \ 145 | Add `rename-from = {file_name:?}` to fix this error" 146 | ), 147 | &mirror_file, 148 | &file_source, 149 | cache, 150 | errors, 151 | ); 152 | } 153 | } 154 | } 155 | } 156 | } 157 | result.push(mirror_file); 158 | } 159 | } else if path.is_dir() { 160 | load_inner(&path, result, cache, errors)?; 161 | } 162 | } 163 | Ok(()) 164 | } 165 | 166 | load_inner(load_from, &mut result, &mut cache, &mut errors)?; 167 | find_errors(cache, &mut errors); 168 | Ok((result, errors)) 169 | } 170 | 171 | fn record_locations(toml_path: &Path, manifest: &Manifest, cache: &mut LocationCache) { 172 | for file in &manifest.files { 173 | let span = Span(file.span()); 174 | let file = file.get_ref(); 175 | 176 | let location = Location { 177 | file: toml_path.to_owned(), 178 | span, 179 | }; 180 | let (hash, name, url) = match file { 181 | ManifestFile::Legacy(f) => { 182 | if f.skip_validation { 183 | return; 184 | } 185 | 186 | (f.sha256.clone(), f.name.clone(), None) 187 | } 188 | ManifestFile::Managed(f) => (f.sha256.clone(), f.name.clone(), Some(f.source.clone())), 189 | }; 190 | cache 191 | .seen_hashes 192 | .entry(hash) 193 | .or_default() 194 | .insert(location.clone()); 195 | cache 196 | .seen_paths 197 | .entry(name) 198 | .or_default() 199 | .insert(location.clone()); 200 | if let Some(url) = url { 201 | cache 202 | .seen_urls 203 | .entry(url) 204 | .or_default() 205 | .insert(location.clone()); 206 | } 207 | } 208 | } 209 | 210 | fn span_info<'a>(content: &'a str, location: &Location) -> (usize, &'a str) { 211 | // Find the corresponding line number 212 | let mut accumulated_chars = 0; 213 | let mut src_line = 0; 214 | for (index, line) in content.lines().enumerate() { 215 | accumulated_chars += line.len() + 1; // +1 for newline 216 | if accumulated_chars > location.span.0.start { 217 | src_line = index + 1; 218 | break; 219 | } 220 | } 221 | 222 | let snippet = &content[location.span.0.start..location.span.0.end]; 223 | (src_line, snippet) 224 | } 225 | 226 | fn find_errors(cache: LocationCache, errors: &mut Vec) { 227 | let mut file_cache: HashMap = HashMap::new(); 228 | 229 | fn format_locations( 230 | cache: &mut HashMap, 231 | locations: &BTreeSet, 232 | ) -> String { 233 | use std::fmt::Write; 234 | 235 | let mut output = String::new(); 236 | for location in locations { 237 | let content = cache.entry(location.file.clone()).or_insert_with(|| { 238 | std::fs::read_to_string(&location.file).unwrap_or_else(|e| { 239 | panic!("cannot load file from {}: {e:?}", location.file.display()) 240 | }) 241 | }); 242 | 243 | let (src_line, snippet) = span_info(&content, location); 244 | writeln!( 245 | output, 246 | "# {} (line {src_line})\n{snippet}\n", 247 | location.file.display() 248 | ) 249 | .unwrap(); 250 | } 251 | 252 | output 253 | } 254 | 255 | for (path, locations) in cache.seen_paths { 256 | if locations.len() > 1 { 257 | errors.push(format!( 258 | "The following entries share the same CDN path `{path}`:\n{}", 259 | format_locations(&mut file_cache, &locations) 260 | )); 261 | } 262 | } 263 | for (url, locations) in cache.seen_urls { 264 | if locations.len() > 1 { 265 | errors.push(format!( 266 | "The following entries share the same URL `{url}`:\n{}", 267 | format_locations(&mut file_cache, &locations) 268 | )); 269 | } 270 | } 271 | for (hash, locations) in cache.seen_hashes { 272 | if locations.len() > 1 { 273 | errors.push(format!( 274 | "The following entries share the same hash `{hash}`:\n{}", 275 | format_locations(&mut file_cache, &locations) 276 | )); 277 | } 278 | } 279 | } 280 | 281 | pub(crate) struct MirrorFile { 282 | pub(crate) name: String, 283 | pub(crate) sha256: String, 284 | pub(crate) source: Source, 285 | pub(crate) rename_from: Option, 286 | } 287 | 288 | pub(crate) enum Source { 289 | Url(Url), 290 | Legacy, 291 | } 292 | 293 | #[derive(Debug, Deserialize)] 294 | #[serde(deny_unknown_fields)] 295 | struct Manifest { 296 | files: Vec>, 297 | } 298 | 299 | #[derive(Debug, Deserialize)] 300 | #[serde(untagged)] 301 | enum ManifestFile { 302 | Legacy(ManifestFileLegacy), 303 | Managed(ManifestFileManaged), 304 | } 305 | 306 | #[derive(Debug, Deserialize)] 307 | #[serde(deny_unknown_fields)] 308 | struct ManifestFileLegacy { 309 | name: String, 310 | sha256: String, 311 | #[serde(deserialize_with = "deserialize_true")] 312 | #[expect(unused)] 313 | legacy: (), 314 | #[serde(default, rename = "skip-validation")] 315 | skip_validation: bool, 316 | } 317 | 318 | #[derive(Debug, Deserialize, Serialize)] 319 | #[serde(deny_unknown_fields)] 320 | pub struct ManifestFileManaged { 321 | name: String, 322 | sha256: String, 323 | #[serde(deserialize_with = "deserialize_url", serialize_with = "serialize_url")] 324 | source: Url, 325 | // This field is not considered at all by the automation, we just enforce its presence so that 326 | // people adding new entries think about the licensing implications. 327 | license: String, 328 | #[serde(default, rename = "rename-from")] 329 | rename_from: Option, 330 | } 331 | 332 | impl ManifestFileManaged { 333 | pub fn new( 334 | name: String, 335 | sha256: String, 336 | source: Url, 337 | license: String, 338 | rename_from: Option, 339 | ) -> Self { 340 | Self { 341 | name, 342 | sha256, 343 | source, 344 | license, 345 | rename_from, 346 | } 347 | } 348 | } 349 | 350 | fn deserialize_url<'de, D: Deserializer<'de>>(de: D) -> Result { 351 | let raw = String::deserialize(de)?; 352 | Url::parse(&raw).map_err(|e| D::Error::custom(format!("{e:?}"))) 353 | } 354 | 355 | fn serialize_url(url: &Url, s: S) -> Result { 356 | url.as_str().serialize(s) 357 | } 358 | 359 | fn deserialize_true<'de, D: Deserializer<'de>>(de: D) -> Result<(), D::Error> { 360 | let raw = bool::deserialize(de)?; 361 | if raw { 362 | Ok(()) 363 | } else { 364 | Err(D::Error::custom("must be true")) 365 | } 366 | } 367 | -------------------------------------------------------------------------------- /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 = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.1.3" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "allocator-api2" 31 | version = "0.2.21" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 34 | 35 | [[package]] 36 | name = "anstyle" 37 | version = "1.0.10" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 40 | 41 | [[package]] 42 | name = "anyhow" 43 | version = "1.0.97" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" 46 | 47 | [[package]] 48 | name = "atomic-waker" 49 | version = "1.1.2" 50 | source = "registry+https://github.com/rust-lang/crates.io-index" 51 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 52 | 53 | [[package]] 54 | name = "autocfg" 55 | version = "1.4.0" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 58 | 59 | [[package]] 60 | name = "aws-config" 61 | version = "1.6.1" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "8c39646d1a6b51240a1a23bb57ea4eebede7e16fbc237fdc876980233dcecb4f" 64 | dependencies = [ 65 | "aws-credential-types", 66 | "aws-runtime", 67 | "aws-sdk-sso", 68 | "aws-sdk-ssooidc", 69 | "aws-sdk-sts", 70 | "aws-smithy-async", 71 | "aws-smithy-http", 72 | "aws-smithy-json", 73 | "aws-smithy-runtime", 74 | "aws-smithy-runtime-api", 75 | "aws-smithy-types", 76 | "aws-types", 77 | "bytes", 78 | "fastrand", 79 | "hex", 80 | "http 1.3.1", 81 | "ring", 82 | "time", 83 | "tokio", 84 | "tracing", 85 | "url", 86 | "zeroize", 87 | ] 88 | 89 | [[package]] 90 | name = "aws-credential-types" 91 | version = "1.2.2" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "4471bef4c22a06d2c7a1b6492493d3fdf24a805323109d6874f9c94d5906ac14" 94 | dependencies = [ 95 | "aws-smithy-async", 96 | "aws-smithy-runtime-api", 97 | "aws-smithy-types", 98 | "zeroize", 99 | ] 100 | 101 | [[package]] 102 | name = "aws-lc-rs" 103 | version = "1.13.0" 104 | source = "registry+https://github.com/rust-lang/crates.io-index" 105 | checksum = "19b756939cb2f8dc900aa6dcd505e6e2428e9cae7ff7b028c49e3946efa70878" 106 | dependencies = [ 107 | "aws-lc-sys", 108 | "zeroize", 109 | ] 110 | 111 | [[package]] 112 | name = "aws-lc-sys" 113 | version = "0.28.0" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "b9f7720b74ed28ca77f90769a71fd8c637a0137f6fae4ae947e1050229cff57f" 116 | dependencies = [ 117 | "bindgen", 118 | "cc", 119 | "cmake", 120 | "dunce", 121 | "fs_extra", 122 | ] 123 | 124 | [[package]] 125 | name = "aws-runtime" 126 | version = "1.5.6" 127 | source = "registry+https://github.com/rust-lang/crates.io-index" 128 | checksum = "0aff45ffe35196e593ea3b9dd65b320e51e2dda95aff4390bc459e461d09c6ad" 129 | dependencies = [ 130 | "aws-credential-types", 131 | "aws-sigv4", 132 | "aws-smithy-async", 133 | "aws-smithy-eventstream", 134 | "aws-smithy-http", 135 | "aws-smithy-runtime", 136 | "aws-smithy-runtime-api", 137 | "aws-smithy-types", 138 | "aws-types", 139 | "bytes", 140 | "fastrand", 141 | "http 0.2.12", 142 | "http-body 0.4.6", 143 | "once_cell", 144 | "percent-encoding", 145 | "pin-project-lite", 146 | "tracing", 147 | "uuid", 148 | ] 149 | 150 | [[package]] 151 | name = "aws-sdk-s3" 152 | version = "1.82.0" 153 | source = "registry+https://github.com/rust-lang/crates.io-index" 154 | checksum = "e6eab2900764411ab01c8e91a76fd11a63b4e12bc3da97d9e14a0ce1343d86d3" 155 | dependencies = [ 156 | "aws-credential-types", 157 | "aws-runtime", 158 | "aws-sigv4", 159 | "aws-smithy-async", 160 | "aws-smithy-checksums", 161 | "aws-smithy-eventstream", 162 | "aws-smithy-http", 163 | "aws-smithy-json", 164 | "aws-smithy-runtime", 165 | "aws-smithy-runtime-api", 166 | "aws-smithy-types", 167 | "aws-smithy-xml", 168 | "aws-types", 169 | "bytes", 170 | "fastrand", 171 | "hex", 172 | "hmac", 173 | "http 0.2.12", 174 | "http 1.3.1", 175 | "http-body 0.4.6", 176 | "lru", 177 | "once_cell", 178 | "percent-encoding", 179 | "regex-lite", 180 | "sha2", 181 | "tracing", 182 | "url", 183 | ] 184 | 185 | [[package]] 186 | name = "aws-sdk-sso" 187 | version = "1.64.0" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | checksum = "02d4bdb0e5f80f0689e61c77ab678b2b9304af329616af38aef5b6b967b8e736" 190 | dependencies = [ 191 | "aws-credential-types", 192 | "aws-runtime", 193 | "aws-smithy-async", 194 | "aws-smithy-http", 195 | "aws-smithy-json", 196 | "aws-smithy-runtime", 197 | "aws-smithy-runtime-api", 198 | "aws-smithy-types", 199 | "aws-types", 200 | "bytes", 201 | "fastrand", 202 | "http 0.2.12", 203 | "once_cell", 204 | "regex-lite", 205 | "tracing", 206 | ] 207 | 208 | [[package]] 209 | name = "aws-sdk-ssooidc" 210 | version = "1.65.0" 211 | source = "registry+https://github.com/rust-lang/crates.io-index" 212 | checksum = "acbbb3ce8da257aedbccdcb1aadafbbb6a5fe9adf445db0e1ea897bdc7e22d08" 213 | dependencies = [ 214 | "aws-credential-types", 215 | "aws-runtime", 216 | "aws-smithy-async", 217 | "aws-smithy-http", 218 | "aws-smithy-json", 219 | "aws-smithy-runtime", 220 | "aws-smithy-runtime-api", 221 | "aws-smithy-types", 222 | "aws-types", 223 | "bytes", 224 | "fastrand", 225 | "http 0.2.12", 226 | "once_cell", 227 | "regex-lite", 228 | "tracing", 229 | ] 230 | 231 | [[package]] 232 | name = "aws-sdk-sts" 233 | version = "1.65.0" 234 | source = "registry+https://github.com/rust-lang/crates.io-index" 235 | checksum = "96a78a8f50a1630db757b60f679c8226a8a70ee2ab5f5e6e51dc67f6c61c7cfd" 236 | dependencies = [ 237 | "aws-credential-types", 238 | "aws-runtime", 239 | "aws-smithy-async", 240 | "aws-smithy-http", 241 | "aws-smithy-json", 242 | "aws-smithy-query", 243 | "aws-smithy-runtime", 244 | "aws-smithy-runtime-api", 245 | "aws-smithy-types", 246 | "aws-smithy-xml", 247 | "aws-types", 248 | "fastrand", 249 | "http 0.2.12", 250 | "once_cell", 251 | "regex-lite", 252 | "tracing", 253 | ] 254 | 255 | [[package]] 256 | name = "aws-sigv4" 257 | version = "1.3.0" 258 | source = "registry+https://github.com/rust-lang/crates.io-index" 259 | checksum = "69d03c3c05ff80d54ff860fe38c726f6f494c639ae975203a101335f223386db" 260 | dependencies = [ 261 | "aws-credential-types", 262 | "aws-smithy-eventstream", 263 | "aws-smithy-http", 264 | "aws-smithy-runtime-api", 265 | "aws-smithy-types", 266 | "bytes", 267 | "crypto-bigint 0.5.5", 268 | "form_urlencoded", 269 | "hex", 270 | "hmac", 271 | "http 0.2.12", 272 | "http 1.3.1", 273 | "once_cell", 274 | "p256", 275 | "percent-encoding", 276 | "ring", 277 | "sha2", 278 | "subtle", 279 | "time", 280 | "tracing", 281 | "zeroize", 282 | ] 283 | 284 | [[package]] 285 | name = "aws-smithy-async" 286 | version = "1.2.5" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "1e190749ea56f8c42bf15dd76c65e14f8f765233e6df9b0506d9d934ebef867c" 289 | dependencies = [ 290 | "futures-util", 291 | "pin-project-lite", 292 | "tokio", 293 | ] 294 | 295 | [[package]] 296 | name = "aws-smithy-checksums" 297 | version = "0.63.1" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "b65d21e1ba6f2cdec92044f904356a19f5ad86961acf015741106cdfafd747c0" 300 | dependencies = [ 301 | "aws-smithy-http", 302 | "aws-smithy-types", 303 | "bytes", 304 | "crc32c", 305 | "crc32fast", 306 | "crc64fast-nvme", 307 | "hex", 308 | "http 0.2.12", 309 | "http-body 0.4.6", 310 | "md-5", 311 | "pin-project-lite", 312 | "sha1", 313 | "sha2", 314 | "tracing", 315 | ] 316 | 317 | [[package]] 318 | name = "aws-smithy-eventstream" 319 | version = "0.60.8" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | checksum = "7c45d3dddac16c5c59d553ece225a88870cf81b7b813c9cc17b78cf4685eac7a" 322 | dependencies = [ 323 | "aws-smithy-types", 324 | "bytes", 325 | "crc32fast", 326 | ] 327 | 328 | [[package]] 329 | name = "aws-smithy-http" 330 | version = "0.62.0" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | checksum = "c5949124d11e538ca21142d1fba61ab0a2a2c1bc3ed323cdb3e4b878bfb83166" 333 | dependencies = [ 334 | "aws-smithy-eventstream", 335 | "aws-smithy-runtime-api", 336 | "aws-smithy-types", 337 | "bytes", 338 | "bytes-utils", 339 | "futures-core", 340 | "http 0.2.12", 341 | "http 1.3.1", 342 | "http-body 0.4.6", 343 | "once_cell", 344 | "percent-encoding", 345 | "pin-project-lite", 346 | "pin-utils", 347 | "tracing", 348 | ] 349 | 350 | [[package]] 351 | name = "aws-smithy-http-client" 352 | version = "1.0.1" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | checksum = "8aff1159006441d02e57204bf57a1b890ba68bedb6904ffd2873c1c4c11c546b" 355 | dependencies = [ 356 | "aws-smithy-async", 357 | "aws-smithy-runtime-api", 358 | "aws-smithy-types", 359 | "h2 0.4.8", 360 | "http 0.2.12", 361 | "http 1.3.1", 362 | "http-body 0.4.6", 363 | "hyper 0.14.32", 364 | "hyper 1.6.0", 365 | "hyper-rustls 0.24.2", 366 | "hyper-rustls 0.27.5", 367 | "hyper-util", 368 | "pin-project-lite", 369 | "rustls 0.21.12", 370 | "rustls 0.23.25", 371 | "rustls-native-certs 0.8.1", 372 | "rustls-pki-types", 373 | "tokio", 374 | "tower", 375 | "tracing", 376 | ] 377 | 378 | [[package]] 379 | name = "aws-smithy-json" 380 | version = "0.61.3" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "92144e45819cae7dc62af23eac5a038a58aa544432d2102609654376a900bd07" 383 | dependencies = [ 384 | "aws-smithy-types", 385 | ] 386 | 387 | [[package]] 388 | name = "aws-smithy-observability" 389 | version = "0.1.2" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "445d065e76bc1ef54963db400319f1dd3ebb3e0a74af20f7f7630625b0cc7cc0" 392 | dependencies = [ 393 | "aws-smithy-runtime-api", 394 | "once_cell", 395 | ] 396 | 397 | [[package]] 398 | name = "aws-smithy-query" 399 | version = "0.60.7" 400 | source = "registry+https://github.com/rust-lang/crates.io-index" 401 | checksum = "f2fbd61ceb3fe8a1cb7352e42689cec5335833cd9f94103a61e98f9bb61c64bb" 402 | dependencies = [ 403 | "aws-smithy-types", 404 | "urlencoding", 405 | ] 406 | 407 | [[package]] 408 | name = "aws-smithy-runtime" 409 | version = "1.8.1" 410 | source = "registry+https://github.com/rust-lang/crates.io-index" 411 | checksum = "0152749e17ce4d1b47c7747bdfec09dac1ccafdcbc741ebf9daa2a373356730f" 412 | dependencies = [ 413 | "aws-smithy-async", 414 | "aws-smithy-http", 415 | "aws-smithy-http-client", 416 | "aws-smithy-observability", 417 | "aws-smithy-runtime-api", 418 | "aws-smithy-types", 419 | "bytes", 420 | "fastrand", 421 | "http 0.2.12", 422 | "http 1.3.1", 423 | "http-body 0.4.6", 424 | "http-body 1.0.1", 425 | "once_cell", 426 | "pin-project-lite", 427 | "pin-utils", 428 | "tokio", 429 | "tracing", 430 | ] 431 | 432 | [[package]] 433 | name = "aws-smithy-runtime-api" 434 | version = "1.7.4" 435 | source = "registry+https://github.com/rust-lang/crates.io-index" 436 | checksum = "3da37cf5d57011cb1753456518ec76e31691f1f474b73934a284eb2a1c76510f" 437 | dependencies = [ 438 | "aws-smithy-async", 439 | "aws-smithy-types", 440 | "bytes", 441 | "http 0.2.12", 442 | "http 1.3.1", 443 | "pin-project-lite", 444 | "tokio", 445 | "tracing", 446 | "zeroize", 447 | ] 448 | 449 | [[package]] 450 | name = "aws-smithy-types" 451 | version = "1.3.0" 452 | source = "registry+https://github.com/rust-lang/crates.io-index" 453 | checksum = "836155caafba616c0ff9b07944324785de2ab016141c3550bd1c07882f8cee8f" 454 | dependencies = [ 455 | "base64-simd", 456 | "bytes", 457 | "bytes-utils", 458 | "futures-core", 459 | "http 0.2.12", 460 | "http 1.3.1", 461 | "http-body 0.4.6", 462 | "http-body 1.0.1", 463 | "http-body-util", 464 | "itoa", 465 | "num-integer", 466 | "pin-project-lite", 467 | "pin-utils", 468 | "ryu", 469 | "serde", 470 | "time", 471 | "tokio", 472 | "tokio-util", 473 | ] 474 | 475 | [[package]] 476 | name = "aws-smithy-xml" 477 | version = "0.60.9" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "ab0b0166827aa700d3dc519f72f8b3a91c35d0b8d042dc5d643a91e6f80648fc" 480 | dependencies = [ 481 | "xmlparser", 482 | ] 483 | 484 | [[package]] 485 | name = "aws-types" 486 | version = "1.3.6" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "3873f8deed8927ce8d04487630dc9ff73193bab64742a61d050e57a68dec4125" 489 | dependencies = [ 490 | "aws-credential-types", 491 | "aws-smithy-async", 492 | "aws-smithy-runtime-api", 493 | "aws-smithy-types", 494 | "rustc_version", 495 | "tracing", 496 | ] 497 | 498 | [[package]] 499 | name = "backtrace" 500 | version = "0.3.74" 501 | source = "registry+https://github.com/rust-lang/crates.io-index" 502 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 503 | dependencies = [ 504 | "addr2line", 505 | "cfg-if", 506 | "libc", 507 | "miniz_oxide", 508 | "object", 509 | "rustc-demangle", 510 | "windows-targets 0.52.6", 511 | ] 512 | 513 | [[package]] 514 | name = "base16ct" 515 | version = "0.1.1" 516 | source = "registry+https://github.com/rust-lang/crates.io-index" 517 | checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" 518 | 519 | [[package]] 520 | name = "base64" 521 | version = "0.21.7" 522 | source = "registry+https://github.com/rust-lang/crates.io-index" 523 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 524 | 525 | [[package]] 526 | name = "base64" 527 | version = "0.22.1" 528 | source = "registry+https://github.com/rust-lang/crates.io-index" 529 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 530 | 531 | [[package]] 532 | name = "base64-simd" 533 | version = "0.8.0" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" 536 | dependencies = [ 537 | "outref", 538 | "vsimd", 539 | ] 540 | 541 | [[package]] 542 | name = "base64ct" 543 | version = "1.7.3" 544 | source = "registry+https://github.com/rust-lang/crates.io-index" 545 | checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" 546 | 547 | [[package]] 548 | name = "bindgen" 549 | version = "0.69.5" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" 552 | dependencies = [ 553 | "bitflags", 554 | "cexpr", 555 | "clang-sys", 556 | "itertools", 557 | "lazy_static", 558 | "lazycell", 559 | "log", 560 | "prettyplease", 561 | "proc-macro2", 562 | "quote", 563 | "regex", 564 | "rustc-hash", 565 | "shlex", 566 | "syn", 567 | "which", 568 | ] 569 | 570 | [[package]] 571 | name = "bitflags" 572 | version = "2.9.0" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" 575 | 576 | [[package]] 577 | name = "block-buffer" 578 | version = "0.10.4" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 581 | dependencies = [ 582 | "generic-array", 583 | ] 584 | 585 | [[package]] 586 | name = "bumpalo" 587 | version = "3.17.0" 588 | source = "registry+https://github.com/rust-lang/crates.io-index" 589 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 590 | 591 | [[package]] 592 | name = "bytes" 593 | version = "1.10.1" 594 | source = "registry+https://github.com/rust-lang/crates.io-index" 595 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 596 | 597 | [[package]] 598 | name = "bytes-utils" 599 | version = "0.1.4" 600 | source = "registry+https://github.com/rust-lang/crates.io-index" 601 | checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" 602 | dependencies = [ 603 | "bytes", 604 | "either", 605 | ] 606 | 607 | [[package]] 608 | name = "cc" 609 | version = "1.2.18" 610 | source = "registry+https://github.com/rust-lang/crates.io-index" 611 | checksum = "525046617d8376e3db1deffb079e91cef90a89fc3ca5c185bbf8c9ecdd15cd5c" 612 | dependencies = [ 613 | "jobserver", 614 | "libc", 615 | "shlex", 616 | ] 617 | 618 | [[package]] 619 | name = "cexpr" 620 | version = "0.6.0" 621 | source = "registry+https://github.com/rust-lang/crates.io-index" 622 | checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 623 | dependencies = [ 624 | "nom", 625 | ] 626 | 627 | [[package]] 628 | name = "cfg-if" 629 | version = "1.0.0" 630 | source = "registry+https://github.com/rust-lang/crates.io-index" 631 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 632 | 633 | [[package]] 634 | name = "ci-mirrors" 635 | version = "0.0.0" 636 | dependencies = [ 637 | "anyhow", 638 | "aws-config", 639 | "aws-sdk-s3", 640 | "clap", 641 | "futures", 642 | "reqwest", 643 | "serde", 644 | "sha2", 645 | "tempfile", 646 | "tokio", 647 | "tokio-util", 648 | "toml", 649 | ] 650 | 651 | [[package]] 652 | name = "clang-sys" 653 | version = "1.8.1" 654 | source = "registry+https://github.com/rust-lang/crates.io-index" 655 | checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" 656 | dependencies = [ 657 | "glob", 658 | "libc", 659 | "libloading", 660 | ] 661 | 662 | [[package]] 663 | name = "clap" 664 | version = "4.5.35" 665 | source = "registry+https://github.com/rust-lang/crates.io-index" 666 | checksum = "d8aa86934b44c19c50f87cc2790e19f54f7a67aedb64101c2e1a2e5ecfb73944" 667 | dependencies = [ 668 | "clap_builder", 669 | "clap_derive", 670 | ] 671 | 672 | [[package]] 673 | name = "clap_builder" 674 | version = "4.5.35" 675 | source = "registry+https://github.com/rust-lang/crates.io-index" 676 | checksum = "2414dbb2dd0695280da6ea9261e327479e9d37b0630f6b53ba2a11c60c679fd9" 677 | dependencies = [ 678 | "anstyle", 679 | "clap_lex", 680 | ] 681 | 682 | [[package]] 683 | name = "clap_derive" 684 | version = "4.5.32" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" 687 | dependencies = [ 688 | "heck", 689 | "proc-macro2", 690 | "quote", 691 | "syn", 692 | ] 693 | 694 | [[package]] 695 | name = "clap_lex" 696 | version = "0.7.4" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 699 | 700 | [[package]] 701 | name = "cmake" 702 | version = "0.1.54" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" 705 | dependencies = [ 706 | "cc", 707 | ] 708 | 709 | [[package]] 710 | name = "const-oid" 711 | version = "0.9.6" 712 | source = "registry+https://github.com/rust-lang/crates.io-index" 713 | checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 714 | 715 | [[package]] 716 | name = "core-foundation" 717 | version = "0.9.4" 718 | source = "registry+https://github.com/rust-lang/crates.io-index" 719 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 720 | dependencies = [ 721 | "core-foundation-sys", 722 | "libc", 723 | ] 724 | 725 | [[package]] 726 | name = "core-foundation" 727 | version = "0.10.0" 728 | source = "registry+https://github.com/rust-lang/crates.io-index" 729 | checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" 730 | dependencies = [ 731 | "core-foundation-sys", 732 | "libc", 733 | ] 734 | 735 | [[package]] 736 | name = "core-foundation-sys" 737 | version = "0.8.7" 738 | source = "registry+https://github.com/rust-lang/crates.io-index" 739 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 740 | 741 | [[package]] 742 | name = "cpufeatures" 743 | version = "0.2.17" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 746 | dependencies = [ 747 | "libc", 748 | ] 749 | 750 | [[package]] 751 | name = "crc" 752 | version = "3.2.1" 753 | source = "registry+https://github.com/rust-lang/crates.io-index" 754 | checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" 755 | dependencies = [ 756 | "crc-catalog", 757 | ] 758 | 759 | [[package]] 760 | name = "crc-catalog" 761 | version = "2.4.0" 762 | source = "registry+https://github.com/rust-lang/crates.io-index" 763 | checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" 764 | 765 | [[package]] 766 | name = "crc32c" 767 | version = "0.6.8" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "3a47af21622d091a8f0fb295b88bc886ac74efcc613efc19f5d0b21de5c89e47" 770 | dependencies = [ 771 | "rustc_version", 772 | ] 773 | 774 | [[package]] 775 | name = "crc32fast" 776 | version = "1.4.2" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 779 | dependencies = [ 780 | "cfg-if", 781 | ] 782 | 783 | [[package]] 784 | name = "crc64fast-nvme" 785 | version = "1.2.0" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "4955638f00a809894c947f85a024020a20815b65a5eea633798ea7924edab2b3" 788 | dependencies = [ 789 | "crc", 790 | ] 791 | 792 | [[package]] 793 | name = "crypto-bigint" 794 | version = "0.4.9" 795 | source = "registry+https://github.com/rust-lang/crates.io-index" 796 | checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" 797 | dependencies = [ 798 | "generic-array", 799 | "rand_core", 800 | "subtle", 801 | "zeroize", 802 | ] 803 | 804 | [[package]] 805 | name = "crypto-bigint" 806 | version = "0.5.5" 807 | source = "registry+https://github.com/rust-lang/crates.io-index" 808 | checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" 809 | dependencies = [ 810 | "rand_core", 811 | "subtle", 812 | ] 813 | 814 | [[package]] 815 | name = "crypto-common" 816 | version = "0.1.6" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 819 | dependencies = [ 820 | "generic-array", 821 | "typenum", 822 | ] 823 | 824 | [[package]] 825 | name = "der" 826 | version = "0.6.1" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" 829 | dependencies = [ 830 | "const-oid", 831 | "zeroize", 832 | ] 833 | 834 | [[package]] 835 | name = "deranged" 836 | version = "0.4.1" 837 | source = "registry+https://github.com/rust-lang/crates.io-index" 838 | checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" 839 | dependencies = [ 840 | "powerfmt", 841 | ] 842 | 843 | [[package]] 844 | name = "digest" 845 | version = "0.10.7" 846 | source = "registry+https://github.com/rust-lang/crates.io-index" 847 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 848 | dependencies = [ 849 | "block-buffer", 850 | "crypto-common", 851 | "subtle", 852 | ] 853 | 854 | [[package]] 855 | name = "displaydoc" 856 | version = "0.2.5" 857 | source = "registry+https://github.com/rust-lang/crates.io-index" 858 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 859 | dependencies = [ 860 | "proc-macro2", 861 | "quote", 862 | "syn", 863 | ] 864 | 865 | [[package]] 866 | name = "dunce" 867 | version = "1.0.5" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" 870 | 871 | [[package]] 872 | name = "ecdsa" 873 | version = "0.14.8" 874 | source = "registry+https://github.com/rust-lang/crates.io-index" 875 | checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" 876 | dependencies = [ 877 | "der", 878 | "elliptic-curve", 879 | "rfc6979", 880 | "signature", 881 | ] 882 | 883 | [[package]] 884 | name = "either" 885 | version = "1.15.0" 886 | source = "registry+https://github.com/rust-lang/crates.io-index" 887 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 888 | 889 | [[package]] 890 | name = "elliptic-curve" 891 | version = "0.12.3" 892 | source = "registry+https://github.com/rust-lang/crates.io-index" 893 | checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" 894 | dependencies = [ 895 | "base16ct", 896 | "crypto-bigint 0.4.9", 897 | "der", 898 | "digest", 899 | "ff", 900 | "generic-array", 901 | "group", 902 | "pkcs8", 903 | "rand_core", 904 | "sec1", 905 | "subtle", 906 | "zeroize", 907 | ] 908 | 909 | [[package]] 910 | name = "encoding_rs" 911 | version = "0.8.35" 912 | source = "registry+https://github.com/rust-lang/crates.io-index" 913 | checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 914 | dependencies = [ 915 | "cfg-if", 916 | ] 917 | 918 | [[package]] 919 | name = "equivalent" 920 | version = "1.0.2" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 923 | 924 | [[package]] 925 | name = "errno" 926 | version = "0.3.11" 927 | source = "registry+https://github.com/rust-lang/crates.io-index" 928 | checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" 929 | dependencies = [ 930 | "libc", 931 | "windows-sys 0.59.0", 932 | ] 933 | 934 | [[package]] 935 | name = "fastrand" 936 | version = "2.3.0" 937 | source = "registry+https://github.com/rust-lang/crates.io-index" 938 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 939 | 940 | [[package]] 941 | name = "ff" 942 | version = "0.12.1" 943 | source = "registry+https://github.com/rust-lang/crates.io-index" 944 | checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" 945 | dependencies = [ 946 | "rand_core", 947 | "subtle", 948 | ] 949 | 950 | [[package]] 951 | name = "fnv" 952 | version = "1.0.7" 953 | source = "registry+https://github.com/rust-lang/crates.io-index" 954 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 955 | 956 | [[package]] 957 | name = "foldhash" 958 | version = "0.1.5" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 961 | 962 | [[package]] 963 | name = "foreign-types" 964 | version = "0.3.2" 965 | source = "registry+https://github.com/rust-lang/crates.io-index" 966 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 967 | dependencies = [ 968 | "foreign-types-shared", 969 | ] 970 | 971 | [[package]] 972 | name = "foreign-types-shared" 973 | version = "0.1.1" 974 | source = "registry+https://github.com/rust-lang/crates.io-index" 975 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 976 | 977 | [[package]] 978 | name = "form_urlencoded" 979 | version = "1.2.1" 980 | source = "registry+https://github.com/rust-lang/crates.io-index" 981 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 982 | dependencies = [ 983 | "percent-encoding", 984 | ] 985 | 986 | [[package]] 987 | name = "fs_extra" 988 | version = "1.3.0" 989 | source = "registry+https://github.com/rust-lang/crates.io-index" 990 | checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" 991 | 992 | [[package]] 993 | name = "futures" 994 | version = "0.3.31" 995 | source = "registry+https://github.com/rust-lang/crates.io-index" 996 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 997 | dependencies = [ 998 | "futures-channel", 999 | "futures-core", 1000 | "futures-executor", 1001 | "futures-io", 1002 | "futures-sink", 1003 | "futures-task", 1004 | "futures-util", 1005 | ] 1006 | 1007 | [[package]] 1008 | name = "futures-channel" 1009 | version = "0.3.31" 1010 | source = "registry+https://github.com/rust-lang/crates.io-index" 1011 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 1012 | dependencies = [ 1013 | "futures-core", 1014 | "futures-sink", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "futures-core" 1019 | version = "0.3.31" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 1022 | 1023 | [[package]] 1024 | name = "futures-executor" 1025 | version = "0.3.31" 1026 | source = "registry+https://github.com/rust-lang/crates.io-index" 1027 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 1028 | dependencies = [ 1029 | "futures-core", 1030 | "futures-task", 1031 | "futures-util", 1032 | ] 1033 | 1034 | [[package]] 1035 | name = "futures-io" 1036 | version = "0.3.31" 1037 | source = "registry+https://github.com/rust-lang/crates.io-index" 1038 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 1039 | 1040 | [[package]] 1041 | name = "futures-macro" 1042 | version = "0.3.31" 1043 | source = "registry+https://github.com/rust-lang/crates.io-index" 1044 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 1045 | dependencies = [ 1046 | "proc-macro2", 1047 | "quote", 1048 | "syn", 1049 | ] 1050 | 1051 | [[package]] 1052 | name = "futures-sink" 1053 | version = "0.3.31" 1054 | source = "registry+https://github.com/rust-lang/crates.io-index" 1055 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 1056 | 1057 | [[package]] 1058 | name = "futures-task" 1059 | version = "0.3.31" 1060 | source = "registry+https://github.com/rust-lang/crates.io-index" 1061 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 1062 | 1063 | [[package]] 1064 | name = "futures-util" 1065 | version = "0.3.31" 1066 | source = "registry+https://github.com/rust-lang/crates.io-index" 1067 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 1068 | dependencies = [ 1069 | "futures-channel", 1070 | "futures-core", 1071 | "futures-io", 1072 | "futures-macro", 1073 | "futures-sink", 1074 | "futures-task", 1075 | "memchr", 1076 | "pin-project-lite", 1077 | "pin-utils", 1078 | "slab", 1079 | ] 1080 | 1081 | [[package]] 1082 | name = "generic-array" 1083 | version = "0.14.7" 1084 | source = "registry+https://github.com/rust-lang/crates.io-index" 1085 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1086 | dependencies = [ 1087 | "typenum", 1088 | "version_check", 1089 | ] 1090 | 1091 | [[package]] 1092 | name = "getrandom" 1093 | version = "0.2.15" 1094 | source = "registry+https://github.com/rust-lang/crates.io-index" 1095 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 1096 | dependencies = [ 1097 | "cfg-if", 1098 | "libc", 1099 | "wasi 0.11.0+wasi-snapshot-preview1", 1100 | ] 1101 | 1102 | [[package]] 1103 | name = "getrandom" 1104 | version = "0.3.2" 1105 | source = "registry+https://github.com/rust-lang/crates.io-index" 1106 | checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" 1107 | dependencies = [ 1108 | "cfg-if", 1109 | "libc", 1110 | "r-efi", 1111 | "wasi 0.14.2+wasi-0.2.4", 1112 | ] 1113 | 1114 | [[package]] 1115 | name = "gimli" 1116 | version = "0.31.1" 1117 | source = "registry+https://github.com/rust-lang/crates.io-index" 1118 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 1119 | 1120 | [[package]] 1121 | name = "glob" 1122 | version = "0.3.2" 1123 | source = "registry+https://github.com/rust-lang/crates.io-index" 1124 | checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 1125 | 1126 | [[package]] 1127 | name = "group" 1128 | version = "0.12.1" 1129 | source = "registry+https://github.com/rust-lang/crates.io-index" 1130 | checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" 1131 | dependencies = [ 1132 | "ff", 1133 | "rand_core", 1134 | "subtle", 1135 | ] 1136 | 1137 | [[package]] 1138 | name = "h2" 1139 | version = "0.3.26" 1140 | source = "registry+https://github.com/rust-lang/crates.io-index" 1141 | checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 1142 | dependencies = [ 1143 | "bytes", 1144 | "fnv", 1145 | "futures-core", 1146 | "futures-sink", 1147 | "futures-util", 1148 | "http 0.2.12", 1149 | "indexmap", 1150 | "slab", 1151 | "tokio", 1152 | "tokio-util", 1153 | "tracing", 1154 | ] 1155 | 1156 | [[package]] 1157 | name = "h2" 1158 | version = "0.4.8" 1159 | source = "registry+https://github.com/rust-lang/crates.io-index" 1160 | checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" 1161 | dependencies = [ 1162 | "atomic-waker", 1163 | "bytes", 1164 | "fnv", 1165 | "futures-core", 1166 | "futures-sink", 1167 | "http 1.3.1", 1168 | "indexmap", 1169 | "slab", 1170 | "tokio", 1171 | "tokio-util", 1172 | "tracing", 1173 | ] 1174 | 1175 | [[package]] 1176 | name = "hashbrown" 1177 | version = "0.15.2" 1178 | source = "registry+https://github.com/rust-lang/crates.io-index" 1179 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 1180 | dependencies = [ 1181 | "allocator-api2", 1182 | "equivalent", 1183 | "foldhash", 1184 | ] 1185 | 1186 | [[package]] 1187 | name = "heck" 1188 | version = "0.5.0" 1189 | source = "registry+https://github.com/rust-lang/crates.io-index" 1190 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 1191 | 1192 | [[package]] 1193 | name = "hex" 1194 | version = "0.4.3" 1195 | source = "registry+https://github.com/rust-lang/crates.io-index" 1196 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1197 | 1198 | [[package]] 1199 | name = "hmac" 1200 | version = "0.12.1" 1201 | source = "registry+https://github.com/rust-lang/crates.io-index" 1202 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 1203 | dependencies = [ 1204 | "digest", 1205 | ] 1206 | 1207 | [[package]] 1208 | name = "home" 1209 | version = "0.5.11" 1210 | source = "registry+https://github.com/rust-lang/crates.io-index" 1211 | checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 1212 | dependencies = [ 1213 | "windows-sys 0.59.0", 1214 | ] 1215 | 1216 | [[package]] 1217 | name = "http" 1218 | version = "0.2.12" 1219 | source = "registry+https://github.com/rust-lang/crates.io-index" 1220 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 1221 | dependencies = [ 1222 | "bytes", 1223 | "fnv", 1224 | "itoa", 1225 | ] 1226 | 1227 | [[package]] 1228 | name = "http" 1229 | version = "1.3.1" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 1232 | dependencies = [ 1233 | "bytes", 1234 | "fnv", 1235 | "itoa", 1236 | ] 1237 | 1238 | [[package]] 1239 | name = "http-body" 1240 | version = "0.4.6" 1241 | source = "registry+https://github.com/rust-lang/crates.io-index" 1242 | checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 1243 | dependencies = [ 1244 | "bytes", 1245 | "http 0.2.12", 1246 | "pin-project-lite", 1247 | ] 1248 | 1249 | [[package]] 1250 | name = "http-body" 1251 | version = "1.0.1" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 1254 | dependencies = [ 1255 | "bytes", 1256 | "http 1.3.1", 1257 | ] 1258 | 1259 | [[package]] 1260 | name = "http-body-util" 1261 | version = "0.1.3" 1262 | source = "registry+https://github.com/rust-lang/crates.io-index" 1263 | checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 1264 | dependencies = [ 1265 | "bytes", 1266 | "futures-core", 1267 | "http 1.3.1", 1268 | "http-body 1.0.1", 1269 | "pin-project-lite", 1270 | ] 1271 | 1272 | [[package]] 1273 | name = "httparse" 1274 | version = "1.10.1" 1275 | source = "registry+https://github.com/rust-lang/crates.io-index" 1276 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 1277 | 1278 | [[package]] 1279 | name = "httpdate" 1280 | version = "1.0.3" 1281 | source = "registry+https://github.com/rust-lang/crates.io-index" 1282 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 1283 | 1284 | [[package]] 1285 | name = "hyper" 1286 | version = "0.14.32" 1287 | source = "registry+https://github.com/rust-lang/crates.io-index" 1288 | checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" 1289 | dependencies = [ 1290 | "bytes", 1291 | "futures-channel", 1292 | "futures-core", 1293 | "futures-util", 1294 | "h2 0.3.26", 1295 | "http 0.2.12", 1296 | "http-body 0.4.6", 1297 | "httparse", 1298 | "httpdate", 1299 | "itoa", 1300 | "pin-project-lite", 1301 | "socket2", 1302 | "tokio", 1303 | "tower-service", 1304 | "tracing", 1305 | "want", 1306 | ] 1307 | 1308 | [[package]] 1309 | name = "hyper" 1310 | version = "1.6.0" 1311 | source = "registry+https://github.com/rust-lang/crates.io-index" 1312 | checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 1313 | dependencies = [ 1314 | "bytes", 1315 | "futures-channel", 1316 | "futures-util", 1317 | "h2 0.4.8", 1318 | "http 1.3.1", 1319 | "http-body 1.0.1", 1320 | "httparse", 1321 | "itoa", 1322 | "pin-project-lite", 1323 | "smallvec", 1324 | "tokio", 1325 | "want", 1326 | ] 1327 | 1328 | [[package]] 1329 | name = "hyper-rustls" 1330 | version = "0.24.2" 1331 | source = "registry+https://github.com/rust-lang/crates.io-index" 1332 | checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" 1333 | dependencies = [ 1334 | "futures-util", 1335 | "http 0.2.12", 1336 | "hyper 0.14.32", 1337 | "log", 1338 | "rustls 0.21.12", 1339 | "rustls-native-certs 0.6.3", 1340 | "tokio", 1341 | "tokio-rustls 0.24.1", 1342 | ] 1343 | 1344 | [[package]] 1345 | name = "hyper-rustls" 1346 | version = "0.27.5" 1347 | source = "registry+https://github.com/rust-lang/crates.io-index" 1348 | checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" 1349 | dependencies = [ 1350 | "futures-util", 1351 | "http 1.3.1", 1352 | "hyper 1.6.0", 1353 | "hyper-util", 1354 | "rustls 0.23.25", 1355 | "rustls-native-certs 0.8.1", 1356 | "rustls-pki-types", 1357 | "tokio", 1358 | "tokio-rustls 0.26.2", 1359 | "tower-service", 1360 | ] 1361 | 1362 | [[package]] 1363 | name = "hyper-tls" 1364 | version = "0.6.0" 1365 | source = "registry+https://github.com/rust-lang/crates.io-index" 1366 | checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 1367 | dependencies = [ 1368 | "bytes", 1369 | "http-body-util", 1370 | "hyper 1.6.0", 1371 | "hyper-util", 1372 | "native-tls", 1373 | "tokio", 1374 | "tokio-native-tls", 1375 | "tower-service", 1376 | ] 1377 | 1378 | [[package]] 1379 | name = "hyper-util" 1380 | version = "0.1.11" 1381 | source = "registry+https://github.com/rust-lang/crates.io-index" 1382 | checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" 1383 | dependencies = [ 1384 | "bytes", 1385 | "futures-channel", 1386 | "futures-util", 1387 | "http 1.3.1", 1388 | "http-body 1.0.1", 1389 | "hyper 1.6.0", 1390 | "libc", 1391 | "pin-project-lite", 1392 | "socket2", 1393 | "tokio", 1394 | "tower-service", 1395 | "tracing", 1396 | ] 1397 | 1398 | [[package]] 1399 | name = "icu_collections" 1400 | version = "1.5.0" 1401 | source = "registry+https://github.com/rust-lang/crates.io-index" 1402 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 1403 | dependencies = [ 1404 | "displaydoc", 1405 | "yoke", 1406 | "zerofrom", 1407 | "zerovec", 1408 | ] 1409 | 1410 | [[package]] 1411 | name = "icu_locid" 1412 | version = "1.5.0" 1413 | source = "registry+https://github.com/rust-lang/crates.io-index" 1414 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 1415 | dependencies = [ 1416 | "displaydoc", 1417 | "litemap", 1418 | "tinystr", 1419 | "writeable", 1420 | "zerovec", 1421 | ] 1422 | 1423 | [[package]] 1424 | name = "icu_locid_transform" 1425 | version = "1.5.0" 1426 | source = "registry+https://github.com/rust-lang/crates.io-index" 1427 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 1428 | dependencies = [ 1429 | "displaydoc", 1430 | "icu_locid", 1431 | "icu_locid_transform_data", 1432 | "icu_provider", 1433 | "tinystr", 1434 | "zerovec", 1435 | ] 1436 | 1437 | [[package]] 1438 | name = "icu_locid_transform_data" 1439 | version = "1.5.1" 1440 | source = "registry+https://github.com/rust-lang/crates.io-index" 1441 | checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" 1442 | 1443 | [[package]] 1444 | name = "icu_normalizer" 1445 | version = "1.5.0" 1446 | source = "registry+https://github.com/rust-lang/crates.io-index" 1447 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 1448 | dependencies = [ 1449 | "displaydoc", 1450 | "icu_collections", 1451 | "icu_normalizer_data", 1452 | "icu_properties", 1453 | "icu_provider", 1454 | "smallvec", 1455 | "utf16_iter", 1456 | "utf8_iter", 1457 | "write16", 1458 | "zerovec", 1459 | ] 1460 | 1461 | [[package]] 1462 | name = "icu_normalizer_data" 1463 | version = "1.5.1" 1464 | source = "registry+https://github.com/rust-lang/crates.io-index" 1465 | checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" 1466 | 1467 | [[package]] 1468 | name = "icu_properties" 1469 | version = "1.5.1" 1470 | source = "registry+https://github.com/rust-lang/crates.io-index" 1471 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 1472 | dependencies = [ 1473 | "displaydoc", 1474 | "icu_collections", 1475 | "icu_locid_transform", 1476 | "icu_properties_data", 1477 | "icu_provider", 1478 | "tinystr", 1479 | "zerovec", 1480 | ] 1481 | 1482 | [[package]] 1483 | name = "icu_properties_data" 1484 | version = "1.5.1" 1485 | source = "registry+https://github.com/rust-lang/crates.io-index" 1486 | checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" 1487 | 1488 | [[package]] 1489 | name = "icu_provider" 1490 | version = "1.5.0" 1491 | source = "registry+https://github.com/rust-lang/crates.io-index" 1492 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 1493 | dependencies = [ 1494 | "displaydoc", 1495 | "icu_locid", 1496 | "icu_provider_macros", 1497 | "stable_deref_trait", 1498 | "tinystr", 1499 | "writeable", 1500 | "yoke", 1501 | "zerofrom", 1502 | "zerovec", 1503 | ] 1504 | 1505 | [[package]] 1506 | name = "icu_provider_macros" 1507 | version = "1.5.0" 1508 | source = "registry+https://github.com/rust-lang/crates.io-index" 1509 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 1510 | dependencies = [ 1511 | "proc-macro2", 1512 | "quote", 1513 | "syn", 1514 | ] 1515 | 1516 | [[package]] 1517 | name = "idna" 1518 | version = "1.0.3" 1519 | source = "registry+https://github.com/rust-lang/crates.io-index" 1520 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1521 | dependencies = [ 1522 | "idna_adapter", 1523 | "smallvec", 1524 | "utf8_iter", 1525 | ] 1526 | 1527 | [[package]] 1528 | name = "idna_adapter" 1529 | version = "1.2.0" 1530 | source = "registry+https://github.com/rust-lang/crates.io-index" 1531 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 1532 | dependencies = [ 1533 | "icu_normalizer", 1534 | "icu_properties", 1535 | ] 1536 | 1537 | [[package]] 1538 | name = "indexmap" 1539 | version = "2.9.0" 1540 | source = "registry+https://github.com/rust-lang/crates.io-index" 1541 | checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" 1542 | dependencies = [ 1543 | "equivalent", 1544 | "hashbrown", 1545 | ] 1546 | 1547 | [[package]] 1548 | name = "ipnet" 1549 | version = "2.11.0" 1550 | source = "registry+https://github.com/rust-lang/crates.io-index" 1551 | checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 1552 | 1553 | [[package]] 1554 | name = "itertools" 1555 | version = "0.12.1" 1556 | source = "registry+https://github.com/rust-lang/crates.io-index" 1557 | checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 1558 | dependencies = [ 1559 | "either", 1560 | ] 1561 | 1562 | [[package]] 1563 | name = "itoa" 1564 | version = "1.0.15" 1565 | source = "registry+https://github.com/rust-lang/crates.io-index" 1566 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 1567 | 1568 | [[package]] 1569 | name = "jobserver" 1570 | version = "0.1.33" 1571 | source = "registry+https://github.com/rust-lang/crates.io-index" 1572 | checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" 1573 | dependencies = [ 1574 | "getrandom 0.3.2", 1575 | "libc", 1576 | ] 1577 | 1578 | [[package]] 1579 | name = "js-sys" 1580 | version = "0.3.77" 1581 | source = "registry+https://github.com/rust-lang/crates.io-index" 1582 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 1583 | dependencies = [ 1584 | "once_cell", 1585 | "wasm-bindgen", 1586 | ] 1587 | 1588 | [[package]] 1589 | name = "lazy_static" 1590 | version = "1.5.0" 1591 | source = "registry+https://github.com/rust-lang/crates.io-index" 1592 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1593 | 1594 | [[package]] 1595 | name = "lazycell" 1596 | version = "1.3.0" 1597 | source = "registry+https://github.com/rust-lang/crates.io-index" 1598 | checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" 1599 | 1600 | [[package]] 1601 | name = "libc" 1602 | version = "0.2.171" 1603 | source = "registry+https://github.com/rust-lang/crates.io-index" 1604 | checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" 1605 | 1606 | [[package]] 1607 | name = "libloading" 1608 | version = "0.8.6" 1609 | source = "registry+https://github.com/rust-lang/crates.io-index" 1610 | checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" 1611 | dependencies = [ 1612 | "cfg-if", 1613 | "windows-targets 0.52.6", 1614 | ] 1615 | 1616 | [[package]] 1617 | name = "linux-raw-sys" 1618 | version = "0.4.15" 1619 | source = "registry+https://github.com/rust-lang/crates.io-index" 1620 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 1621 | 1622 | [[package]] 1623 | name = "linux-raw-sys" 1624 | version = "0.9.3" 1625 | source = "registry+https://github.com/rust-lang/crates.io-index" 1626 | checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" 1627 | 1628 | [[package]] 1629 | name = "litemap" 1630 | version = "0.7.5" 1631 | source = "registry+https://github.com/rust-lang/crates.io-index" 1632 | checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" 1633 | 1634 | [[package]] 1635 | name = "log" 1636 | version = "0.4.27" 1637 | source = "registry+https://github.com/rust-lang/crates.io-index" 1638 | checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 1639 | 1640 | [[package]] 1641 | name = "lru" 1642 | version = "0.12.5" 1643 | source = "registry+https://github.com/rust-lang/crates.io-index" 1644 | checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" 1645 | dependencies = [ 1646 | "hashbrown", 1647 | ] 1648 | 1649 | [[package]] 1650 | name = "md-5" 1651 | version = "0.10.6" 1652 | source = "registry+https://github.com/rust-lang/crates.io-index" 1653 | checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 1654 | dependencies = [ 1655 | "cfg-if", 1656 | "digest", 1657 | ] 1658 | 1659 | [[package]] 1660 | name = "memchr" 1661 | version = "2.7.4" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1664 | 1665 | [[package]] 1666 | name = "mime" 1667 | version = "0.3.17" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1670 | 1671 | [[package]] 1672 | name = "minimal-lexical" 1673 | version = "0.2.1" 1674 | source = "registry+https://github.com/rust-lang/crates.io-index" 1675 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1676 | 1677 | [[package]] 1678 | name = "miniz_oxide" 1679 | version = "0.8.7" 1680 | source = "registry+https://github.com/rust-lang/crates.io-index" 1681 | checksum = "ff70ce3e48ae43fa075863cef62e8b43b71a4f2382229920e0df362592919430" 1682 | dependencies = [ 1683 | "adler2", 1684 | ] 1685 | 1686 | [[package]] 1687 | name = "mio" 1688 | version = "1.0.3" 1689 | source = "registry+https://github.com/rust-lang/crates.io-index" 1690 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 1691 | dependencies = [ 1692 | "libc", 1693 | "wasi 0.11.0+wasi-snapshot-preview1", 1694 | "windows-sys 0.52.0", 1695 | ] 1696 | 1697 | [[package]] 1698 | name = "native-tls" 1699 | version = "0.2.14" 1700 | source = "registry+https://github.com/rust-lang/crates.io-index" 1701 | checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 1702 | dependencies = [ 1703 | "libc", 1704 | "log", 1705 | "openssl", 1706 | "openssl-probe", 1707 | "openssl-sys", 1708 | "schannel", 1709 | "security-framework 2.11.1", 1710 | "security-framework-sys", 1711 | "tempfile", 1712 | ] 1713 | 1714 | [[package]] 1715 | name = "nom" 1716 | version = "7.1.3" 1717 | source = "registry+https://github.com/rust-lang/crates.io-index" 1718 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1719 | dependencies = [ 1720 | "memchr", 1721 | "minimal-lexical", 1722 | ] 1723 | 1724 | [[package]] 1725 | name = "num-conv" 1726 | version = "0.1.0" 1727 | source = "registry+https://github.com/rust-lang/crates.io-index" 1728 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1729 | 1730 | [[package]] 1731 | name = "num-integer" 1732 | version = "0.1.46" 1733 | source = "registry+https://github.com/rust-lang/crates.io-index" 1734 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1735 | dependencies = [ 1736 | "num-traits", 1737 | ] 1738 | 1739 | [[package]] 1740 | name = "num-traits" 1741 | version = "0.2.19" 1742 | source = "registry+https://github.com/rust-lang/crates.io-index" 1743 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1744 | dependencies = [ 1745 | "autocfg", 1746 | ] 1747 | 1748 | [[package]] 1749 | name = "object" 1750 | version = "0.36.7" 1751 | source = "registry+https://github.com/rust-lang/crates.io-index" 1752 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1753 | dependencies = [ 1754 | "memchr", 1755 | ] 1756 | 1757 | [[package]] 1758 | name = "once_cell" 1759 | version = "1.21.3" 1760 | source = "registry+https://github.com/rust-lang/crates.io-index" 1761 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 1762 | 1763 | [[package]] 1764 | name = "openssl" 1765 | version = "0.10.72" 1766 | source = "registry+https://github.com/rust-lang/crates.io-index" 1767 | checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" 1768 | dependencies = [ 1769 | "bitflags", 1770 | "cfg-if", 1771 | "foreign-types", 1772 | "libc", 1773 | "once_cell", 1774 | "openssl-macros", 1775 | "openssl-sys", 1776 | ] 1777 | 1778 | [[package]] 1779 | name = "openssl-macros" 1780 | version = "0.1.1" 1781 | source = "registry+https://github.com/rust-lang/crates.io-index" 1782 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1783 | dependencies = [ 1784 | "proc-macro2", 1785 | "quote", 1786 | "syn", 1787 | ] 1788 | 1789 | [[package]] 1790 | name = "openssl-probe" 1791 | version = "0.1.6" 1792 | source = "registry+https://github.com/rust-lang/crates.io-index" 1793 | checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 1794 | 1795 | [[package]] 1796 | name = "openssl-sys" 1797 | version = "0.9.107" 1798 | source = "registry+https://github.com/rust-lang/crates.io-index" 1799 | checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" 1800 | dependencies = [ 1801 | "cc", 1802 | "libc", 1803 | "pkg-config", 1804 | "vcpkg", 1805 | ] 1806 | 1807 | [[package]] 1808 | name = "outref" 1809 | version = "0.5.2" 1810 | source = "registry+https://github.com/rust-lang/crates.io-index" 1811 | checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" 1812 | 1813 | [[package]] 1814 | name = "p256" 1815 | version = "0.11.1" 1816 | source = "registry+https://github.com/rust-lang/crates.io-index" 1817 | checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" 1818 | dependencies = [ 1819 | "ecdsa", 1820 | "elliptic-curve", 1821 | "sha2", 1822 | ] 1823 | 1824 | [[package]] 1825 | name = "percent-encoding" 1826 | version = "2.3.1" 1827 | source = "registry+https://github.com/rust-lang/crates.io-index" 1828 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1829 | 1830 | [[package]] 1831 | name = "pin-project-lite" 1832 | version = "0.2.16" 1833 | source = "registry+https://github.com/rust-lang/crates.io-index" 1834 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1835 | 1836 | [[package]] 1837 | name = "pin-utils" 1838 | version = "0.1.0" 1839 | source = "registry+https://github.com/rust-lang/crates.io-index" 1840 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1841 | 1842 | [[package]] 1843 | name = "pkcs8" 1844 | version = "0.9.0" 1845 | source = "registry+https://github.com/rust-lang/crates.io-index" 1846 | checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" 1847 | dependencies = [ 1848 | "der", 1849 | "spki", 1850 | ] 1851 | 1852 | [[package]] 1853 | name = "pkg-config" 1854 | version = "0.3.32" 1855 | source = "registry+https://github.com/rust-lang/crates.io-index" 1856 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1857 | 1858 | [[package]] 1859 | name = "powerfmt" 1860 | version = "0.2.0" 1861 | source = "registry+https://github.com/rust-lang/crates.io-index" 1862 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1863 | 1864 | [[package]] 1865 | name = "prettyplease" 1866 | version = "0.2.32" 1867 | source = "registry+https://github.com/rust-lang/crates.io-index" 1868 | checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" 1869 | dependencies = [ 1870 | "proc-macro2", 1871 | "syn", 1872 | ] 1873 | 1874 | [[package]] 1875 | name = "proc-macro2" 1876 | version = "1.0.94" 1877 | source = "registry+https://github.com/rust-lang/crates.io-index" 1878 | checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" 1879 | dependencies = [ 1880 | "unicode-ident", 1881 | ] 1882 | 1883 | [[package]] 1884 | name = "quote" 1885 | version = "1.0.40" 1886 | source = "registry+https://github.com/rust-lang/crates.io-index" 1887 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1888 | dependencies = [ 1889 | "proc-macro2", 1890 | ] 1891 | 1892 | [[package]] 1893 | name = "r-efi" 1894 | version = "5.2.0" 1895 | source = "registry+https://github.com/rust-lang/crates.io-index" 1896 | checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 1897 | 1898 | [[package]] 1899 | name = "rand_core" 1900 | version = "0.6.4" 1901 | source = "registry+https://github.com/rust-lang/crates.io-index" 1902 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1903 | dependencies = [ 1904 | "getrandom 0.2.15", 1905 | ] 1906 | 1907 | [[package]] 1908 | name = "regex" 1909 | version = "1.11.1" 1910 | source = "registry+https://github.com/rust-lang/crates.io-index" 1911 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1912 | dependencies = [ 1913 | "aho-corasick", 1914 | "memchr", 1915 | "regex-automata", 1916 | "regex-syntax", 1917 | ] 1918 | 1919 | [[package]] 1920 | name = "regex-automata" 1921 | version = "0.4.9" 1922 | source = "registry+https://github.com/rust-lang/crates.io-index" 1923 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1924 | dependencies = [ 1925 | "aho-corasick", 1926 | "memchr", 1927 | "regex-syntax", 1928 | ] 1929 | 1930 | [[package]] 1931 | name = "regex-lite" 1932 | version = "0.1.6" 1933 | source = "registry+https://github.com/rust-lang/crates.io-index" 1934 | checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" 1935 | 1936 | [[package]] 1937 | name = "regex-syntax" 1938 | version = "0.8.5" 1939 | source = "registry+https://github.com/rust-lang/crates.io-index" 1940 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1941 | 1942 | [[package]] 1943 | name = "reqwest" 1944 | version = "0.12.15" 1945 | source = "registry+https://github.com/rust-lang/crates.io-index" 1946 | checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" 1947 | dependencies = [ 1948 | "base64 0.22.1", 1949 | "bytes", 1950 | "encoding_rs", 1951 | "futures-core", 1952 | "futures-util", 1953 | "h2 0.4.8", 1954 | "http 1.3.1", 1955 | "http-body 1.0.1", 1956 | "http-body-util", 1957 | "hyper 1.6.0", 1958 | "hyper-rustls 0.27.5", 1959 | "hyper-tls", 1960 | "hyper-util", 1961 | "ipnet", 1962 | "js-sys", 1963 | "log", 1964 | "mime", 1965 | "native-tls", 1966 | "once_cell", 1967 | "percent-encoding", 1968 | "pin-project-lite", 1969 | "rustls-pemfile 2.2.0", 1970 | "serde", 1971 | "serde_json", 1972 | "serde_urlencoded", 1973 | "sync_wrapper", 1974 | "system-configuration", 1975 | "tokio", 1976 | "tokio-native-tls", 1977 | "tokio-util", 1978 | "tower", 1979 | "tower-service", 1980 | "url", 1981 | "wasm-bindgen", 1982 | "wasm-bindgen-futures", 1983 | "wasm-streams", 1984 | "web-sys", 1985 | "windows-registry", 1986 | ] 1987 | 1988 | [[package]] 1989 | name = "rfc6979" 1990 | version = "0.3.1" 1991 | source = "registry+https://github.com/rust-lang/crates.io-index" 1992 | checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" 1993 | dependencies = [ 1994 | "crypto-bigint 0.4.9", 1995 | "hmac", 1996 | "zeroize", 1997 | ] 1998 | 1999 | [[package]] 2000 | name = "ring" 2001 | version = "0.17.14" 2002 | source = "registry+https://github.com/rust-lang/crates.io-index" 2003 | checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 2004 | dependencies = [ 2005 | "cc", 2006 | "cfg-if", 2007 | "getrandom 0.2.15", 2008 | "libc", 2009 | "untrusted", 2010 | "windows-sys 0.52.0", 2011 | ] 2012 | 2013 | [[package]] 2014 | name = "rustc-demangle" 2015 | version = "0.1.24" 2016 | source = "registry+https://github.com/rust-lang/crates.io-index" 2017 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 2018 | 2019 | [[package]] 2020 | name = "rustc-hash" 2021 | version = "1.1.0" 2022 | source = "registry+https://github.com/rust-lang/crates.io-index" 2023 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 2024 | 2025 | [[package]] 2026 | name = "rustc_version" 2027 | version = "0.4.1" 2028 | source = "registry+https://github.com/rust-lang/crates.io-index" 2029 | checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 2030 | dependencies = [ 2031 | "semver", 2032 | ] 2033 | 2034 | [[package]] 2035 | name = "rustix" 2036 | version = "0.38.44" 2037 | source = "registry+https://github.com/rust-lang/crates.io-index" 2038 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 2039 | dependencies = [ 2040 | "bitflags", 2041 | "errno", 2042 | "libc", 2043 | "linux-raw-sys 0.4.15", 2044 | "windows-sys 0.59.0", 2045 | ] 2046 | 2047 | [[package]] 2048 | name = "rustix" 2049 | version = "1.0.5" 2050 | source = "registry+https://github.com/rust-lang/crates.io-index" 2051 | checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" 2052 | dependencies = [ 2053 | "bitflags", 2054 | "errno", 2055 | "libc", 2056 | "linux-raw-sys 0.9.3", 2057 | "windows-sys 0.59.0", 2058 | ] 2059 | 2060 | [[package]] 2061 | name = "rustls" 2062 | version = "0.21.12" 2063 | source = "registry+https://github.com/rust-lang/crates.io-index" 2064 | checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" 2065 | dependencies = [ 2066 | "log", 2067 | "ring", 2068 | "rustls-webpki 0.101.7", 2069 | "sct", 2070 | ] 2071 | 2072 | [[package]] 2073 | name = "rustls" 2074 | version = "0.23.25" 2075 | source = "registry+https://github.com/rust-lang/crates.io-index" 2076 | checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" 2077 | dependencies = [ 2078 | "aws-lc-rs", 2079 | "once_cell", 2080 | "rustls-pki-types", 2081 | "rustls-webpki 0.103.1", 2082 | "subtle", 2083 | "zeroize", 2084 | ] 2085 | 2086 | [[package]] 2087 | name = "rustls-native-certs" 2088 | version = "0.6.3" 2089 | source = "registry+https://github.com/rust-lang/crates.io-index" 2090 | checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" 2091 | dependencies = [ 2092 | "openssl-probe", 2093 | "rustls-pemfile 1.0.4", 2094 | "schannel", 2095 | "security-framework 2.11.1", 2096 | ] 2097 | 2098 | [[package]] 2099 | name = "rustls-native-certs" 2100 | version = "0.8.1" 2101 | source = "registry+https://github.com/rust-lang/crates.io-index" 2102 | checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" 2103 | dependencies = [ 2104 | "openssl-probe", 2105 | "rustls-pki-types", 2106 | "schannel", 2107 | "security-framework 3.2.0", 2108 | ] 2109 | 2110 | [[package]] 2111 | name = "rustls-pemfile" 2112 | version = "1.0.4" 2113 | source = "registry+https://github.com/rust-lang/crates.io-index" 2114 | checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 2115 | dependencies = [ 2116 | "base64 0.21.7", 2117 | ] 2118 | 2119 | [[package]] 2120 | name = "rustls-pemfile" 2121 | version = "2.2.0" 2122 | source = "registry+https://github.com/rust-lang/crates.io-index" 2123 | checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" 2124 | dependencies = [ 2125 | "rustls-pki-types", 2126 | ] 2127 | 2128 | [[package]] 2129 | name = "rustls-pki-types" 2130 | version = "1.11.0" 2131 | source = "registry+https://github.com/rust-lang/crates.io-index" 2132 | checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" 2133 | 2134 | [[package]] 2135 | name = "rustls-webpki" 2136 | version = "0.101.7" 2137 | source = "registry+https://github.com/rust-lang/crates.io-index" 2138 | checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" 2139 | dependencies = [ 2140 | "ring", 2141 | "untrusted", 2142 | ] 2143 | 2144 | [[package]] 2145 | name = "rustls-webpki" 2146 | version = "0.103.1" 2147 | source = "registry+https://github.com/rust-lang/crates.io-index" 2148 | checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" 2149 | dependencies = [ 2150 | "aws-lc-rs", 2151 | "ring", 2152 | "rustls-pki-types", 2153 | "untrusted", 2154 | ] 2155 | 2156 | [[package]] 2157 | name = "rustversion" 2158 | version = "1.0.20" 2159 | source = "registry+https://github.com/rust-lang/crates.io-index" 2160 | checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" 2161 | 2162 | [[package]] 2163 | name = "ryu" 2164 | version = "1.0.20" 2165 | source = "registry+https://github.com/rust-lang/crates.io-index" 2166 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 2167 | 2168 | [[package]] 2169 | name = "schannel" 2170 | version = "0.1.27" 2171 | source = "registry+https://github.com/rust-lang/crates.io-index" 2172 | checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 2173 | dependencies = [ 2174 | "windows-sys 0.59.0", 2175 | ] 2176 | 2177 | [[package]] 2178 | name = "sct" 2179 | version = "0.7.1" 2180 | source = "registry+https://github.com/rust-lang/crates.io-index" 2181 | checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" 2182 | dependencies = [ 2183 | "ring", 2184 | "untrusted", 2185 | ] 2186 | 2187 | [[package]] 2188 | name = "sec1" 2189 | version = "0.3.0" 2190 | source = "registry+https://github.com/rust-lang/crates.io-index" 2191 | checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" 2192 | dependencies = [ 2193 | "base16ct", 2194 | "der", 2195 | "generic-array", 2196 | "pkcs8", 2197 | "subtle", 2198 | "zeroize", 2199 | ] 2200 | 2201 | [[package]] 2202 | name = "security-framework" 2203 | version = "2.11.1" 2204 | source = "registry+https://github.com/rust-lang/crates.io-index" 2205 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 2206 | dependencies = [ 2207 | "bitflags", 2208 | "core-foundation 0.9.4", 2209 | "core-foundation-sys", 2210 | "libc", 2211 | "security-framework-sys", 2212 | ] 2213 | 2214 | [[package]] 2215 | name = "security-framework" 2216 | version = "3.2.0" 2217 | source = "registry+https://github.com/rust-lang/crates.io-index" 2218 | checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" 2219 | dependencies = [ 2220 | "bitflags", 2221 | "core-foundation 0.10.0", 2222 | "core-foundation-sys", 2223 | "libc", 2224 | "security-framework-sys", 2225 | ] 2226 | 2227 | [[package]] 2228 | name = "security-framework-sys" 2229 | version = "2.14.0" 2230 | source = "registry+https://github.com/rust-lang/crates.io-index" 2231 | checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 2232 | dependencies = [ 2233 | "core-foundation-sys", 2234 | "libc", 2235 | ] 2236 | 2237 | [[package]] 2238 | name = "semver" 2239 | version = "1.0.26" 2240 | source = "registry+https://github.com/rust-lang/crates.io-index" 2241 | checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 2242 | 2243 | [[package]] 2244 | name = "serde" 2245 | version = "1.0.219" 2246 | source = "registry+https://github.com/rust-lang/crates.io-index" 2247 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 2248 | dependencies = [ 2249 | "serde_derive", 2250 | ] 2251 | 2252 | [[package]] 2253 | name = "serde_derive" 2254 | version = "1.0.219" 2255 | source = "registry+https://github.com/rust-lang/crates.io-index" 2256 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 2257 | dependencies = [ 2258 | "proc-macro2", 2259 | "quote", 2260 | "syn", 2261 | ] 2262 | 2263 | [[package]] 2264 | name = "serde_json" 2265 | version = "1.0.140" 2266 | source = "registry+https://github.com/rust-lang/crates.io-index" 2267 | checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 2268 | dependencies = [ 2269 | "itoa", 2270 | "memchr", 2271 | "ryu", 2272 | "serde", 2273 | ] 2274 | 2275 | [[package]] 2276 | name = "serde_spanned" 2277 | version = "0.6.8" 2278 | source = "registry+https://github.com/rust-lang/crates.io-index" 2279 | checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" 2280 | dependencies = [ 2281 | "serde", 2282 | ] 2283 | 2284 | [[package]] 2285 | name = "serde_urlencoded" 2286 | version = "0.7.1" 2287 | source = "registry+https://github.com/rust-lang/crates.io-index" 2288 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2289 | dependencies = [ 2290 | "form_urlencoded", 2291 | "itoa", 2292 | "ryu", 2293 | "serde", 2294 | ] 2295 | 2296 | [[package]] 2297 | name = "sha1" 2298 | version = "0.10.6" 2299 | source = "registry+https://github.com/rust-lang/crates.io-index" 2300 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 2301 | dependencies = [ 2302 | "cfg-if", 2303 | "cpufeatures", 2304 | "digest", 2305 | ] 2306 | 2307 | [[package]] 2308 | name = "sha2" 2309 | version = "0.10.8" 2310 | source = "registry+https://github.com/rust-lang/crates.io-index" 2311 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 2312 | dependencies = [ 2313 | "cfg-if", 2314 | "cpufeatures", 2315 | "digest", 2316 | ] 2317 | 2318 | [[package]] 2319 | name = "shlex" 2320 | version = "1.3.0" 2321 | source = "registry+https://github.com/rust-lang/crates.io-index" 2322 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 2323 | 2324 | [[package]] 2325 | name = "signal-hook-registry" 2326 | version = "1.4.2" 2327 | source = "registry+https://github.com/rust-lang/crates.io-index" 2328 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 2329 | dependencies = [ 2330 | "libc", 2331 | ] 2332 | 2333 | [[package]] 2334 | name = "signature" 2335 | version = "1.6.4" 2336 | source = "registry+https://github.com/rust-lang/crates.io-index" 2337 | checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" 2338 | dependencies = [ 2339 | "digest", 2340 | "rand_core", 2341 | ] 2342 | 2343 | [[package]] 2344 | name = "slab" 2345 | version = "0.4.9" 2346 | source = "registry+https://github.com/rust-lang/crates.io-index" 2347 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 2348 | dependencies = [ 2349 | "autocfg", 2350 | ] 2351 | 2352 | [[package]] 2353 | name = "smallvec" 2354 | version = "1.15.0" 2355 | source = "registry+https://github.com/rust-lang/crates.io-index" 2356 | checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" 2357 | 2358 | [[package]] 2359 | name = "socket2" 2360 | version = "0.5.9" 2361 | source = "registry+https://github.com/rust-lang/crates.io-index" 2362 | checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" 2363 | dependencies = [ 2364 | "libc", 2365 | "windows-sys 0.52.0", 2366 | ] 2367 | 2368 | [[package]] 2369 | name = "spki" 2370 | version = "0.6.0" 2371 | source = "registry+https://github.com/rust-lang/crates.io-index" 2372 | checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" 2373 | dependencies = [ 2374 | "base64ct", 2375 | "der", 2376 | ] 2377 | 2378 | [[package]] 2379 | name = "stable_deref_trait" 2380 | version = "1.2.0" 2381 | source = "registry+https://github.com/rust-lang/crates.io-index" 2382 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2383 | 2384 | [[package]] 2385 | name = "subtle" 2386 | version = "2.6.1" 2387 | source = "registry+https://github.com/rust-lang/crates.io-index" 2388 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 2389 | 2390 | [[package]] 2391 | name = "syn" 2392 | version = "2.0.100" 2393 | source = "registry+https://github.com/rust-lang/crates.io-index" 2394 | checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" 2395 | dependencies = [ 2396 | "proc-macro2", 2397 | "quote", 2398 | "unicode-ident", 2399 | ] 2400 | 2401 | [[package]] 2402 | name = "sync_wrapper" 2403 | version = "1.0.2" 2404 | source = "registry+https://github.com/rust-lang/crates.io-index" 2405 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 2406 | dependencies = [ 2407 | "futures-core", 2408 | ] 2409 | 2410 | [[package]] 2411 | name = "synstructure" 2412 | version = "0.13.1" 2413 | source = "registry+https://github.com/rust-lang/crates.io-index" 2414 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 2415 | dependencies = [ 2416 | "proc-macro2", 2417 | "quote", 2418 | "syn", 2419 | ] 2420 | 2421 | [[package]] 2422 | name = "system-configuration" 2423 | version = "0.6.1" 2424 | source = "registry+https://github.com/rust-lang/crates.io-index" 2425 | checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" 2426 | dependencies = [ 2427 | "bitflags", 2428 | "core-foundation 0.9.4", 2429 | "system-configuration-sys", 2430 | ] 2431 | 2432 | [[package]] 2433 | name = "system-configuration-sys" 2434 | version = "0.6.0" 2435 | source = "registry+https://github.com/rust-lang/crates.io-index" 2436 | checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" 2437 | dependencies = [ 2438 | "core-foundation-sys", 2439 | "libc", 2440 | ] 2441 | 2442 | [[package]] 2443 | name = "tempfile" 2444 | version = "3.19.1" 2445 | source = "registry+https://github.com/rust-lang/crates.io-index" 2446 | checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" 2447 | dependencies = [ 2448 | "fastrand", 2449 | "getrandom 0.3.2", 2450 | "once_cell", 2451 | "rustix 1.0.5", 2452 | "windows-sys 0.59.0", 2453 | ] 2454 | 2455 | [[package]] 2456 | name = "time" 2457 | version = "0.3.41" 2458 | source = "registry+https://github.com/rust-lang/crates.io-index" 2459 | checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 2460 | dependencies = [ 2461 | "deranged", 2462 | "num-conv", 2463 | "powerfmt", 2464 | "serde", 2465 | "time-core", 2466 | "time-macros", 2467 | ] 2468 | 2469 | [[package]] 2470 | name = "time-core" 2471 | version = "0.1.4" 2472 | source = "registry+https://github.com/rust-lang/crates.io-index" 2473 | checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 2474 | 2475 | [[package]] 2476 | name = "time-macros" 2477 | version = "0.2.22" 2478 | source = "registry+https://github.com/rust-lang/crates.io-index" 2479 | checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" 2480 | dependencies = [ 2481 | "num-conv", 2482 | "time-core", 2483 | ] 2484 | 2485 | [[package]] 2486 | name = "tinystr" 2487 | version = "0.7.6" 2488 | source = "registry+https://github.com/rust-lang/crates.io-index" 2489 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 2490 | dependencies = [ 2491 | "displaydoc", 2492 | "zerovec", 2493 | ] 2494 | 2495 | [[package]] 2496 | name = "tokio" 2497 | version = "1.44.1" 2498 | source = "registry+https://github.com/rust-lang/crates.io-index" 2499 | checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" 2500 | dependencies = [ 2501 | "backtrace", 2502 | "bytes", 2503 | "libc", 2504 | "mio", 2505 | "pin-project-lite", 2506 | "signal-hook-registry", 2507 | "socket2", 2508 | "tokio-macros", 2509 | "windows-sys 0.52.0", 2510 | ] 2511 | 2512 | [[package]] 2513 | name = "tokio-macros" 2514 | version = "2.5.0" 2515 | source = "registry+https://github.com/rust-lang/crates.io-index" 2516 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 2517 | dependencies = [ 2518 | "proc-macro2", 2519 | "quote", 2520 | "syn", 2521 | ] 2522 | 2523 | [[package]] 2524 | name = "tokio-native-tls" 2525 | version = "0.3.1" 2526 | source = "registry+https://github.com/rust-lang/crates.io-index" 2527 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 2528 | dependencies = [ 2529 | "native-tls", 2530 | "tokio", 2531 | ] 2532 | 2533 | [[package]] 2534 | name = "tokio-rustls" 2535 | version = "0.24.1" 2536 | source = "registry+https://github.com/rust-lang/crates.io-index" 2537 | checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" 2538 | dependencies = [ 2539 | "rustls 0.21.12", 2540 | "tokio", 2541 | ] 2542 | 2543 | [[package]] 2544 | name = "tokio-rustls" 2545 | version = "0.26.2" 2546 | source = "registry+https://github.com/rust-lang/crates.io-index" 2547 | checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" 2548 | dependencies = [ 2549 | "rustls 0.23.25", 2550 | "tokio", 2551 | ] 2552 | 2553 | [[package]] 2554 | name = "tokio-util" 2555 | version = "0.7.14" 2556 | source = "registry+https://github.com/rust-lang/crates.io-index" 2557 | checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" 2558 | dependencies = [ 2559 | "bytes", 2560 | "futures-core", 2561 | "futures-sink", 2562 | "pin-project-lite", 2563 | "tokio", 2564 | ] 2565 | 2566 | [[package]] 2567 | name = "toml" 2568 | version = "0.8.20" 2569 | source = "registry+https://github.com/rust-lang/crates.io-index" 2570 | checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" 2571 | dependencies = [ 2572 | "serde", 2573 | "serde_spanned", 2574 | "toml_datetime", 2575 | "toml_edit", 2576 | ] 2577 | 2578 | [[package]] 2579 | name = "toml_datetime" 2580 | version = "0.6.8" 2581 | source = "registry+https://github.com/rust-lang/crates.io-index" 2582 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 2583 | dependencies = [ 2584 | "serde", 2585 | ] 2586 | 2587 | [[package]] 2588 | name = "toml_edit" 2589 | version = "0.22.24" 2590 | source = "registry+https://github.com/rust-lang/crates.io-index" 2591 | checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" 2592 | dependencies = [ 2593 | "indexmap", 2594 | "serde", 2595 | "serde_spanned", 2596 | "toml_datetime", 2597 | "winnow", 2598 | ] 2599 | 2600 | [[package]] 2601 | name = "tower" 2602 | version = "0.5.2" 2603 | source = "registry+https://github.com/rust-lang/crates.io-index" 2604 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 2605 | dependencies = [ 2606 | "futures-core", 2607 | "futures-util", 2608 | "pin-project-lite", 2609 | "sync_wrapper", 2610 | "tokio", 2611 | "tower-layer", 2612 | "tower-service", 2613 | ] 2614 | 2615 | [[package]] 2616 | name = "tower-layer" 2617 | version = "0.3.3" 2618 | source = "registry+https://github.com/rust-lang/crates.io-index" 2619 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 2620 | 2621 | [[package]] 2622 | name = "tower-service" 2623 | version = "0.3.3" 2624 | source = "registry+https://github.com/rust-lang/crates.io-index" 2625 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 2626 | 2627 | [[package]] 2628 | name = "tracing" 2629 | version = "0.1.41" 2630 | source = "registry+https://github.com/rust-lang/crates.io-index" 2631 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 2632 | dependencies = [ 2633 | "pin-project-lite", 2634 | "tracing-attributes", 2635 | "tracing-core", 2636 | ] 2637 | 2638 | [[package]] 2639 | name = "tracing-attributes" 2640 | version = "0.1.28" 2641 | source = "registry+https://github.com/rust-lang/crates.io-index" 2642 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 2643 | dependencies = [ 2644 | "proc-macro2", 2645 | "quote", 2646 | "syn", 2647 | ] 2648 | 2649 | [[package]] 2650 | name = "tracing-core" 2651 | version = "0.1.33" 2652 | source = "registry+https://github.com/rust-lang/crates.io-index" 2653 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 2654 | dependencies = [ 2655 | "once_cell", 2656 | ] 2657 | 2658 | [[package]] 2659 | name = "try-lock" 2660 | version = "0.2.5" 2661 | source = "registry+https://github.com/rust-lang/crates.io-index" 2662 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2663 | 2664 | [[package]] 2665 | name = "typenum" 2666 | version = "1.18.0" 2667 | source = "registry+https://github.com/rust-lang/crates.io-index" 2668 | checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 2669 | 2670 | [[package]] 2671 | name = "unicode-ident" 2672 | version = "1.0.18" 2673 | source = "registry+https://github.com/rust-lang/crates.io-index" 2674 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 2675 | 2676 | [[package]] 2677 | name = "untrusted" 2678 | version = "0.9.0" 2679 | source = "registry+https://github.com/rust-lang/crates.io-index" 2680 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 2681 | 2682 | [[package]] 2683 | name = "url" 2684 | version = "2.5.4" 2685 | source = "registry+https://github.com/rust-lang/crates.io-index" 2686 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 2687 | dependencies = [ 2688 | "form_urlencoded", 2689 | "idna", 2690 | "percent-encoding", 2691 | ] 2692 | 2693 | [[package]] 2694 | name = "urlencoding" 2695 | version = "2.1.3" 2696 | source = "registry+https://github.com/rust-lang/crates.io-index" 2697 | checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" 2698 | 2699 | [[package]] 2700 | name = "utf16_iter" 2701 | version = "1.0.5" 2702 | source = "registry+https://github.com/rust-lang/crates.io-index" 2703 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 2704 | 2705 | [[package]] 2706 | name = "utf8_iter" 2707 | version = "1.0.4" 2708 | source = "registry+https://github.com/rust-lang/crates.io-index" 2709 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2710 | 2711 | [[package]] 2712 | name = "uuid" 2713 | version = "1.16.0" 2714 | source = "registry+https://github.com/rust-lang/crates.io-index" 2715 | checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" 2716 | 2717 | [[package]] 2718 | name = "vcpkg" 2719 | version = "0.2.15" 2720 | source = "registry+https://github.com/rust-lang/crates.io-index" 2721 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2722 | 2723 | [[package]] 2724 | name = "version_check" 2725 | version = "0.9.5" 2726 | source = "registry+https://github.com/rust-lang/crates.io-index" 2727 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2728 | 2729 | [[package]] 2730 | name = "vsimd" 2731 | version = "0.8.0" 2732 | source = "registry+https://github.com/rust-lang/crates.io-index" 2733 | checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" 2734 | 2735 | [[package]] 2736 | name = "want" 2737 | version = "0.3.1" 2738 | source = "registry+https://github.com/rust-lang/crates.io-index" 2739 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2740 | dependencies = [ 2741 | "try-lock", 2742 | ] 2743 | 2744 | [[package]] 2745 | name = "wasi" 2746 | version = "0.11.0+wasi-snapshot-preview1" 2747 | source = "registry+https://github.com/rust-lang/crates.io-index" 2748 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2749 | 2750 | [[package]] 2751 | name = "wasi" 2752 | version = "0.14.2+wasi-0.2.4" 2753 | source = "registry+https://github.com/rust-lang/crates.io-index" 2754 | checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 2755 | dependencies = [ 2756 | "wit-bindgen-rt", 2757 | ] 2758 | 2759 | [[package]] 2760 | name = "wasm-bindgen" 2761 | version = "0.2.100" 2762 | source = "registry+https://github.com/rust-lang/crates.io-index" 2763 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 2764 | dependencies = [ 2765 | "cfg-if", 2766 | "once_cell", 2767 | "rustversion", 2768 | "wasm-bindgen-macro", 2769 | ] 2770 | 2771 | [[package]] 2772 | name = "wasm-bindgen-backend" 2773 | version = "0.2.100" 2774 | source = "registry+https://github.com/rust-lang/crates.io-index" 2775 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 2776 | dependencies = [ 2777 | "bumpalo", 2778 | "log", 2779 | "proc-macro2", 2780 | "quote", 2781 | "syn", 2782 | "wasm-bindgen-shared", 2783 | ] 2784 | 2785 | [[package]] 2786 | name = "wasm-bindgen-futures" 2787 | version = "0.4.50" 2788 | source = "registry+https://github.com/rust-lang/crates.io-index" 2789 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 2790 | dependencies = [ 2791 | "cfg-if", 2792 | "js-sys", 2793 | "once_cell", 2794 | "wasm-bindgen", 2795 | "web-sys", 2796 | ] 2797 | 2798 | [[package]] 2799 | name = "wasm-bindgen-macro" 2800 | version = "0.2.100" 2801 | source = "registry+https://github.com/rust-lang/crates.io-index" 2802 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 2803 | dependencies = [ 2804 | "quote", 2805 | "wasm-bindgen-macro-support", 2806 | ] 2807 | 2808 | [[package]] 2809 | name = "wasm-bindgen-macro-support" 2810 | version = "0.2.100" 2811 | source = "registry+https://github.com/rust-lang/crates.io-index" 2812 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 2813 | dependencies = [ 2814 | "proc-macro2", 2815 | "quote", 2816 | "syn", 2817 | "wasm-bindgen-backend", 2818 | "wasm-bindgen-shared", 2819 | ] 2820 | 2821 | [[package]] 2822 | name = "wasm-bindgen-shared" 2823 | version = "0.2.100" 2824 | source = "registry+https://github.com/rust-lang/crates.io-index" 2825 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 2826 | dependencies = [ 2827 | "unicode-ident", 2828 | ] 2829 | 2830 | [[package]] 2831 | name = "wasm-streams" 2832 | version = "0.4.2" 2833 | source = "registry+https://github.com/rust-lang/crates.io-index" 2834 | checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" 2835 | dependencies = [ 2836 | "futures-util", 2837 | "js-sys", 2838 | "wasm-bindgen", 2839 | "wasm-bindgen-futures", 2840 | "web-sys", 2841 | ] 2842 | 2843 | [[package]] 2844 | name = "web-sys" 2845 | version = "0.3.77" 2846 | source = "registry+https://github.com/rust-lang/crates.io-index" 2847 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 2848 | dependencies = [ 2849 | "js-sys", 2850 | "wasm-bindgen", 2851 | ] 2852 | 2853 | [[package]] 2854 | name = "which" 2855 | version = "4.4.2" 2856 | source = "registry+https://github.com/rust-lang/crates.io-index" 2857 | checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" 2858 | dependencies = [ 2859 | "either", 2860 | "home", 2861 | "once_cell", 2862 | "rustix 0.38.44", 2863 | ] 2864 | 2865 | [[package]] 2866 | name = "windows-link" 2867 | version = "0.1.1" 2868 | source = "registry+https://github.com/rust-lang/crates.io-index" 2869 | checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" 2870 | 2871 | [[package]] 2872 | name = "windows-registry" 2873 | version = "0.4.0" 2874 | source = "registry+https://github.com/rust-lang/crates.io-index" 2875 | checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" 2876 | dependencies = [ 2877 | "windows-result", 2878 | "windows-strings", 2879 | "windows-targets 0.53.0", 2880 | ] 2881 | 2882 | [[package]] 2883 | name = "windows-result" 2884 | version = "0.3.2" 2885 | source = "registry+https://github.com/rust-lang/crates.io-index" 2886 | checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" 2887 | dependencies = [ 2888 | "windows-link", 2889 | ] 2890 | 2891 | [[package]] 2892 | name = "windows-strings" 2893 | version = "0.3.1" 2894 | source = "registry+https://github.com/rust-lang/crates.io-index" 2895 | checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" 2896 | dependencies = [ 2897 | "windows-link", 2898 | ] 2899 | 2900 | [[package]] 2901 | name = "windows-sys" 2902 | version = "0.52.0" 2903 | source = "registry+https://github.com/rust-lang/crates.io-index" 2904 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2905 | dependencies = [ 2906 | "windows-targets 0.52.6", 2907 | ] 2908 | 2909 | [[package]] 2910 | name = "windows-sys" 2911 | version = "0.59.0" 2912 | source = "registry+https://github.com/rust-lang/crates.io-index" 2913 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2914 | dependencies = [ 2915 | "windows-targets 0.52.6", 2916 | ] 2917 | 2918 | [[package]] 2919 | name = "windows-targets" 2920 | version = "0.52.6" 2921 | source = "registry+https://github.com/rust-lang/crates.io-index" 2922 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2923 | dependencies = [ 2924 | "windows_aarch64_gnullvm 0.52.6", 2925 | "windows_aarch64_msvc 0.52.6", 2926 | "windows_i686_gnu 0.52.6", 2927 | "windows_i686_gnullvm 0.52.6", 2928 | "windows_i686_msvc 0.52.6", 2929 | "windows_x86_64_gnu 0.52.6", 2930 | "windows_x86_64_gnullvm 0.52.6", 2931 | "windows_x86_64_msvc 0.52.6", 2932 | ] 2933 | 2934 | [[package]] 2935 | name = "windows-targets" 2936 | version = "0.53.0" 2937 | source = "registry+https://github.com/rust-lang/crates.io-index" 2938 | checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" 2939 | dependencies = [ 2940 | "windows_aarch64_gnullvm 0.53.0", 2941 | "windows_aarch64_msvc 0.53.0", 2942 | "windows_i686_gnu 0.53.0", 2943 | "windows_i686_gnullvm 0.53.0", 2944 | "windows_i686_msvc 0.53.0", 2945 | "windows_x86_64_gnu 0.53.0", 2946 | "windows_x86_64_gnullvm 0.53.0", 2947 | "windows_x86_64_msvc 0.53.0", 2948 | ] 2949 | 2950 | [[package]] 2951 | name = "windows_aarch64_gnullvm" 2952 | version = "0.52.6" 2953 | source = "registry+https://github.com/rust-lang/crates.io-index" 2954 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2955 | 2956 | [[package]] 2957 | name = "windows_aarch64_gnullvm" 2958 | version = "0.53.0" 2959 | source = "registry+https://github.com/rust-lang/crates.io-index" 2960 | checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 2961 | 2962 | [[package]] 2963 | name = "windows_aarch64_msvc" 2964 | version = "0.52.6" 2965 | source = "registry+https://github.com/rust-lang/crates.io-index" 2966 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2967 | 2968 | [[package]] 2969 | name = "windows_aarch64_msvc" 2970 | version = "0.53.0" 2971 | source = "registry+https://github.com/rust-lang/crates.io-index" 2972 | checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 2973 | 2974 | [[package]] 2975 | name = "windows_i686_gnu" 2976 | version = "0.52.6" 2977 | source = "registry+https://github.com/rust-lang/crates.io-index" 2978 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2979 | 2980 | [[package]] 2981 | name = "windows_i686_gnu" 2982 | version = "0.53.0" 2983 | source = "registry+https://github.com/rust-lang/crates.io-index" 2984 | checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 2985 | 2986 | [[package]] 2987 | name = "windows_i686_gnullvm" 2988 | version = "0.52.6" 2989 | source = "registry+https://github.com/rust-lang/crates.io-index" 2990 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2991 | 2992 | [[package]] 2993 | name = "windows_i686_gnullvm" 2994 | version = "0.53.0" 2995 | source = "registry+https://github.com/rust-lang/crates.io-index" 2996 | checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 2997 | 2998 | [[package]] 2999 | name = "windows_i686_msvc" 3000 | version = "0.52.6" 3001 | source = "registry+https://github.com/rust-lang/crates.io-index" 3002 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 3003 | 3004 | [[package]] 3005 | name = "windows_i686_msvc" 3006 | version = "0.53.0" 3007 | source = "registry+https://github.com/rust-lang/crates.io-index" 3008 | checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 3009 | 3010 | [[package]] 3011 | name = "windows_x86_64_gnu" 3012 | version = "0.52.6" 3013 | source = "registry+https://github.com/rust-lang/crates.io-index" 3014 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 3015 | 3016 | [[package]] 3017 | name = "windows_x86_64_gnu" 3018 | version = "0.53.0" 3019 | source = "registry+https://github.com/rust-lang/crates.io-index" 3020 | checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 3021 | 3022 | [[package]] 3023 | name = "windows_x86_64_gnullvm" 3024 | version = "0.52.6" 3025 | source = "registry+https://github.com/rust-lang/crates.io-index" 3026 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 3027 | 3028 | [[package]] 3029 | name = "windows_x86_64_gnullvm" 3030 | version = "0.53.0" 3031 | source = "registry+https://github.com/rust-lang/crates.io-index" 3032 | checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 3033 | 3034 | [[package]] 3035 | name = "windows_x86_64_msvc" 3036 | version = "0.52.6" 3037 | source = "registry+https://github.com/rust-lang/crates.io-index" 3038 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 3039 | 3040 | [[package]] 3041 | name = "windows_x86_64_msvc" 3042 | version = "0.53.0" 3043 | source = "registry+https://github.com/rust-lang/crates.io-index" 3044 | checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 3045 | 3046 | [[package]] 3047 | name = "winnow" 3048 | version = "0.7.4" 3049 | source = "registry+https://github.com/rust-lang/crates.io-index" 3050 | checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" 3051 | dependencies = [ 3052 | "memchr", 3053 | ] 3054 | 3055 | [[package]] 3056 | name = "wit-bindgen-rt" 3057 | version = "0.39.0" 3058 | source = "registry+https://github.com/rust-lang/crates.io-index" 3059 | checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 3060 | dependencies = [ 3061 | "bitflags", 3062 | ] 3063 | 3064 | [[package]] 3065 | name = "write16" 3066 | version = "1.0.0" 3067 | source = "registry+https://github.com/rust-lang/crates.io-index" 3068 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 3069 | 3070 | [[package]] 3071 | name = "writeable" 3072 | version = "0.5.5" 3073 | source = "registry+https://github.com/rust-lang/crates.io-index" 3074 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 3075 | 3076 | [[package]] 3077 | name = "xmlparser" 3078 | version = "0.13.6" 3079 | source = "registry+https://github.com/rust-lang/crates.io-index" 3080 | checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" 3081 | 3082 | [[package]] 3083 | name = "yoke" 3084 | version = "0.7.5" 3085 | source = "registry+https://github.com/rust-lang/crates.io-index" 3086 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 3087 | dependencies = [ 3088 | "serde", 3089 | "stable_deref_trait", 3090 | "yoke-derive", 3091 | "zerofrom", 3092 | ] 3093 | 3094 | [[package]] 3095 | name = "yoke-derive" 3096 | version = "0.7.5" 3097 | source = "registry+https://github.com/rust-lang/crates.io-index" 3098 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 3099 | dependencies = [ 3100 | "proc-macro2", 3101 | "quote", 3102 | "syn", 3103 | "synstructure", 3104 | ] 3105 | 3106 | [[package]] 3107 | name = "zerofrom" 3108 | version = "0.1.6" 3109 | source = "registry+https://github.com/rust-lang/crates.io-index" 3110 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 3111 | dependencies = [ 3112 | "zerofrom-derive", 3113 | ] 3114 | 3115 | [[package]] 3116 | name = "zerofrom-derive" 3117 | version = "0.1.6" 3118 | source = "registry+https://github.com/rust-lang/crates.io-index" 3119 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 3120 | dependencies = [ 3121 | "proc-macro2", 3122 | "quote", 3123 | "syn", 3124 | "synstructure", 3125 | ] 3126 | 3127 | [[package]] 3128 | name = "zeroize" 3129 | version = "1.8.1" 3130 | source = "registry+https://github.com/rust-lang/crates.io-index" 3131 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 3132 | 3133 | [[package]] 3134 | name = "zerovec" 3135 | version = "0.10.4" 3136 | source = "registry+https://github.com/rust-lang/crates.io-index" 3137 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 3138 | dependencies = [ 3139 | "yoke", 3140 | "zerofrom", 3141 | "zerovec-derive", 3142 | ] 3143 | 3144 | [[package]] 3145 | name = "zerovec-derive" 3146 | version = "0.10.3" 3147 | source = "registry+https://github.com/rust-lang/crates.io-index" 3148 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 3149 | dependencies = [ 3150 | "proc-macro2", 3151 | "quote", 3152 | "syn", 3153 | ] 3154 | --------------------------------------------------------------------------------