├── shell.nix ├── .gitignore ├── default.nix ├── Cargo.toml ├── LICENSE-MIT ├── README.md ├── src ├── main.rs └── lib.rs ├── LICENSE-APACHE └── Cargo.lock /shell.nix: -------------------------------------------------------------------------------- 1 | default.nix -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | small/** 3 | .envrc 4 | -------------------------------------------------------------------------------- /default.nix: -------------------------------------------------------------------------------- 1 | { pkgs ? import {} 2 | , lib ? pkgs.lib 3 | , rustPlatform ? pkgs.rustPlatform 4 | , openssl ? pkgs.openssl 5 | , pkgconfig ? pkgs.pkgconfig 6 | }: 7 | rustPlatform.buildRustPackage rec { 8 | pname = "nix-mirror"; 9 | version = "0.1"; 10 | 11 | nativeBuildInputs = [ pkgconfig ]; 12 | buildInputs = [ openssl.dev ]; 13 | 14 | src = lib.cleanSource ./.; 15 | cargoSha256 = "0dm9nmz8qblj2s67jy6gcsx9hqqkh42nk64yd8zppmky06p2x939"; 16 | } 17 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "nix-mirror" 3 | version = "0.1.0" 4 | authors = ["user "] 5 | edition = "2018" 6 | license = "MIT OR Apache-2.0" 7 | 8 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 9 | 10 | [dependencies] 11 | futures = "0.3.6" 12 | indicatif = "0.15.0" 13 | structopt = "0.3.20" 14 | anyhow = "1.0.33" 15 | xz2 = "0.1.6" 16 | path-clean = "0.1.0" 17 | tempfile = "3.1.0" 18 | nix-base32 = "0.1.1" 19 | sha2 = "0.9.1" 20 | 21 | [dependencies.tokio] 22 | version = "0.2.22" 23 | features = [ "fs", "macros", "rt-threaded" ] 24 | 25 | [dependencies.reqwest] 26 | version = "0.10.8" 27 | features = [ "stream" ] 28 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015 The sodiumoxide Developers 2 | 3 | Permission is hereby granted, free of charge, to any 4 | person obtaining a copy of this software and associated 5 | documentation files (the "Software"), to deal in the 6 | Software without restriction, including without 7 | limitation the rights to use, copy, modify, merge, 8 | publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software 10 | is furnished to do so, subject to the following 11 | conditions: 12 | 13 | The above copyright notice and this permission notice 14 | shall be included in all copies or substantial portions 15 | of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 18 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 19 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 20 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 21 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 22 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 24 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25 | DEALINGS IN THE SOFTWARE. 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # nix-mirror: a tool for mirroring nix binary caches 2 | 3 | ## Background 4 | 5 | It is possible to mirror a nix binary cache using the `nix` command line tool using a command sucn as: 6 | 7 | ``` 8 | xzcat store-paths.xz | nix copy --from https://cache.nixos.org --to file:///path/to/where/the/mirror/should/end/up 9 | ``` 10 | 11 | where store-paths.xz is a file containing the store-paths of all binaries in 12 | the cache, e.g. https://channels.nixos.org/nixos-unstable/store-paths.xz 13 | 14 | However that command will use a lot of system resources since it will unpack 15 | all of the downloaded files and repack them before writing them to disk (if I 16 | have understood the reasons for the high cpu usage correctly). 17 | 18 | ## Features 19 | 20 | - [x] Parallel downloads 21 | - [x] Atomic downloads 22 | - [x] Sha256 verification of downloaded archives. 23 | 24 | 25 | ## Building 26 | 27 | ### With cargo 28 | Make sure to have openssl and pkg-config installed and run `cargo build`. 29 | If using nix you can use the provided `shell.nix` which is only a symlink to 30 | `default.nix` to get the dependencies. 31 | 32 | ### With nix 33 | Run `nix-build` as usual. 34 | 35 | ## Usage 36 | - `nix-mirror --help` to show application help 37 | - `nix-mirror store-paths.xz ./mirror` to download all the archives in 38 | `store-paths.xz` and their transitive dependencies to the directory `./mirror`. 39 | 40 | ## License 41 | 42 | Licensed under either of 43 | - [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) 44 | - [MIT license](http://opensource.org/licenses/MIT) 45 | 46 | at your option. 47 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use nix_mirror::{handle_narinfo, store_path_to_narinfo_hash}; 2 | 3 | use std::collections::HashSet; 4 | use std::path::PathBuf; 5 | 6 | use futures::stream::{self, StreamExt}; 7 | use tokio::fs; 8 | 9 | use anyhow::Result; 10 | use indicatif::ProgressBar; 11 | use structopt::StructOpt; 12 | 13 | /// An application to synchronize nix binary caches 14 | #[derive(StructOpt)] 15 | struct Opt { 16 | /// The path to a store-paths.xz file containing the store paths of the packages 17 | /// that should be synchronized, e.g a copy of http://channels.nixos.org/nixpkgs-unstable/store-paths.xz 18 | store_paths: PathBuf, 19 | 20 | /// The directory where the mirror should be stored 21 | mirror_dir: PathBuf, 22 | 23 | /// URL to the cache server that should be used 24 | #[structopt(short, long, default_value="https://cache.nixos.org")] 25 | cache_url: String, 26 | 27 | /// Maximum number of concurrent downloads 28 | #[structopt(short, long, default_value = "8")] 29 | parallelism: usize, 30 | } 31 | 32 | #[tokio::main] 33 | async fn main() -> Result<()> { 34 | let opt = Opt::from_args(); 35 | let nar_dir = opt.mirror_dir.join("nar"); 36 | fs::create_dir_all(&nar_dir).await?; 37 | 38 | // read all store paths to memory, there aren't that many of 39 | // them, so we might as well read all of them into memory 40 | let store_paths = { 41 | use std::{fs::File, io::Read}; 42 | let mut s = String::new(); 43 | File::open(&opt.store_paths) 44 | .map(xz2::read::XzDecoder::new) 45 | .and_then(|mut rdr| rdr.read_to_string(&mut s))?; 46 | s 47 | }; 48 | 49 | // a bit hacky, since we don't know how many files we need to process until 50 | // we're done, but it might still be nice to see some progress. 51 | let progress = ProgressBar::new(0); 52 | 53 | let client = reqwest::Client::new(); 54 | 55 | // our initial set of narinfo hashes to process 56 | let mut current_narinfo_hashes = store_paths 57 | .lines() 58 | .map(|x| store_path_to_narinfo_hash(x).map(String::from)) 59 | .collect::>>()?; 60 | // all narinfo hashes that we have seen 61 | let mut processed_narinfo_hashes = HashSet::new(); 62 | 63 | while !current_narinfo_hashes.is_empty() { 64 | let mut futures = Vec::new(); 65 | for narinfo_hash in current_narinfo_hashes.drain() { 66 | futures.push(handle_narinfo( 67 | &client, 68 | &opt.cache_url, 69 | &opt.mirror_dir, 70 | narinfo_hash.clone(), 71 | )); 72 | processed_narinfo_hashes.insert(narinfo_hash); 73 | progress.inc_length(1); 74 | } 75 | 76 | // handle at most `opt.parallelism` concurrent futures at the same time 77 | let mut stream = stream::iter(futures).buffer_unordered(opt.parallelism); 78 | 79 | // for the result of each future, check to see if we've already seen that hash 80 | // and if not add it to the set of hashes to process 81 | while let Some(result) = stream.next().await { 82 | let new_hashes = result?; 83 | current_narinfo_hashes.extend( 84 | new_hashes 85 | .into_iter() 86 | .filter(|x| !processed_narinfo_hashes.contains(x)), 87 | ); 88 | progress.inc(1); 89 | } 90 | } 91 | 92 | Ok(()) 93 | } 94 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | use std::path::Path; 2 | 3 | use futures::stream::StreamExt; 4 | use tokio::fs; 5 | use tokio::prelude::*; 6 | use tokio::task; 7 | 8 | use anyhow::{anyhow, bail, Context, Result}; 9 | use nix_base32::to_nix_base32; 10 | use path_clean::PathClean; 11 | use sha2::{Digest, Sha256}; 12 | 13 | /// Extracts the narinfo hash part from a nix store filename. 14 | /// ``` 15 | /// use nix_mirror::filename_to_narinfo_hash; 16 | /// let hash = filename_to_narinfo_hash("0001w2k3pgl0pkrn827dxiibvc2sibnd-singleton-bool-0.1.5.tar.gz.drv").unwrap(); 17 | /// assert_eq!(hash, "0001w2k3pgl0pkrn827dxiibvc2sibnd"); 18 | /// ``` 19 | pub fn filename_to_narinfo_hash(filename: &str) -> Result<&str> { 20 | filename 21 | .split('-') 22 | .next() 23 | .ok_or_else(|| anyhow!("failed to parse narinfo hash: {}", filename)) 24 | } 25 | 26 | /// Extracts the narinfo hash path from a nix store path 27 | /// ``` 28 | /// use nix_mirror::store_path_to_narinfo_hash; 29 | /// let hash = store_path_to_narinfo_hash("/nix/store/0001w2k3pgl0pkrn827dxiibvc2sibnd-singleton-bool-0.1.5.tar.gz.drv").unwrap(); 30 | /// assert_eq!(hash, "0001w2k3pgl0pkrn827dxiibvc2sibnd"); 31 | /// ``` 32 | pub fn store_path_to_narinfo_hash(store_path: &str) -> Result<&str> { 33 | store_path 34 | .split('/') 35 | .nth(3) 36 | .ok_or_else(|| anyhow!("failed to parse store_path: {}", store_path)) 37 | .and_then(filename_to_narinfo_hash) 38 | } 39 | 40 | /// Download a single file to a temporary file, moving it to the destination file atomically 41 | /// if the download succeeded. 42 | /// 43 | /// `client` - a reqwest::Client, as given by `reqwest::Client::new()`. 44 | /// `url` - the url we want to download 45 | /// `destination` - where we want the resulting file to end up 46 | /// `hash` - optionally a sha256-digest (in nix-base32) of the file that will be checked 47 | pub async fn download_atomically( 48 | client: &reqwest::Client, 49 | url: String, 50 | destination: &Path, 51 | hash: Option<&str>, 52 | ) -> Result { 53 | let mut resp_stream = client 54 | .get(&url) 55 | .send() 56 | .await? 57 | .error_for_status()? 58 | .bytes_stream(); 59 | let mut ctx = hash.map(|_| Sha256::new()); 60 | 61 | let destination_dir = destination.parent().unwrap(); 62 | let result: Result<_> = task::block_in_place(|| { 63 | let tempfile = tempfile::NamedTempFile::new_in(&destination_dir)?; 64 | let f: fs::File = tempfile.reopen()?.into(); 65 | Ok((tempfile, f)) 66 | }); 67 | let (tempfile, mut async_file) = result?; 68 | 69 | while let Some(bytes) = resp_stream.next().await { 70 | let bytes = bytes?; 71 | if let Some(ctx) = ctx.as_mut() { 72 | ctx.update(&bytes); 73 | } 74 | async_file.write_all(&bytes).await?; 75 | } 76 | async_file.shutdown().await?; 77 | if let Some(ctx) = ctx { 78 | let hash = hash.unwrap(); 79 | let computed = to_nix_base32(&ctx.finalize().as_ref()); 80 | if computed != hash { 81 | bail!( 82 | "hash of file: {:?} failed, expected: {}, got: {}", 83 | destination, 84 | hash, 85 | computed 86 | ); 87 | } 88 | } 89 | 90 | let f = task::block_in_place(|| tempfile.persist(&destination))?; 91 | let mut f = fs::File::from(f); 92 | f.seek(std::io::SeekFrom::Start(0)).await?; 93 | 94 | Ok(f) 95 | } 96 | 97 | /// Download a narinfo file (or open it if it already exists), parse it and download 98 | /// the referenced nar-archive (if it doesn't already exist). 99 | /// 100 | /// Returns a `Vec` of narinfo hashes for all the packages references, so that they can 101 | /// be downloaded in turn. 102 | pub async fn handle_narinfo( 103 | client: &reqwest::Client, 104 | cache_url: &String, 105 | mirror_dir: &Path, 106 | narinfo_hash: String, 107 | ) -> Result> { 108 | let mut narinfo_filename = mirror_dir.join(&narinfo_hash); 109 | narinfo_filename.set_extension("narinfo"); 110 | let narinfo_filename = narinfo_filename.clean(); 111 | 112 | // check to see if the narinfo file exists and download it if it doesn't 113 | // (or if we fail to open it). 114 | let narinfo_file = if let Ok(f) = fs::File::open(&narinfo_filename).await { 115 | f 116 | } else { 117 | let url = format!("{}/{}.narinfo", cache_url, &narinfo_hash); 118 | download_atomically(client, url, &narinfo_filename, None).await? 119 | }; 120 | 121 | let narinfo_file = io::BufReader::new(narinfo_file); 122 | let mut lines = narinfo_file.lines(); 123 | 124 | // ugly parser, but it would be overkill to reach for a parsing library here 125 | let mut url = Err(anyhow!("failed to find URL")); 126 | let mut references = Vec::new(); 127 | let mut filehash = Err(anyhow!("failed to find filehash")); 128 | while let Some(line) = lines.next().await { 129 | let line = line?; 130 | let mut split = line.splitn(2, ": "); 131 | let key = split.next().context("failed to find key")?; 132 | let val = split.next().context("failed to find val")?; 133 | match key { 134 | "URL" => url = Ok(String::from(val)), 135 | "References" => { 136 | references = val 137 | .split_whitespace() 138 | .flat_map(|x| x.split("-").next()) 139 | .map(String::from) 140 | .collect() 141 | } 142 | "FileHash" => { 143 | filehash = val 144 | .split(':') 145 | .nth(1) 146 | .map(String::from) 147 | .context("invalid filehash") 148 | } 149 | _ => {} 150 | } 151 | } 152 | 153 | // we error out if we didn't find an url or a filehash 154 | let url = url?; 155 | let filehash = filehash?; 156 | 157 | // check to see if we need to download the nar archive, if so do it 158 | let filename = mirror_dir.join(&url).clean(); 159 | if fs::File::open(&filename).await.is_err() { 160 | let url = format!("{}/{}", cache_url, &url); 161 | download_atomically(client, url, &filename, Some(&filehash)).await?; 162 | } 163 | 164 | Ok(references.into_iter().map(String::from).collect()) 165 | } 166 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 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 | http://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 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | [[package]] 4 | name = "ansi_term" 5 | version = "0.11.0" 6 | source = "registry+https://github.com/rust-lang/crates.io-index" 7 | checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" 8 | dependencies = [ 9 | "winapi 0.3.9", 10 | ] 11 | 12 | [[package]] 13 | name = "anyhow" 14 | version = "1.0.33" 15 | source = "registry+https://github.com/rust-lang/crates.io-index" 16 | checksum = "a1fd36ffbb1fb7c834eac128ea8d0e310c5aeb635548f9d58861e1308d46e71c" 17 | 18 | [[package]] 19 | name = "atty" 20 | version = "0.2.14" 21 | source = "registry+https://github.com/rust-lang/crates.io-index" 22 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 23 | dependencies = [ 24 | "hermit-abi", 25 | "libc", 26 | "winapi 0.3.9", 27 | ] 28 | 29 | [[package]] 30 | name = "autocfg" 31 | version = "1.0.1" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" 34 | 35 | [[package]] 36 | name = "base64" 37 | version = "0.12.3" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" 40 | 41 | [[package]] 42 | name = "bitflags" 43 | version = "1.2.1" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" 46 | 47 | [[package]] 48 | name = "block-buffer" 49 | version = "0.9.0" 50 | source = "registry+https://github.com/rust-lang/crates.io-index" 51 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 52 | dependencies = [ 53 | "generic-array", 54 | ] 55 | 56 | [[package]] 57 | name = "bumpalo" 58 | version = "3.4.0" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" 61 | 62 | [[package]] 63 | name = "bytes" 64 | version = "0.5.6" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" 67 | 68 | [[package]] 69 | name = "cc" 70 | version = "1.0.61" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "ed67cbde08356238e75fc4656be4749481eeffb09e19f320a25237d5221c985d" 73 | 74 | [[package]] 75 | name = "cfg-if" 76 | version = "0.1.10" 77 | source = "registry+https://github.com/rust-lang/crates.io-index" 78 | checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 79 | 80 | [[package]] 81 | name = "clap" 82 | version = "2.33.3" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" 85 | dependencies = [ 86 | "ansi_term", 87 | "atty", 88 | "bitflags", 89 | "strsim", 90 | "textwrap", 91 | "unicode-width", 92 | "vec_map", 93 | ] 94 | 95 | [[package]] 96 | name = "console" 97 | version = "0.13.0" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | checksum = "a50aab2529019abfabfa93f1e6c41ef392f91fbf179b347a7e96abb524884a08" 100 | dependencies = [ 101 | "encode_unicode", 102 | "lazy_static", 103 | "libc", 104 | "regex", 105 | "terminal_size", 106 | "unicode-width", 107 | "winapi 0.3.9", 108 | "winapi-util", 109 | ] 110 | 111 | [[package]] 112 | name = "core-foundation" 113 | version = "0.7.0" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" 116 | dependencies = [ 117 | "core-foundation-sys", 118 | "libc", 119 | ] 120 | 121 | [[package]] 122 | name = "core-foundation-sys" 123 | version = "0.7.0" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" 126 | 127 | [[package]] 128 | name = "cpuid-bool" 129 | version = "0.1.2" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" 132 | 133 | [[package]] 134 | name = "digest" 135 | version = "0.9.0" 136 | source = "registry+https://github.com/rust-lang/crates.io-index" 137 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 138 | dependencies = [ 139 | "generic-array", 140 | ] 141 | 142 | [[package]] 143 | name = "dtoa" 144 | version = "0.4.6" 145 | source = "registry+https://github.com/rust-lang/crates.io-index" 146 | checksum = "134951f4028bdadb9b84baf4232681efbf277da25144b9b0ad65df75946c422b" 147 | 148 | [[package]] 149 | name = "encode_unicode" 150 | version = "0.3.6" 151 | source = "registry+https://github.com/rust-lang/crates.io-index" 152 | checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" 153 | 154 | [[package]] 155 | name = "encoding_rs" 156 | version = "0.8.24" 157 | source = "registry+https://github.com/rust-lang/crates.io-index" 158 | checksum = "a51b8cf747471cb9499b6d59e59b0444f4c90eba8968c4e44874e92b5b64ace2" 159 | dependencies = [ 160 | "cfg-if", 161 | ] 162 | 163 | [[package]] 164 | name = "fnv" 165 | version = "1.0.7" 166 | source = "registry+https://github.com/rust-lang/crates.io-index" 167 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 168 | 169 | [[package]] 170 | name = "foreign-types" 171 | version = "0.3.2" 172 | source = "registry+https://github.com/rust-lang/crates.io-index" 173 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 174 | dependencies = [ 175 | "foreign-types-shared", 176 | ] 177 | 178 | [[package]] 179 | name = "foreign-types-shared" 180 | version = "0.1.1" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 183 | 184 | [[package]] 185 | name = "fuchsia-zircon" 186 | version = "0.3.3" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" 189 | dependencies = [ 190 | "bitflags", 191 | "fuchsia-zircon-sys", 192 | ] 193 | 194 | [[package]] 195 | name = "fuchsia-zircon-sys" 196 | version = "0.3.3" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" 199 | 200 | [[package]] 201 | name = "futures" 202 | version = "0.3.7" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "95314d38584ffbfda215621d723e0a3906f032e03ae5551e650058dac83d4797" 205 | dependencies = [ 206 | "futures-channel", 207 | "futures-core", 208 | "futures-executor", 209 | "futures-io", 210 | "futures-sink", 211 | "futures-task", 212 | "futures-util", 213 | ] 214 | 215 | [[package]] 216 | name = "futures-channel" 217 | version = "0.3.7" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "0448174b01148032eed37ac4aed28963aaaa8cfa93569a08e5b479bbc6c2c151" 220 | dependencies = [ 221 | "futures-core", 222 | "futures-sink", 223 | ] 224 | 225 | [[package]] 226 | name = "futures-core" 227 | version = "0.3.7" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | checksum = "18eaa56102984bed2c88ea39026cff3ce3b4c7f508ca970cedf2450ea10d4e46" 230 | 231 | [[package]] 232 | name = "futures-executor" 233 | version = "0.3.7" 234 | source = "registry+https://github.com/rust-lang/crates.io-index" 235 | checksum = "f5f8e0c9258abaea85e78ebdda17ef9666d390e987f006be6080dfe354b708cb" 236 | dependencies = [ 237 | "futures-core", 238 | "futures-task", 239 | "futures-util", 240 | ] 241 | 242 | [[package]] 243 | name = "futures-io" 244 | version = "0.3.7" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "6e1798854a4727ff944a7b12aa999f58ce7aa81db80d2dfaaf2ba06f065ddd2b" 247 | 248 | [[package]] 249 | name = "futures-macro" 250 | version = "0.3.7" 251 | source = "registry+https://github.com/rust-lang/crates.io-index" 252 | checksum = "e36fccf3fc58563b4a14d265027c627c3b665d7fed489427e88e7cc929559efe" 253 | dependencies = [ 254 | "proc-macro-hack", 255 | "proc-macro2", 256 | "quote", 257 | "syn", 258 | ] 259 | 260 | [[package]] 261 | name = "futures-sink" 262 | version = "0.3.7" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "0e3ca3f17d6e8804ae5d3df7a7d35b2b3a6fe89dac84b31872720fc3060a0b11" 265 | 266 | [[package]] 267 | name = "futures-task" 268 | version = "0.3.7" 269 | source = "registry+https://github.com/rust-lang/crates.io-index" 270 | checksum = "96d502af37186c4fef99453df03e374683f8a1eec9dcc1e66b3b82dc8278ce3c" 271 | dependencies = [ 272 | "once_cell", 273 | ] 274 | 275 | [[package]] 276 | name = "futures-util" 277 | version = "0.3.7" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | checksum = "abcb44342f62e6f3e8ac427b8aa815f724fd705dfad060b18ac7866c15bb8e34" 280 | dependencies = [ 281 | "futures-channel", 282 | "futures-core", 283 | "futures-io", 284 | "futures-macro", 285 | "futures-sink", 286 | "futures-task", 287 | "memchr", 288 | "pin-project 1.0.1", 289 | "pin-utils", 290 | "proc-macro-hack", 291 | "proc-macro-nested", 292 | "slab", 293 | ] 294 | 295 | [[package]] 296 | name = "generic-array" 297 | version = "0.14.4" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" 300 | dependencies = [ 301 | "typenum", 302 | "version_check", 303 | ] 304 | 305 | [[package]] 306 | name = "getrandom" 307 | version = "0.1.15" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6" 310 | dependencies = [ 311 | "cfg-if", 312 | "libc", 313 | "wasi", 314 | ] 315 | 316 | [[package]] 317 | name = "h2" 318 | version = "0.2.7" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "5e4728fd124914ad25e99e3d15a9361a879f6620f63cb56bbb08f95abb97a535" 321 | dependencies = [ 322 | "bytes", 323 | "fnv", 324 | "futures-core", 325 | "futures-sink", 326 | "futures-util", 327 | "http", 328 | "indexmap", 329 | "slab", 330 | "tokio", 331 | "tokio-util", 332 | "tracing", 333 | "tracing-futures", 334 | ] 335 | 336 | [[package]] 337 | name = "hashbrown" 338 | version = "0.9.1" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" 341 | 342 | [[package]] 343 | name = "heck" 344 | version = "0.3.1" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" 347 | dependencies = [ 348 | "unicode-segmentation", 349 | ] 350 | 351 | [[package]] 352 | name = "hermit-abi" 353 | version = "0.1.17" 354 | source = "registry+https://github.com/rust-lang/crates.io-index" 355 | checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8" 356 | dependencies = [ 357 | "libc", 358 | ] 359 | 360 | [[package]] 361 | name = "http" 362 | version = "0.2.1" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "28d569972648b2c512421b5f2a405ad6ac9666547189d0c5477a3f200f3e02f9" 365 | dependencies = [ 366 | "bytes", 367 | "fnv", 368 | "itoa", 369 | ] 370 | 371 | [[package]] 372 | name = "http-body" 373 | version = "0.3.1" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" 376 | dependencies = [ 377 | "bytes", 378 | "http", 379 | ] 380 | 381 | [[package]] 382 | name = "httparse" 383 | version = "1.3.4" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" 386 | 387 | [[package]] 388 | name = "httpdate" 389 | version = "0.3.2" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" 392 | 393 | [[package]] 394 | name = "hyper" 395 | version = "0.13.8" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "2f3afcfae8af5ad0576a31e768415edb627824129e8e5a29b8bfccb2f234e835" 398 | dependencies = [ 399 | "bytes", 400 | "futures-channel", 401 | "futures-core", 402 | "futures-util", 403 | "h2", 404 | "http", 405 | "http-body", 406 | "httparse", 407 | "httpdate", 408 | "itoa", 409 | "pin-project 0.4.27", 410 | "socket2", 411 | "tokio", 412 | "tower-service", 413 | "tracing", 414 | "want", 415 | ] 416 | 417 | [[package]] 418 | name = "hyper-tls" 419 | version = "0.4.3" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | checksum = "d979acc56dcb5b8dddba3917601745e877576475aa046df3226eabdecef78eed" 422 | dependencies = [ 423 | "bytes", 424 | "hyper", 425 | "native-tls", 426 | "tokio", 427 | "tokio-tls", 428 | ] 429 | 430 | [[package]] 431 | name = "idna" 432 | version = "0.2.0" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" 435 | dependencies = [ 436 | "matches", 437 | "unicode-bidi", 438 | "unicode-normalization", 439 | ] 440 | 441 | [[package]] 442 | name = "indexmap" 443 | version = "1.6.0" 444 | source = "registry+https://github.com/rust-lang/crates.io-index" 445 | checksum = "55e2e4c765aa53a0424761bf9f41aa7a6ac1efa87238f59560640e27fca028f2" 446 | dependencies = [ 447 | "autocfg", 448 | "hashbrown", 449 | ] 450 | 451 | [[package]] 452 | name = "indicatif" 453 | version = "0.15.0" 454 | source = "registry+https://github.com/rust-lang/crates.io-index" 455 | checksum = "7baab56125e25686df467fe470785512329883aab42696d661247aca2a2896e4" 456 | dependencies = [ 457 | "console", 458 | "lazy_static", 459 | "number_prefix", 460 | "regex", 461 | ] 462 | 463 | [[package]] 464 | name = "iovec" 465 | version = "0.1.4" 466 | source = "registry+https://github.com/rust-lang/crates.io-index" 467 | checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" 468 | dependencies = [ 469 | "libc", 470 | ] 471 | 472 | [[package]] 473 | name = "ipnet" 474 | version = "2.3.0" 475 | source = "registry+https://github.com/rust-lang/crates.io-index" 476 | checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" 477 | 478 | [[package]] 479 | name = "itoa" 480 | version = "0.4.6" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" 483 | 484 | [[package]] 485 | name = "js-sys" 486 | version = "0.3.45" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "ca059e81d9486668f12d455a4ea6daa600bd408134cd17e3d3fb5a32d1f016f8" 489 | dependencies = [ 490 | "wasm-bindgen", 491 | ] 492 | 493 | [[package]] 494 | name = "kernel32-sys" 495 | version = "0.2.2" 496 | source = "registry+https://github.com/rust-lang/crates.io-index" 497 | checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 498 | dependencies = [ 499 | "winapi 0.2.8", 500 | "winapi-build", 501 | ] 502 | 503 | [[package]] 504 | name = "lazy_static" 505 | version = "1.4.0" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 508 | 509 | [[package]] 510 | name = "libc" 511 | version = "0.2.80" 512 | source = "registry+https://github.com/rust-lang/crates.io-index" 513 | checksum = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614" 514 | 515 | [[package]] 516 | name = "log" 517 | version = "0.4.11" 518 | source = "registry+https://github.com/rust-lang/crates.io-index" 519 | checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" 520 | dependencies = [ 521 | "cfg-if", 522 | ] 523 | 524 | [[package]] 525 | name = "lzma-sys" 526 | version = "0.1.17" 527 | source = "registry+https://github.com/rust-lang/crates.io-index" 528 | checksum = "bdb4b7c3eddad11d3af9e86c487607d2d2442d185d848575365c4856ba96d619" 529 | dependencies = [ 530 | "cc", 531 | "libc", 532 | "pkg-config", 533 | ] 534 | 535 | [[package]] 536 | name = "matches" 537 | version = "0.1.8" 538 | source = "registry+https://github.com/rust-lang/crates.io-index" 539 | checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" 540 | 541 | [[package]] 542 | name = "memchr" 543 | version = "2.3.4" 544 | source = "registry+https://github.com/rust-lang/crates.io-index" 545 | checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" 546 | 547 | [[package]] 548 | name = "mime" 549 | version = "0.3.16" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 552 | 553 | [[package]] 554 | name = "mime_guess" 555 | version = "2.0.3" 556 | source = "registry+https://github.com/rust-lang/crates.io-index" 557 | checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" 558 | dependencies = [ 559 | "mime", 560 | "unicase", 561 | ] 562 | 563 | [[package]] 564 | name = "mio" 565 | version = "0.6.22" 566 | source = "registry+https://github.com/rust-lang/crates.io-index" 567 | checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430" 568 | dependencies = [ 569 | "cfg-if", 570 | "fuchsia-zircon", 571 | "fuchsia-zircon-sys", 572 | "iovec", 573 | "kernel32-sys", 574 | "libc", 575 | "log", 576 | "miow", 577 | "net2", 578 | "slab", 579 | "winapi 0.2.8", 580 | ] 581 | 582 | [[package]] 583 | name = "miow" 584 | version = "0.2.1" 585 | source = "registry+https://github.com/rust-lang/crates.io-index" 586 | checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" 587 | dependencies = [ 588 | "kernel32-sys", 589 | "net2", 590 | "winapi 0.2.8", 591 | "ws2_32-sys", 592 | ] 593 | 594 | [[package]] 595 | name = "native-tls" 596 | version = "0.2.4" 597 | source = "registry+https://github.com/rust-lang/crates.io-index" 598 | checksum = "2b0d88c06fe90d5ee94048ba40409ef1d9315d86f6f38c2efdaad4fb50c58b2d" 599 | dependencies = [ 600 | "lazy_static", 601 | "libc", 602 | "log", 603 | "openssl", 604 | "openssl-probe", 605 | "openssl-sys", 606 | "schannel", 607 | "security-framework", 608 | "security-framework-sys", 609 | "tempfile", 610 | ] 611 | 612 | [[package]] 613 | name = "net2" 614 | version = "0.2.35" 615 | source = "registry+https://github.com/rust-lang/crates.io-index" 616 | checksum = "3ebc3ec692ed7c9a255596c67808dee269f64655d8baf7b4f0638e51ba1d6853" 617 | dependencies = [ 618 | "cfg-if", 619 | "libc", 620 | "winapi 0.3.9", 621 | ] 622 | 623 | [[package]] 624 | name = "nix-base32" 625 | version = "0.1.1" 626 | source = "registry+https://github.com/rust-lang/crates.io-index" 627 | checksum = "8548db8274cf1b2b4c093557783f99e9ad64ffdaaa29a6c1af0abc9895c15612" 628 | 629 | [[package]] 630 | name = "nix-mirror" 631 | version = "0.1.0" 632 | dependencies = [ 633 | "anyhow", 634 | "futures", 635 | "indicatif", 636 | "nix-base32", 637 | "path-clean", 638 | "reqwest", 639 | "sha2", 640 | "structopt", 641 | "tempfile", 642 | "tokio", 643 | "xz2", 644 | ] 645 | 646 | [[package]] 647 | name = "num_cpus" 648 | version = "1.13.0" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" 651 | dependencies = [ 652 | "hermit-abi", 653 | "libc", 654 | ] 655 | 656 | [[package]] 657 | name = "number_prefix" 658 | version = "0.3.0" 659 | source = "registry+https://github.com/rust-lang/crates.io-index" 660 | checksum = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a" 661 | 662 | [[package]] 663 | name = "once_cell" 664 | version = "1.4.1" 665 | source = "registry+https://github.com/rust-lang/crates.io-index" 666 | checksum = "260e51e7efe62b592207e9e13a68e43692a7a279171d6ba57abd208bf23645ad" 667 | 668 | [[package]] 669 | name = "opaque-debug" 670 | version = "0.3.0" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" 673 | 674 | [[package]] 675 | name = "openssl" 676 | version = "0.10.30" 677 | source = "registry+https://github.com/rust-lang/crates.io-index" 678 | checksum = "8d575eff3665419f9b83678ff2815858ad9d11567e082f5ac1814baba4e2bcb4" 679 | dependencies = [ 680 | "bitflags", 681 | "cfg-if", 682 | "foreign-types", 683 | "lazy_static", 684 | "libc", 685 | "openssl-sys", 686 | ] 687 | 688 | [[package]] 689 | name = "openssl-probe" 690 | version = "0.1.2" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" 693 | 694 | [[package]] 695 | name = "openssl-sys" 696 | version = "0.9.58" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "a842db4709b604f0fe5d1170ae3565899be2ad3d9cbc72dedc789ac0511f78de" 699 | dependencies = [ 700 | "autocfg", 701 | "cc", 702 | "libc", 703 | "pkg-config", 704 | "vcpkg", 705 | ] 706 | 707 | [[package]] 708 | name = "path-clean" 709 | version = "0.1.0" 710 | source = "registry+https://github.com/rust-lang/crates.io-index" 711 | checksum = "ecba01bf2678719532c5e3059e0b5f0811273d94b397088b82e3bd0a78c78fdd" 712 | 713 | [[package]] 714 | name = "percent-encoding" 715 | version = "2.1.0" 716 | source = "registry+https://github.com/rust-lang/crates.io-index" 717 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 718 | 719 | [[package]] 720 | name = "pin-project" 721 | version = "0.4.27" 722 | source = "registry+https://github.com/rust-lang/crates.io-index" 723 | checksum = "2ffbc8e94b38ea3d2d8ba92aea2983b503cd75d0888d75b86bb37970b5698e15" 724 | dependencies = [ 725 | "pin-project-internal 0.4.27", 726 | ] 727 | 728 | [[package]] 729 | name = "pin-project" 730 | version = "1.0.1" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | checksum = "ee41d838744f60d959d7074e3afb6b35c7456d0f61cad38a24e35e6553f73841" 733 | dependencies = [ 734 | "pin-project-internal 1.0.1", 735 | ] 736 | 737 | [[package]] 738 | name = "pin-project-internal" 739 | version = "0.4.27" 740 | source = "registry+https://github.com/rust-lang/crates.io-index" 741 | checksum = "65ad2ae56b6abe3a1ee25f15ee605bacadb9a764edaba9c2bf4103800d4a1895" 742 | dependencies = [ 743 | "proc-macro2", 744 | "quote", 745 | "syn", 746 | ] 747 | 748 | [[package]] 749 | name = "pin-project-internal" 750 | version = "1.0.1" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | checksum = "81a4ffa594b66bff340084d4081df649a7dc049ac8d7fc458d8e628bfbbb2f86" 753 | dependencies = [ 754 | "proc-macro2", 755 | "quote", 756 | "syn", 757 | ] 758 | 759 | [[package]] 760 | name = "pin-project-lite" 761 | version = "0.1.11" 762 | source = "registry+https://github.com/rust-lang/crates.io-index" 763 | checksum = "c917123afa01924fc84bb20c4c03f004d9c38e5127e3c039bbf7f4b9c76a2f6b" 764 | 765 | [[package]] 766 | name = "pin-utils" 767 | version = "0.1.0" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 770 | 771 | [[package]] 772 | name = "pkg-config" 773 | version = "0.3.19" 774 | source = "registry+https://github.com/rust-lang/crates.io-index" 775 | checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" 776 | 777 | [[package]] 778 | name = "ppv-lite86" 779 | version = "0.2.9" 780 | source = "registry+https://github.com/rust-lang/crates.io-index" 781 | checksum = "c36fa947111f5c62a733b652544dd0016a43ce89619538a8ef92724a6f501a20" 782 | 783 | [[package]] 784 | name = "proc-macro-error" 785 | version = "1.0.4" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 788 | dependencies = [ 789 | "proc-macro-error-attr", 790 | "proc-macro2", 791 | "quote", 792 | "syn", 793 | "version_check", 794 | ] 795 | 796 | [[package]] 797 | name = "proc-macro-error-attr" 798 | version = "1.0.4" 799 | source = "registry+https://github.com/rust-lang/crates.io-index" 800 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 801 | dependencies = [ 802 | "proc-macro2", 803 | "quote", 804 | "version_check", 805 | ] 806 | 807 | [[package]] 808 | name = "proc-macro-hack" 809 | version = "0.5.19" 810 | source = "registry+https://github.com/rust-lang/crates.io-index" 811 | checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" 812 | 813 | [[package]] 814 | name = "proc-macro-nested" 815 | version = "0.1.6" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | checksum = "eba180dafb9038b050a4c280019bbedf9f2467b61e5d892dcad585bb57aadc5a" 818 | 819 | [[package]] 820 | name = "proc-macro2" 821 | version = "1.0.24" 822 | source = "registry+https://github.com/rust-lang/crates.io-index" 823 | checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" 824 | dependencies = [ 825 | "unicode-xid", 826 | ] 827 | 828 | [[package]] 829 | name = "quote" 830 | version = "1.0.7" 831 | source = "registry+https://github.com/rust-lang/crates.io-index" 832 | checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" 833 | dependencies = [ 834 | "proc-macro2", 835 | ] 836 | 837 | [[package]] 838 | name = "rand" 839 | version = "0.7.3" 840 | source = "registry+https://github.com/rust-lang/crates.io-index" 841 | checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 842 | dependencies = [ 843 | "getrandom", 844 | "libc", 845 | "rand_chacha", 846 | "rand_core", 847 | "rand_hc", 848 | ] 849 | 850 | [[package]] 851 | name = "rand_chacha" 852 | version = "0.2.2" 853 | source = "registry+https://github.com/rust-lang/crates.io-index" 854 | checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 855 | dependencies = [ 856 | "ppv-lite86", 857 | "rand_core", 858 | ] 859 | 860 | [[package]] 861 | name = "rand_core" 862 | version = "0.5.1" 863 | source = "registry+https://github.com/rust-lang/crates.io-index" 864 | checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 865 | dependencies = [ 866 | "getrandom", 867 | ] 868 | 869 | [[package]] 870 | name = "rand_hc" 871 | version = "0.2.0" 872 | source = "registry+https://github.com/rust-lang/crates.io-index" 873 | checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 874 | dependencies = [ 875 | "rand_core", 876 | ] 877 | 878 | [[package]] 879 | name = "redox_syscall" 880 | version = "0.1.57" 881 | source = "registry+https://github.com/rust-lang/crates.io-index" 882 | checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" 883 | 884 | [[package]] 885 | name = "regex" 886 | version = "1.4.1" 887 | source = "registry+https://github.com/rust-lang/crates.io-index" 888 | checksum = "8963b85b8ce3074fecffde43b4b0dded83ce2f367dc8d363afc56679f3ee820b" 889 | dependencies = [ 890 | "regex-syntax", 891 | ] 892 | 893 | [[package]] 894 | name = "regex-syntax" 895 | version = "0.6.20" 896 | source = "registry+https://github.com/rust-lang/crates.io-index" 897 | checksum = "8cab7a364d15cde1e505267766a2d3c4e22a843e1a601f0fa7564c0f82ced11c" 898 | 899 | [[package]] 900 | name = "remove_dir_all" 901 | version = "0.5.3" 902 | source = "registry+https://github.com/rust-lang/crates.io-index" 903 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 904 | dependencies = [ 905 | "winapi 0.3.9", 906 | ] 907 | 908 | [[package]] 909 | name = "reqwest" 910 | version = "0.10.8" 911 | source = "registry+https://github.com/rust-lang/crates.io-index" 912 | checksum = "e9eaa17ac5d7b838b7503d118fa16ad88f440498bf9ffe5424e621f93190d61e" 913 | dependencies = [ 914 | "base64", 915 | "bytes", 916 | "encoding_rs", 917 | "futures-core", 918 | "futures-util", 919 | "http", 920 | "http-body", 921 | "hyper", 922 | "hyper-tls", 923 | "ipnet", 924 | "js-sys", 925 | "lazy_static", 926 | "log", 927 | "mime", 928 | "mime_guess", 929 | "native-tls", 930 | "percent-encoding", 931 | "pin-project-lite", 932 | "serde", 933 | "serde_urlencoded", 934 | "tokio", 935 | "tokio-tls", 936 | "url", 937 | "wasm-bindgen", 938 | "wasm-bindgen-futures", 939 | "web-sys", 940 | "winreg", 941 | ] 942 | 943 | [[package]] 944 | name = "ryu" 945 | version = "1.0.5" 946 | source = "registry+https://github.com/rust-lang/crates.io-index" 947 | checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" 948 | 949 | [[package]] 950 | name = "schannel" 951 | version = "0.1.19" 952 | source = "registry+https://github.com/rust-lang/crates.io-index" 953 | checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" 954 | dependencies = [ 955 | "lazy_static", 956 | "winapi 0.3.9", 957 | ] 958 | 959 | [[package]] 960 | name = "security-framework" 961 | version = "0.4.4" 962 | source = "registry+https://github.com/rust-lang/crates.io-index" 963 | checksum = "64808902d7d99f78eaddd2b4e2509713babc3dc3c85ad6f4c447680f3c01e535" 964 | dependencies = [ 965 | "bitflags", 966 | "core-foundation", 967 | "core-foundation-sys", 968 | "libc", 969 | "security-framework-sys", 970 | ] 971 | 972 | [[package]] 973 | name = "security-framework-sys" 974 | version = "0.4.3" 975 | source = "registry+https://github.com/rust-lang/crates.io-index" 976 | checksum = "17bf11d99252f512695eb468de5516e5cf75455521e69dfe343f3b74e4748405" 977 | dependencies = [ 978 | "core-foundation-sys", 979 | "libc", 980 | ] 981 | 982 | [[package]] 983 | name = "serde" 984 | version = "1.0.117" 985 | source = "registry+https://github.com/rust-lang/crates.io-index" 986 | checksum = "b88fa983de7720629c9387e9f517353ed404164b1e482c970a90c1a4aaf7dc1a" 987 | 988 | [[package]] 989 | name = "serde_json" 990 | version = "1.0.59" 991 | source = "registry+https://github.com/rust-lang/crates.io-index" 992 | checksum = "dcac07dbffa1c65e7f816ab9eba78eb142c6d44410f4eeba1e26e4f5dfa56b95" 993 | dependencies = [ 994 | "itoa", 995 | "ryu", 996 | "serde", 997 | ] 998 | 999 | [[package]] 1000 | name = "serde_urlencoded" 1001 | version = "0.6.1" 1002 | source = "registry+https://github.com/rust-lang/crates.io-index" 1003 | checksum = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97" 1004 | dependencies = [ 1005 | "dtoa", 1006 | "itoa", 1007 | "serde", 1008 | "url", 1009 | ] 1010 | 1011 | [[package]] 1012 | name = "sha2" 1013 | version = "0.9.1" 1014 | source = "registry+https://github.com/rust-lang/crates.io-index" 1015 | checksum = "2933378ddfeda7ea26f48c555bdad8bb446bf8a3d17832dc83e380d444cfb8c1" 1016 | dependencies = [ 1017 | "block-buffer", 1018 | "cfg-if", 1019 | "cpuid-bool", 1020 | "digest", 1021 | "opaque-debug", 1022 | ] 1023 | 1024 | [[package]] 1025 | name = "slab" 1026 | version = "0.4.2" 1027 | source = "registry+https://github.com/rust-lang/crates.io-index" 1028 | checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" 1029 | 1030 | [[package]] 1031 | name = "socket2" 1032 | version = "0.3.15" 1033 | source = "registry+https://github.com/rust-lang/crates.io-index" 1034 | checksum = "b1fa70dc5c8104ec096f4fe7ede7a221d35ae13dcd19ba1ad9a81d2cab9a1c44" 1035 | dependencies = [ 1036 | "cfg-if", 1037 | "libc", 1038 | "redox_syscall", 1039 | "winapi 0.3.9", 1040 | ] 1041 | 1042 | [[package]] 1043 | name = "strsim" 1044 | version = "0.8.0" 1045 | source = "registry+https://github.com/rust-lang/crates.io-index" 1046 | checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" 1047 | 1048 | [[package]] 1049 | name = "structopt" 1050 | version = "0.3.20" 1051 | source = "registry+https://github.com/rust-lang/crates.io-index" 1052 | checksum = "126d630294ec449fae0b16f964e35bf3c74f940da9dca17ee9b905f7b3112eb8" 1053 | dependencies = [ 1054 | "clap", 1055 | "lazy_static", 1056 | "structopt-derive", 1057 | ] 1058 | 1059 | [[package]] 1060 | name = "structopt-derive" 1061 | version = "0.4.13" 1062 | source = "registry+https://github.com/rust-lang/crates.io-index" 1063 | checksum = "65e51c492f9e23a220534971ff5afc14037289de430e3c83f9daf6a1b6ae91e8" 1064 | dependencies = [ 1065 | "heck", 1066 | "proc-macro-error", 1067 | "proc-macro2", 1068 | "quote", 1069 | "syn", 1070 | ] 1071 | 1072 | [[package]] 1073 | name = "syn" 1074 | version = "1.0.48" 1075 | source = "registry+https://github.com/rust-lang/crates.io-index" 1076 | checksum = "cc371affeffc477f42a221a1e4297aedcea33d47d19b61455588bd9d8f6b19ac" 1077 | dependencies = [ 1078 | "proc-macro2", 1079 | "quote", 1080 | "unicode-xid", 1081 | ] 1082 | 1083 | [[package]] 1084 | name = "tempfile" 1085 | version = "3.1.0" 1086 | source = "registry+https://github.com/rust-lang/crates.io-index" 1087 | checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" 1088 | dependencies = [ 1089 | "cfg-if", 1090 | "libc", 1091 | "rand", 1092 | "redox_syscall", 1093 | "remove_dir_all", 1094 | "winapi 0.3.9", 1095 | ] 1096 | 1097 | [[package]] 1098 | name = "terminal_size" 1099 | version = "0.1.13" 1100 | source = "registry+https://github.com/rust-lang/crates.io-index" 1101 | checksum = "9a14cd9f8c72704232f0bfc8455c0e861f0ad4eb60cc9ec8a170e231414c1e13" 1102 | dependencies = [ 1103 | "libc", 1104 | "winapi 0.3.9", 1105 | ] 1106 | 1107 | [[package]] 1108 | name = "textwrap" 1109 | version = "0.11.0" 1110 | source = "registry+https://github.com/rust-lang/crates.io-index" 1111 | checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" 1112 | dependencies = [ 1113 | "unicode-width", 1114 | ] 1115 | 1116 | [[package]] 1117 | name = "tinyvec" 1118 | version = "0.3.4" 1119 | source = "registry+https://github.com/rust-lang/crates.io-index" 1120 | checksum = "238ce071d267c5710f9d31451efec16c5ee22de34df17cc05e56cbc92e967117" 1121 | 1122 | [[package]] 1123 | name = "tokio" 1124 | version = "0.2.22" 1125 | source = "registry+https://github.com/rust-lang/crates.io-index" 1126 | checksum = "5d34ca54d84bf2b5b4d7d31e901a8464f7b60ac145a284fba25ceb801f2ddccd" 1127 | dependencies = [ 1128 | "bytes", 1129 | "fnv", 1130 | "futures-core", 1131 | "iovec", 1132 | "lazy_static", 1133 | "memchr", 1134 | "mio", 1135 | "num_cpus", 1136 | "pin-project-lite", 1137 | "slab", 1138 | "tokio-macros", 1139 | ] 1140 | 1141 | [[package]] 1142 | name = "tokio-macros" 1143 | version = "0.2.5" 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" 1145 | checksum = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" 1146 | dependencies = [ 1147 | "proc-macro2", 1148 | "quote", 1149 | "syn", 1150 | ] 1151 | 1152 | [[package]] 1153 | name = "tokio-tls" 1154 | version = "0.3.1" 1155 | source = "registry+https://github.com/rust-lang/crates.io-index" 1156 | checksum = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343" 1157 | dependencies = [ 1158 | "native-tls", 1159 | "tokio", 1160 | ] 1161 | 1162 | [[package]] 1163 | name = "tokio-util" 1164 | version = "0.3.1" 1165 | source = "registry+https://github.com/rust-lang/crates.io-index" 1166 | checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" 1167 | dependencies = [ 1168 | "bytes", 1169 | "futures-core", 1170 | "futures-sink", 1171 | "log", 1172 | "pin-project-lite", 1173 | "tokio", 1174 | ] 1175 | 1176 | [[package]] 1177 | name = "tower-service" 1178 | version = "0.3.0" 1179 | source = "registry+https://github.com/rust-lang/crates.io-index" 1180 | checksum = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" 1181 | 1182 | [[package]] 1183 | name = "tracing" 1184 | version = "0.1.21" 1185 | source = "registry+https://github.com/rust-lang/crates.io-index" 1186 | checksum = "b0987850db3733619253fe60e17cb59b82d37c7e6c0236bb81e4d6b87c879f27" 1187 | dependencies = [ 1188 | "cfg-if", 1189 | "log", 1190 | "pin-project-lite", 1191 | "tracing-core", 1192 | ] 1193 | 1194 | [[package]] 1195 | name = "tracing-core" 1196 | version = "0.1.17" 1197 | source = "registry+https://github.com/rust-lang/crates.io-index" 1198 | checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" 1199 | dependencies = [ 1200 | "lazy_static", 1201 | ] 1202 | 1203 | [[package]] 1204 | name = "tracing-futures" 1205 | version = "0.2.4" 1206 | source = "registry+https://github.com/rust-lang/crates.io-index" 1207 | checksum = "ab7bb6f14721aa00656086e9335d363c5c8747bae02ebe32ea2c7dece5689b4c" 1208 | dependencies = [ 1209 | "pin-project 0.4.27", 1210 | "tracing", 1211 | ] 1212 | 1213 | [[package]] 1214 | name = "try-lock" 1215 | version = "0.2.3" 1216 | source = "registry+https://github.com/rust-lang/crates.io-index" 1217 | checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" 1218 | 1219 | [[package]] 1220 | name = "typenum" 1221 | version = "1.12.0" 1222 | source = "registry+https://github.com/rust-lang/crates.io-index" 1223 | checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" 1224 | 1225 | [[package]] 1226 | name = "unicase" 1227 | version = "2.6.0" 1228 | source = "registry+https://github.com/rust-lang/crates.io-index" 1229 | checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" 1230 | dependencies = [ 1231 | "version_check", 1232 | ] 1233 | 1234 | [[package]] 1235 | name = "unicode-bidi" 1236 | version = "0.3.4" 1237 | source = "registry+https://github.com/rust-lang/crates.io-index" 1238 | checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" 1239 | dependencies = [ 1240 | "matches", 1241 | ] 1242 | 1243 | [[package]] 1244 | name = "unicode-normalization" 1245 | version = "0.1.13" 1246 | source = "registry+https://github.com/rust-lang/crates.io-index" 1247 | checksum = "6fb19cf769fa8c6a80a162df694621ebeb4dafb606470b2b2fce0be40a98a977" 1248 | dependencies = [ 1249 | "tinyvec", 1250 | ] 1251 | 1252 | [[package]] 1253 | name = "unicode-segmentation" 1254 | version = "1.6.0" 1255 | source = "registry+https://github.com/rust-lang/crates.io-index" 1256 | checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" 1257 | 1258 | [[package]] 1259 | name = "unicode-width" 1260 | version = "0.1.8" 1261 | source = "registry+https://github.com/rust-lang/crates.io-index" 1262 | checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" 1263 | 1264 | [[package]] 1265 | name = "unicode-xid" 1266 | version = "0.2.1" 1267 | source = "registry+https://github.com/rust-lang/crates.io-index" 1268 | checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" 1269 | 1270 | [[package]] 1271 | name = "url" 1272 | version = "2.1.1" 1273 | source = "registry+https://github.com/rust-lang/crates.io-index" 1274 | checksum = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" 1275 | dependencies = [ 1276 | "idna", 1277 | "matches", 1278 | "percent-encoding", 1279 | ] 1280 | 1281 | [[package]] 1282 | name = "vcpkg" 1283 | version = "0.2.10" 1284 | source = "registry+https://github.com/rust-lang/crates.io-index" 1285 | checksum = "6454029bf181f092ad1b853286f23e2c507d8e8194d01d92da4a55c274a5508c" 1286 | 1287 | [[package]] 1288 | name = "vec_map" 1289 | version = "0.8.2" 1290 | source = "registry+https://github.com/rust-lang/crates.io-index" 1291 | checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" 1292 | 1293 | [[package]] 1294 | name = "version_check" 1295 | version = "0.9.2" 1296 | source = "registry+https://github.com/rust-lang/crates.io-index" 1297 | checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" 1298 | 1299 | [[package]] 1300 | name = "want" 1301 | version = "0.3.0" 1302 | source = "registry+https://github.com/rust-lang/crates.io-index" 1303 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 1304 | dependencies = [ 1305 | "log", 1306 | "try-lock", 1307 | ] 1308 | 1309 | [[package]] 1310 | name = "wasi" 1311 | version = "0.9.0+wasi-snapshot-preview1" 1312 | source = "registry+https://github.com/rust-lang/crates.io-index" 1313 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 1314 | 1315 | [[package]] 1316 | name = "wasm-bindgen" 1317 | version = "0.2.68" 1318 | source = "registry+https://github.com/rust-lang/crates.io-index" 1319 | checksum = "1ac64ead5ea5f05873d7c12b545865ca2b8d28adfc50a49b84770a3a97265d42" 1320 | dependencies = [ 1321 | "cfg-if", 1322 | "serde", 1323 | "serde_json", 1324 | "wasm-bindgen-macro", 1325 | ] 1326 | 1327 | [[package]] 1328 | name = "wasm-bindgen-backend" 1329 | version = "0.2.68" 1330 | source = "registry+https://github.com/rust-lang/crates.io-index" 1331 | checksum = "f22b422e2a757c35a73774860af8e112bff612ce6cb604224e8e47641a9e4f68" 1332 | dependencies = [ 1333 | "bumpalo", 1334 | "lazy_static", 1335 | "log", 1336 | "proc-macro2", 1337 | "quote", 1338 | "syn", 1339 | "wasm-bindgen-shared", 1340 | ] 1341 | 1342 | [[package]] 1343 | name = "wasm-bindgen-futures" 1344 | version = "0.4.18" 1345 | source = "registry+https://github.com/rust-lang/crates.io-index" 1346 | checksum = "b7866cab0aa01de1edf8b5d7936938a7e397ee50ce24119aef3e1eaa3b6171da" 1347 | dependencies = [ 1348 | "cfg-if", 1349 | "js-sys", 1350 | "wasm-bindgen", 1351 | "web-sys", 1352 | ] 1353 | 1354 | [[package]] 1355 | name = "wasm-bindgen-macro" 1356 | version = "0.2.68" 1357 | source = "registry+https://github.com/rust-lang/crates.io-index" 1358 | checksum = "6b13312a745c08c469f0b292dd2fcd6411dba5f7160f593da6ef69b64e407038" 1359 | dependencies = [ 1360 | "quote", 1361 | "wasm-bindgen-macro-support", 1362 | ] 1363 | 1364 | [[package]] 1365 | name = "wasm-bindgen-macro-support" 1366 | version = "0.2.68" 1367 | source = "registry+https://github.com/rust-lang/crates.io-index" 1368 | checksum = "f249f06ef7ee334cc3b8ff031bfc11ec99d00f34d86da7498396dc1e3b1498fe" 1369 | dependencies = [ 1370 | "proc-macro2", 1371 | "quote", 1372 | "syn", 1373 | "wasm-bindgen-backend", 1374 | "wasm-bindgen-shared", 1375 | ] 1376 | 1377 | [[package]] 1378 | name = "wasm-bindgen-shared" 1379 | version = "0.2.68" 1380 | source = "registry+https://github.com/rust-lang/crates.io-index" 1381 | checksum = "1d649a3145108d7d3fbcde896a468d1bd636791823c9921135218ad89be08307" 1382 | 1383 | [[package]] 1384 | name = "web-sys" 1385 | version = "0.3.45" 1386 | source = "registry+https://github.com/rust-lang/crates.io-index" 1387 | checksum = "4bf6ef87ad7ae8008e15a355ce696bed26012b7caa21605188cfd8214ab51e2d" 1388 | dependencies = [ 1389 | "js-sys", 1390 | "wasm-bindgen", 1391 | ] 1392 | 1393 | [[package]] 1394 | name = "winapi" 1395 | version = "0.2.8" 1396 | source = "registry+https://github.com/rust-lang/crates.io-index" 1397 | checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 1398 | 1399 | [[package]] 1400 | name = "winapi" 1401 | version = "0.3.9" 1402 | source = "registry+https://github.com/rust-lang/crates.io-index" 1403 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1404 | dependencies = [ 1405 | "winapi-i686-pc-windows-gnu", 1406 | "winapi-x86_64-pc-windows-gnu", 1407 | ] 1408 | 1409 | [[package]] 1410 | name = "winapi-build" 1411 | version = "0.1.1" 1412 | source = "registry+https://github.com/rust-lang/crates.io-index" 1413 | checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 1414 | 1415 | [[package]] 1416 | name = "winapi-i686-pc-windows-gnu" 1417 | version = "0.4.0" 1418 | source = "registry+https://github.com/rust-lang/crates.io-index" 1419 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1420 | 1421 | [[package]] 1422 | name = "winapi-util" 1423 | version = "0.1.5" 1424 | source = "registry+https://github.com/rust-lang/crates.io-index" 1425 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 1426 | dependencies = [ 1427 | "winapi 0.3.9", 1428 | ] 1429 | 1430 | [[package]] 1431 | name = "winapi-x86_64-pc-windows-gnu" 1432 | version = "0.4.0" 1433 | source = "registry+https://github.com/rust-lang/crates.io-index" 1434 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1435 | 1436 | [[package]] 1437 | name = "winreg" 1438 | version = "0.7.0" 1439 | source = "registry+https://github.com/rust-lang/crates.io-index" 1440 | checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" 1441 | dependencies = [ 1442 | "winapi 0.3.9", 1443 | ] 1444 | 1445 | [[package]] 1446 | name = "ws2_32-sys" 1447 | version = "0.2.1" 1448 | source = "registry+https://github.com/rust-lang/crates.io-index" 1449 | checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 1450 | dependencies = [ 1451 | "winapi 0.2.8", 1452 | "winapi-build", 1453 | ] 1454 | 1455 | [[package]] 1456 | name = "xz2" 1457 | version = "0.1.6" 1458 | source = "registry+https://github.com/rust-lang/crates.io-index" 1459 | checksum = "c179869f34fc7c01830d3ce7ea2086bc3a07e0d35289b667d0a8bf910258926c" 1460 | dependencies = [ 1461 | "lzma-sys", 1462 | ] 1463 | --------------------------------------------------------------------------------