├── test ├── .gitignore ├── hello.txt └── alpine.tar ├── README.md ├── .gitignore ├── Cargo.toml ├── examples ├── zlib.rs ├── flate2.rs └── libz.rs ├── LICENSE ├── src └── main.rs └── Cargo.lock /test/.gitignore: -------------------------------------------------------------------------------- 1 | *.gz 2 | -------------------------------------------------------------------------------- /test/hello.txt: -------------------------------------------------------------------------------- 1 | Hello, World! -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gzpar 2 | 3 | A parallel gzip implementation in Rust. 4 | -------------------------------------------------------------------------------- /test/alpine.tar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unknown/gzpar/main/test/alpine.tar -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | 3 | 4 | # Added by cargo 5 | # 6 | # already existing elements were commented out 7 | 8 | #/target 9 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "gzpar" 3 | version = "0.1.0" 4 | edition = "2024" 5 | 6 | [dependencies] 7 | anyhow = "1.0.97" 8 | clap = { version = "4.5.35", features = ["derive"] } 9 | crc32fast = "1.4.2" 10 | gzip-header = "1.0.0" 11 | memmap2 = "0.9.5" 12 | rayon = "1.10.0" 13 | zlib-rs = "0.5.0" 14 | 15 | [dev-dependencies] 16 | flate2 = "1.1.1" 17 | libz-rs-sys = "0.5.0" 18 | -------------------------------------------------------------------------------- /examples/zlib.rs: -------------------------------------------------------------------------------- 1 | use zlib_rs::{ 2 | DeflateFlush, ReturnCode, 3 | deflate::{self, DeflateConfig}, 4 | }; 5 | 6 | fn main() { 7 | let input = "Hello, World!"; 8 | let mut output = [0; 128]; 9 | 10 | let config = DeflateConfig::default(); 11 | 12 | let (deflated, err) = deflate::compress_slice_with_flush( 13 | &mut output, 14 | input.as_bytes(), 15 | config, 16 | DeflateFlush::Finish, 17 | ); 18 | assert_eq!(err, ReturnCode::Ok); 19 | 20 | println!("input: {:?}", input.as_bytes()); 21 | println!("deflated: {:?}", deflated); 22 | } 23 | -------------------------------------------------------------------------------- /examples/flate2.rs: -------------------------------------------------------------------------------- 1 | use std::{ 2 | fs::File, 3 | io::{BufReader, copy}, 4 | path::PathBuf, 5 | }; 6 | 7 | use anyhow::{Context, Result}; 8 | use flate2::{Compression, write::GzEncoder}; 9 | 10 | const FILE_PATH: &str = "test/hello.txt"; 11 | 12 | fn main() -> Result<()> { 13 | let path = PathBuf::from(FILE_PATH); 14 | let file = File::open(&path).context("failed to open file")?; 15 | let mut reader = BufReader::new(file); 16 | 17 | let output_path = { 18 | let mut p = path.as_os_str().to_os_string(); 19 | p.push(".gz"); 20 | p 21 | }; 22 | let output = File::create(output_path)?; 23 | let mut encoder = GzEncoder::new(output, Compression::default()); 24 | 25 | copy(&mut reader, &mut encoder)?; 26 | Ok(()) 27 | } 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 David Mo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /examples/libz.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | let mut strm = libz_rs_sys::z_stream::default(); 3 | 4 | let version = libz_rs_sys::zlibVersion(); 5 | let stream_size = core::mem::size_of_val(&strm) as i32; 6 | 7 | let level = libz_rs_sys::Z_DEFAULT_COMPRESSION; // the default compression level 8 | let err = unsafe { libz_rs_sys::deflateInit_(&mut strm, level, version, stream_size) }; 9 | assert_eq!(err, libz_rs_sys::Z_OK); 10 | 11 | let input = "Hello, World!"; 12 | strm.avail_in = input.len() as _; 13 | strm.next_in = input.as_ptr(); 14 | 15 | let mut output = [0u8; 32]; 16 | strm.avail_out = output.len() as _; 17 | strm.next_out = output.as_mut_ptr(); 18 | 19 | let err = unsafe { libz_rs_sys::deflate(&mut strm, libz_rs_sys::Z_FINISH) }; 20 | assert_eq!(err, libz_rs_sys::Z_STREAM_END); 21 | 22 | let err = unsafe { libz_rs_sys::deflateEnd(&mut strm) }; 23 | assert_eq!(err, libz_rs_sys::Z_OK); 24 | 25 | let deflated = &mut output[..strm.total_out as usize]; 26 | 27 | let mut strm = libz_rs_sys::z_stream::default(); 28 | let err = unsafe { libz_rs_sys::inflateInit_(&mut strm, version, stream_size) }; 29 | assert_eq!(err, libz_rs_sys::Z_OK); 30 | 31 | strm.avail_in = deflated.len() as _; 32 | strm.next_in = deflated.as_ptr(); 33 | 34 | let mut output = [0u8; 32]; 35 | strm.avail_out = output.len() as _; 36 | strm.next_out = output.as_mut_ptr(); 37 | 38 | let err = unsafe { libz_rs_sys::inflate(&mut strm, libz_rs_sys::Z_FINISH) }; 39 | assert_eq!(err, libz_rs_sys::Z_STREAM_END); 40 | 41 | let err = unsafe { libz_rs_sys::inflateEnd(&mut strm) }; 42 | assert_eq!(err, libz_rs_sys::Z_OK); 43 | 44 | let inflated = &output[..strm.total_out as usize]; 45 | 46 | assert_eq!(inflated, input.as_bytes()); 47 | 48 | println!("input: {:?}", input.as_bytes()); 49 | println!("deflated: {:?}", deflated); 50 | println!("inflated: {:?}", inflated); 51 | } 52 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use std::{ 2 | ffi::OsString, 3 | fs::File, 4 | io::{BufWriter, Write}, 5 | path::{Path, PathBuf}, 6 | }; 7 | 8 | use anyhow::{Result, ensure}; 9 | use clap::Parser; 10 | use crc32fast::Hasher; 11 | use gzip_header::{FileSystemType, GzBuilder}; 12 | use memmap2::Mmap; 13 | use rayon::prelude::*; 14 | use zlib_rs::{ 15 | DeflateFlush, MAX_WBITS, ReturnCode, 16 | deflate::{self, DeflateConfig}, 17 | }; 18 | 19 | #[derive(Parser, Debug)] 20 | struct Cli { 21 | file: PathBuf, 22 | #[arg(short, long, default_value_t = 128 * 1024)] // 128 KiB 23 | block_size: usize, 24 | } 25 | 26 | fn main() -> Result<()> { 27 | let cli = Cli::parse(); 28 | 29 | compress_file(&cli.file, cli.block_size)?; 30 | 31 | Ok(()) 32 | } 33 | 34 | fn compress_file(path: &Path, block_size: usize) -> Result<()> { 35 | let gz_extension = path 36 | .extension() 37 | .map(|e| { 38 | let mut e = e.to_owned(); 39 | e.push(".gz"); 40 | e 41 | }) 42 | .unwrap_or_else(|| OsString::from(".gz")); 43 | let output_file = File::create(path.with_extension(gz_extension))?; 44 | let mut writer = BufWriter::new(output_file); 45 | 46 | let header = GzBuilder::new().os(FileSystemType::Unknown).into_header(); 47 | writer.write_all(&header)?; 48 | 49 | let file = File::open(path)?; 50 | let mmap = unsafe { Mmap::map(&file)? }; 51 | let blocks = mmap.chunks(block_size).collect::>(); 52 | let num_blocks = blocks.len(); 53 | 54 | let compressed_blocks = blocks 55 | .into_par_iter() 56 | .enumerate() 57 | .map(|(i, b)| gzip_block(b, i == num_blocks - 1).unwrap()) 58 | .collect::>(); 59 | 60 | let mut combined_hasher = Hasher::new(); 61 | for (block, hasher) in compressed_blocks.into_iter() { 62 | writer.write_all(&block)?; 63 | combined_hasher.combine(&hasher); 64 | } 65 | 66 | let crc = combined_hasher.finalize(); 67 | writer.write_all(&crc.to_le_bytes())?; 68 | 69 | let total_size: u32 = file.metadata()?.len().try_into()?; 70 | writer.write_all(&total_size.to_le_bytes())?; 71 | 72 | Ok(()) 73 | } 74 | 75 | fn gzip_block(block: &[u8], is_last: bool) -> Result<(Vec, Hasher)> { 76 | let size = deflate::compress_bound(block.len()); 77 | let mut buffer = vec![0; size]; 78 | let deflated = deflate_block(&mut buffer, block, is_last)?; 79 | 80 | let mut hasher = Hasher::new(); 81 | hasher.update(block); 82 | 83 | Ok((deflated.to_vec(), hasher)) 84 | } 85 | 86 | fn deflate_block<'a>(output: &'a mut [u8], block: &[u8], is_last: bool) -> Result<&'a [u8]> { 87 | let config = DeflateConfig { 88 | // A negative `window_bits` generates raw deflate data with no zlib header or trailer. 89 | window_bits: -MAX_WBITS, 90 | ..Default::default() 91 | }; 92 | 93 | let (flush, expected_err) = if is_last { 94 | (DeflateFlush::Finish, ReturnCode::Ok) 95 | } else { 96 | (DeflateFlush::SyncFlush, ReturnCode::DataError) 97 | }; 98 | 99 | let (deflated, err) = deflate::compress_slice_with_flush(output, block, config, flush); 100 | ensure!(err == expected_err, "failed to deflate"); 101 | 102 | Ok(deflated) 103 | } 104 | -------------------------------------------------------------------------------- /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 = "adler2" 7 | version = "2.0.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 10 | 11 | [[package]] 12 | name = "anstream" 13 | version = "0.6.18" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 16 | dependencies = [ 17 | "anstyle", 18 | "anstyle-parse", 19 | "anstyle-query", 20 | "anstyle-wincon", 21 | "colorchoice", 22 | "is_terminal_polyfill", 23 | "utf8parse", 24 | ] 25 | 26 | [[package]] 27 | name = "anstyle" 28 | version = "1.0.10" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 31 | 32 | [[package]] 33 | name = "anstyle-parse" 34 | version = "0.2.6" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 37 | dependencies = [ 38 | "utf8parse", 39 | ] 40 | 41 | [[package]] 42 | name = "anstyle-query" 43 | version = "1.1.2" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 46 | dependencies = [ 47 | "windows-sys", 48 | ] 49 | 50 | [[package]] 51 | name = "anstyle-wincon" 52 | version = "3.0.7" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" 55 | dependencies = [ 56 | "anstyle", 57 | "once_cell", 58 | "windows-sys", 59 | ] 60 | 61 | [[package]] 62 | name = "anyhow" 63 | version = "1.0.97" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" 66 | 67 | [[package]] 68 | name = "cfg-if" 69 | version = "1.0.0" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 72 | 73 | [[package]] 74 | name = "clap" 75 | version = "4.5.35" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "d8aa86934b44c19c50f87cc2790e19f54f7a67aedb64101c2e1a2e5ecfb73944" 78 | dependencies = [ 79 | "clap_builder", 80 | "clap_derive", 81 | ] 82 | 83 | [[package]] 84 | name = "clap_builder" 85 | version = "4.5.35" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "2414dbb2dd0695280da6ea9261e327479e9d37b0630f6b53ba2a11c60c679fd9" 88 | dependencies = [ 89 | "anstream", 90 | "anstyle", 91 | "clap_lex", 92 | "strsim", 93 | ] 94 | 95 | [[package]] 96 | name = "clap_derive" 97 | version = "4.5.32" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" 100 | dependencies = [ 101 | "heck", 102 | "proc-macro2", 103 | "quote", 104 | "syn", 105 | ] 106 | 107 | [[package]] 108 | name = "clap_lex" 109 | version = "0.7.4" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 112 | 113 | [[package]] 114 | name = "colorchoice" 115 | version = "1.0.3" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 118 | 119 | [[package]] 120 | name = "crc32fast" 121 | version = "1.4.2" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 124 | dependencies = [ 125 | "cfg-if", 126 | ] 127 | 128 | [[package]] 129 | name = "crossbeam-deque" 130 | version = "0.8.6" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 133 | dependencies = [ 134 | "crossbeam-epoch", 135 | "crossbeam-utils", 136 | ] 137 | 138 | [[package]] 139 | name = "crossbeam-epoch" 140 | version = "0.9.18" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 143 | dependencies = [ 144 | "crossbeam-utils", 145 | ] 146 | 147 | [[package]] 148 | name = "crossbeam-utils" 149 | version = "0.8.21" 150 | source = "registry+https://github.com/rust-lang/crates.io-index" 151 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 152 | 153 | [[package]] 154 | name = "either" 155 | version = "1.15.0" 156 | source = "registry+https://github.com/rust-lang/crates.io-index" 157 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 158 | 159 | [[package]] 160 | name = "flate2" 161 | version = "1.1.1" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" 164 | dependencies = [ 165 | "crc32fast", 166 | "miniz_oxide", 167 | ] 168 | 169 | [[package]] 170 | name = "gzip-header" 171 | version = "1.0.0" 172 | source = "registry+https://github.com/rust-lang/crates.io-index" 173 | checksum = "95cc527b92e6029a62960ad99aa8a6660faa4555fe5f731aab13aa6a921795a2" 174 | dependencies = [ 175 | "crc32fast", 176 | ] 177 | 178 | [[package]] 179 | name = "gzpar" 180 | version = "0.1.0" 181 | dependencies = [ 182 | "anyhow", 183 | "clap", 184 | "crc32fast", 185 | "flate2", 186 | "gzip-header", 187 | "libz-rs-sys", 188 | "memmap2", 189 | "rayon", 190 | "zlib-rs", 191 | ] 192 | 193 | [[package]] 194 | name = "heck" 195 | version = "0.5.0" 196 | source = "registry+https://github.com/rust-lang/crates.io-index" 197 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 198 | 199 | [[package]] 200 | name = "is_terminal_polyfill" 201 | version = "1.70.1" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 204 | 205 | [[package]] 206 | name = "libc" 207 | version = "0.2.172" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" 210 | 211 | [[package]] 212 | name = "libz-rs-sys" 213 | version = "0.5.0" 214 | source = "registry+https://github.com/rust-lang/crates.io-index" 215 | checksum = "6489ca9bd760fe9642d7644e827b0c9add07df89857b0416ee15c1cc1a3b8c5a" 216 | dependencies = [ 217 | "zlib-rs", 218 | ] 219 | 220 | [[package]] 221 | name = "memmap2" 222 | version = "0.9.5" 223 | source = "registry+https://github.com/rust-lang/crates.io-index" 224 | checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" 225 | dependencies = [ 226 | "libc", 227 | ] 228 | 229 | [[package]] 230 | name = "miniz_oxide" 231 | version = "0.8.6" 232 | source = "registry+https://github.com/rust-lang/crates.io-index" 233 | checksum = "29c72f6929239626840b28f919ce8981a317fc5dc63ce25c30d2ab372f94886f" 234 | dependencies = [ 235 | "adler2", 236 | ] 237 | 238 | [[package]] 239 | name = "once_cell" 240 | version = "1.21.3" 241 | source = "registry+https://github.com/rust-lang/crates.io-index" 242 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 243 | 244 | [[package]] 245 | name = "proc-macro2" 246 | version = "1.0.94" 247 | source = "registry+https://github.com/rust-lang/crates.io-index" 248 | checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" 249 | dependencies = [ 250 | "unicode-ident", 251 | ] 252 | 253 | [[package]] 254 | name = "quote" 255 | version = "1.0.40" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 258 | dependencies = [ 259 | "proc-macro2", 260 | ] 261 | 262 | [[package]] 263 | name = "rayon" 264 | version = "1.10.0" 265 | source = "registry+https://github.com/rust-lang/crates.io-index" 266 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 267 | dependencies = [ 268 | "either", 269 | "rayon-core", 270 | ] 271 | 272 | [[package]] 273 | name = "rayon-core" 274 | version = "1.12.1" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 277 | dependencies = [ 278 | "crossbeam-deque", 279 | "crossbeam-utils", 280 | ] 281 | 282 | [[package]] 283 | name = "strsim" 284 | version = "0.11.1" 285 | source = "registry+https://github.com/rust-lang/crates.io-index" 286 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 287 | 288 | [[package]] 289 | name = "syn" 290 | version = "2.0.100" 291 | source = "registry+https://github.com/rust-lang/crates.io-index" 292 | checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" 293 | dependencies = [ 294 | "proc-macro2", 295 | "quote", 296 | "unicode-ident", 297 | ] 298 | 299 | [[package]] 300 | name = "unicode-ident" 301 | version = "1.0.18" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 304 | 305 | [[package]] 306 | name = "utf8parse" 307 | version = "0.2.2" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 310 | 311 | [[package]] 312 | name = "windows-sys" 313 | version = "0.59.0" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 316 | dependencies = [ 317 | "windows-targets", 318 | ] 319 | 320 | [[package]] 321 | name = "windows-targets" 322 | version = "0.52.6" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 325 | dependencies = [ 326 | "windows_aarch64_gnullvm", 327 | "windows_aarch64_msvc", 328 | "windows_i686_gnu", 329 | "windows_i686_gnullvm", 330 | "windows_i686_msvc", 331 | "windows_x86_64_gnu", 332 | "windows_x86_64_gnullvm", 333 | "windows_x86_64_msvc", 334 | ] 335 | 336 | [[package]] 337 | name = "windows_aarch64_gnullvm" 338 | version = "0.52.6" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 341 | 342 | [[package]] 343 | name = "windows_aarch64_msvc" 344 | version = "0.52.6" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 347 | 348 | [[package]] 349 | name = "windows_i686_gnu" 350 | version = "0.52.6" 351 | source = "registry+https://github.com/rust-lang/crates.io-index" 352 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 353 | 354 | [[package]] 355 | name = "windows_i686_gnullvm" 356 | version = "0.52.6" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 359 | 360 | [[package]] 361 | name = "windows_i686_msvc" 362 | version = "0.52.6" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 365 | 366 | [[package]] 367 | name = "windows_x86_64_gnu" 368 | version = "0.52.6" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 371 | 372 | [[package]] 373 | name = "windows_x86_64_gnullvm" 374 | version = "0.52.6" 375 | source = "registry+https://github.com/rust-lang/crates.io-index" 376 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 377 | 378 | [[package]] 379 | name = "windows_x86_64_msvc" 380 | version = "0.52.6" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 383 | 384 | [[package]] 385 | name = "zlib-rs" 386 | version = "0.5.0" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "868b928d7949e09af2f6086dfc1e01936064cc7a819253bce650d4e2a2d63ba8" 389 | --------------------------------------------------------------------------------