diff --git a/Cargo.toml b/Cargo.toml index f4bbab8..a894ac4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ cpufeatures = "0.2" [dev-dependencies] hex = "~0.4.2" +hex-literal = "0.4" serde = { version = "1.0", features = ["derive"] } serde_json = { version = "1.0", default-features = false, features = ["alloc"] } diff --git a/README.md b/README.md index 0fdde7a..45d4d68 100644 --- a/README.md +++ b/README.md @@ -25,18 +25,24 @@ than `libstd` in formatting. You can run the following benchmarks with `cargo bench` on a nightly compiler. ```log -test encode_const_hex::bench1_32 ... bench: 1 ns/iter (+/- 0) -test encode_const_hex::bench2_128 ... bench: 5 ns/iter (+/- 0) -test encode_const_hex::bench3_4096 ... bench: 204 ns/iter (+/- 9) -test encode_hex::bench1_32 ... bench: 15 ns/iter (+/- 1) -test encode_hex::bench2_128 ... bench: 60 ns/iter (+/- 2) -test encode_hex::bench3_4096 ... bench: 1,703 ns/iter (+/- 50) -test format_const_hex::bench1_32 ... bench: 15 ns/iter (+/- 0) -test format_const_hex::bench2_128 ... bench: 20 ns/iter (+/- 0) -test format_const_hex::bench3_4096 ... bench: 380 ns/iter (+/- 9) -test format_std::bench1_32 ... bench: 470 ns/iter (+/- 4) -test format_std::bench2_128 ... bench: 1,961 ns/iter (+/- 17) -test format_std::bench3_4096 ... bench: 61,688 ns/iter (+/- 1,994) +test decode::const_hex::bench1_32 ... bench: 12 ns/iter (+/- 0) +test decode::const_hex::bench2_128 ... bench: 43 ns/iter (+/- 0) +test decode::const_hex::bench3_4096 ... bench: 1,349 ns/iter (+/- 24) +test decode::hex::bench1_32 ... bench: 50 ns/iter (+/- 1) +test decode::hex::bench2_128 ... bench: 233 ns/iter (+/- 16) +test decode::hex::bench3_4096 ... bench: 7,323 ns/iter (+/- 85) +test encode::const_hex::bench1_32 ... bench: 1 ns/iter (+/- 0) +test encode::const_hex::bench2_128 ... bench: 4 ns/iter (+/- 0) +test encode::const_hex::bench3_4096 ... bench: 138 ns/iter (+/- 0) +test encode::hex::bench1_32 ... bench: 13 ns/iter (+/- 0) +test encode::hex::bench2_128 ... bench: 51 ns/iter (+/- 4) +test encode::hex::bench3_4096 ... bench: 1,593 ns/iter (+/- 13) +test format::const_hex::bench1_32 ... bench: 11 ns/iter (+/- 0) +test format::const_hex::bench2_128 ... bench: 14 ns/iter (+/- 0) +test format::const_hex::bench3_4096 ... bench: 312 ns/iter (+/- 2) +test format::std::bench1_32 ... bench: 462 ns/iter (+/- 1) +test format::std::bench2_128 ... bench: 1,929 ns/iter (+/- 4) +test format::std::bench3_4096 ... bench: 62,233 ns/iter (+/- 523) ``` ## Acknowledgements diff --git a/benches/bench.rs b/benches/bench.rs index a87c0ad..1d682ab 100644 --- a/benches/bench.rs +++ b/benches/bench.rs @@ -1,23 +1,23 @@ #![feature(test)] +extern crate test; + use std::fmt; use std::io::Write; use test::{black_box, Bencher}; -extern crate test; - -struct HexBufferFormat([u8; N]); +struct HexBufferFormat(&'static [u8; N]); impl fmt::Display for HexBufferFormat { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let mut buffer = const_hex::Buffer::::new(); - f.write_str(buffer.format(&self.0)) + f.write_str(buffer.format(self.0)) } } -struct StdFormat([u8; N]); +struct StdFormat(&'static [u8; N]); impl fmt::Display for StdFormat { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - for byte in &self.0 { + for &byte in self.0 { write!(f, "{byte:02x}")?; } Ok(()) @@ -25,7 +25,43 @@ impl fmt::Display for StdFormat { } macro_rules! benches { - ($($name:ident($value:expr))*) => { + ($($name:ident($enc:expr, $dec:expr))*) => { + mod decode { + use super::*; + + mod const_hex { + use super::*; + + $( + #[bench] + fn $name(b: &mut Bencher) { + let buf = &mut [0; $dec.len() / 2]; + + b.iter(|| { + let res = ::const_hex::decode_to_slice(black_box($dec), black_box(buf)); + black_box(res.unwrap()); + }); + } + )* + } + + mod hex { + use super::*; + + $( + #[bench] + fn $name(b: &mut Bencher) { + let buf = &mut [0; $dec.len() / 2]; + + b.iter(|| { + let res = ::hex::decode_to_slice(black_box($dec), black_box(buf)); + black_box(res.unwrap()); + }); + } + )* + } + } + mod encode { use super::*; @@ -35,10 +71,10 @@ macro_rules! benches { $( #[bench] fn $name(b: &mut Bencher) { - let buf = &mut [0; $value.len() * 2]; + let buf = &mut [0; $enc.len() * 2]; b.iter(|| { - let res = ::const_hex::encode_to_slice(black_box($value), black_box(buf)); + let res = ::const_hex::encode_to_slice(black_box($enc), black_box(buf)); black_box(res.unwrap()); }); } @@ -51,10 +87,10 @@ macro_rules! benches { $( #[bench] fn $name(b: &mut Bencher) { - let buf = &mut [0; $value.len() * 2]; + let buf = &mut [0; $enc.len() * 2]; b.iter(|| { - let res = ::hex::encode_to_slice(black_box($value), black_box(buf)); + let res = ::hex::encode_to_slice(black_box($enc), black_box(buf)); black_box(res.unwrap()); }); } @@ -71,11 +107,11 @@ macro_rules! benches { $( #[bench] fn $name(b: &mut Bencher) { - let mut buf = Vec::with_capacity($value.len() * 2); + let mut buf = Vec::with_capacity($enc.len() * 2); b.iter(|| { buf.clear(); - write!(&mut buf, "{}", HexBufferFormat(black_box($value))).unwrap(); + write!(&mut buf, "{}", HexBufferFormat(black_box($enc))).unwrap(); black_box(&buf); }); } @@ -88,11 +124,11 @@ macro_rules! benches { $( #[bench] fn $name(b: &mut Bencher) { - let mut buf = Vec::with_capacity($value.len() * 2); + let mut buf = Vec::with_capacity($enc.len() * 2); b.iter(|| { buf.clear(); - write!(&mut buf, "{}", StdFormat(black_box($value))).unwrap(); + write!(&mut buf, "{}", StdFormat(black_box($enc))).unwrap(); black_box(&buf); }); } @@ -103,14 +139,20 @@ macro_rules! benches { } benches! { - bench1_32 (bytes::RANDOM_32) - bench2_128 (bytes::RANDOM_128) - bench3_4096(bytes::RANDOM_4096) + bench1_32(bytes::ENC_32, bytes::DEC_32) + bench2_128(bytes::ENC_128, bytes::DEC_128) + bench3_4096(bytes::ENC_4096, bytes::DEC_4096) } #[rustfmt::skip] mod bytes { - pub const RANDOM_32: [u8; 32] = [100, 197, 88, 139, 129, 227, 69, 222, 212, 191, 137, 88, 237, 58, 135, 249, 177, 77, 98, 78, 5, 82, 161, 28, 74, 239, 126, 236, 233, 50, 224, 78]; - pub const RANDOM_128: [u8; 128] = [123, 148, 8, 6, 158, 225, 224, 107, 109, 82, 163, 49, 22, 38, 180, 76, 229, 157, 17, 40, 49, 148, 144, 0, 19, 95, 70, 221, 231, 184, 229, 194, 152, 144, 177, 39, 10, 217, 92, 93, 204, 185, 214, 172, 148, 229, 251, 16, 126, 180, 48, 78, 117, 208, 61, 54, 193, 212, 245, 12, 185, 254, 215, 248, 44, 72, 231, 234, 122, 127, 147, 196, 243, 244, 247, 41, 102, 6, 142, 117, 13, 215, 115, 90, 215, 223, 78, 130, 158, 79, 81, 32, 55, 238, 252, 242, 26, 83, 149, 156, 101, 243, 190, 177, 81, 129, 118, 248, 22, 171, 247, 131, 80, 181, 100, 59, 54, 119, 198, 107, 147, 13, 105, 201, 74, 93, 2, 163]; - pub const RANDOM_4096: [u8; 4096] = [59, 192, 90, 59, 88, 226, 203, 73, 114, 189, 173, 179, 180, 85, 240, 18, 2, 101, 112, 52, 166, 249, 89, 6, 8, 25, 6, 126, 92, 196, 85, 219, 169, 215, 195, 173, 213, 137, 188, 226, 48, 5, 246, 159, 50, 128, 192, 34, 196, 133, 45, 158, 168, 216, 100, 217, 176, 126, 171, 10, 241, 41, 19, 133, 52, 70, 212, 54, 72, 3, 132, 252, 127, 114, 164, 242, 184, 118, 208, 206, 113, 143, 10, 25, 15, 199, 43, 7, 128, 241, 137, 238, 113, 139, 62, 101, 190, 207, 115, 241, 179, 186, 179, 20, 57, 72, 251, 232, 243, 219, 45, 14, 52, 238, 226, 61, 189, 242, 161, 27, 209, 49, 20, 22, 244, 36, 160, 170, 103, 191, 134, 137, 255, 221, 238, 206, 174, 24, 90, 251, 249, 49, 34, 239, 151, 32, 84, 205, 33, 139, 238, 248, 161, 210, 143, 191, 145, 57, 14, 90, 65, 134, 241, 145, 26, 83, 83, 0, 41, 59, 133, 47, 154, 135, 202, 15, 249, 102, 78, 183, 105, 26, 26, 113, 152, 158, 175, 217, 48, 164, 250, 78, 186, 228, 50, 19, 16, 162, 28, 220, 161, 40, 122, 54, 141, 78, 77, 140, 26, 213, 70, 52, 238, 67, 104, 220, 50, 250, 195, 221, 188, 81, 120, 15, 231, 58, 100, 132, 59, 241, 221, 153, 50, 221, 135, 236, 151, 214, 41, 246, 75, 223, 230, 230, 76, 192, 57, 41, 100, 248, 117, 207, 38, 61, 41, 141, 28, 51, 25, 143, 197, 154, 119, 164, 253, 61, 182, 189, 169, 68, 17, 142, 137, 102, 31, 213, 112, 175, 154, 99, 12, 176, 13, 199, 82, 130, 232, 17, 218, 91, 38, 218, 76, 99, 159, 241, 38, 84, 177, 135, 54, 52, 226, 194, 24, 64, 34, 114, 209, 116, 185, 27, 243, 172, 8, 140, 153, 236, 7, 57, 76, 196, 89, 181, 115, 113, 68, 63, 124, 73, 185, 126, 113, 211, 232, 203, 21, 146, 118, 71, 97, 123, 213, 133, 35, 105, 168, 113, 99, 80, 41, 246, 227, 202, 143, 131, 4, 119, 64, 186, 201, 1, 40, 163, 135, 129, 134, 213, 80, 190, 206, 201, 51, 65, 53, 125, 89, 29, 207, 196, 221, 225, 188, 148, 178, 243, 41, 216, 8, 134, 30, 74, 109, 246, 32, 120, 163, 120, 139, 65, 36, 214, 67, 188, 225, 97, 252, 156, 143, 178, 234, 127, 78, 217, 175, 205, 226, 241, 86, 67, 222, 73, 126, 170, 6, 53, 99, 217, 8, 22, 180, 225, 19, 144, 132, 172, 65, 159, 242, 113, 178, 163, 234, 65, 229, 79, 216, 113, 102, 113, 48, 167, 17, 24, 108, 10, 199, 251, 237, 50, 178, 19, 97, 9, 183, 89, 84, 236, 116, 52, 184, 73, 9, 249, 67, 75, 68, 30, 136, 190, 148, 8, 217, 164, 176, 116, 38, 58, 234, 235, 241, 235, 190, 78, 248, 11, 60, 164, 152, 221, 124, 211, 24, 92, 62, 20, 34, 194, 219, 50, 211, 110, 106, 184, 197, 54, 218, 224, 8, 108, 210, 239, 146, 192, 144, 211, 187, 51, 154, 35, 236, 91, 135, 171, 60, 101, 167, 69, 36, 99, 139, 58, 87, 90, 94, 10, 49, 29, 63, 118, 103, 77, 220, 221, 36, 7, 160, 42, 201, 35, 179, 98, 206, 224, 0, 166, 221, 113, 132, 233, 199, 202, 161, 159, 238, 74, 131, 76, 37, 119, 51, 184, 141, 195, 140, 163, 19, 199, 144, 5, 210, 221, 139, 133, 255, 98, 179, 239, 91, 232, 0, 41, 128, 169, 155, 38, 12, 81, 203, 164, 183, 216, 58, 0, 92, 178, 7, 139, 165, 55, 56, 195, 159, 118, 224, 224, 163, 108, 171, 17, 61, 85, 168, 49, 38, 111, 25, 106, 47, 129, 250, 116, 78, 184, 149, 157, 76, 30, 188, 78, 205, 48, 87, 211, 99, 86, 68, 204, 84, 16, 153, 16, 193, 89, 192, 168, 182, 249, 252, 35, 122, 182, 216, 214, 249, 126, 228, 26, 230, 252, 227, 45, 45, 151, 105, 28, 151, 97, 61, 151, 185, 171, 89, 250, 70, 5, 145, 34, 47, 192, 227, 130, 188, 232, 45, 60, 218, 189, 84, 228, 85, 93, 131, 56, 93, 12, 193, 30, 179, 160, 114, 111, 46, 60, 151, 227, 10, 91, 59, 117, 222, 255, 94, 106, 132, 213, 3, 65, 35, 68, 13, 143, 144, 119, 62, 131, 220, 231, 35, 230, 24, 53, 239, 22, 222, 244, 157, 11, 163, 191, 194, 108, 70, 141, 212, 161, 166, 243, 29, 74, 250, 230, 158, 65, 150, 227, 215, 71, 35, 115, 9, 230, 78, 132, 168, 40, 110, 210, 187, 38, 247, 62, 123, 203, 190, 67, 205, 21, 209, 188, 9, 50, 84, 16, 83, 171, 250, 34, 156, 212, 18, 131, 123, 68, 239, 198, 71, 79, 188, 221, 105, 193, 246, 138, 2, 226, 199, 19, 47, 65, 18, 69, 139, 246, 75, 172, 147, 115, 192, 157, 229, 56, 112, 47, 158, 47, 217, 47, 34, 141, 72, 67, 103, 37, 169, 176, 201, 225, 138, 242, 156, 89, 145, 177, 141, 171, 40, 242, 0, 199, 26, 214, 170, 110, 75, 191, 232, 43, 158, 86, 147, 13, 168, 84, 183, 79, 82, 94, 24, 12, 12, 169, 253, 218, 66, 229, 50, 220, 138, 234, 224, 218, 151, 244, 180, 177, 69, 185, 81, 176, 253, 204, 89, 213, 186, 5, 122, 76, 98, 147, 199, 186, 163, 35, 149, 163, 65, 23, 112, 242, 198, 4, 248, 60, 139, 60, 52, 72, 8, 30, 180, 30, 4, 36, 242, 101, 27, 54, 152, 60, 17, 153, 194, 250, 160, 40, 92, 94, 25, 210, 204, 250, 81, 170, 29, 223, 66, 25, 142, 255, 97, 202, 40, 139, 60, 78, 167, 6, 126, 207, 203, 99, 61, 208, 109, 149, 204, 149, 0, 0, 228, 102, 234, 57, 45, 124, 226, 29, 137, 0, 198, 166, 224, 245, 225, 105, 175, 62, 201, 77, 139, 71, 158, 118, 16, 225, 44, 138, 224, 143, 52, 194, 151, 199, 225, 101, 41, 165, 216, 168, 147, 6, 7, 82, 173, 146, 116, 237, 224, 189, 134, 253, 31, 246, 156, 234, 192, 15, 118, 99, 197, 79, 219, 253, 54, 248, 210, 121, 63, 133, 118, 26, 40, 51, 251, 140, 20, 22, 211, 164, 115, 219, 70, 13, 100, 156, 56, 26, 87, 251, 94, 181, 60, 129, 100, 159, 20, 55, 203, 140, 201, 72, 227, 101, 161, 75, 150, 231, 34, 20, 159, 244, 111, 174, 223, 147, 139, 50, 0, 150, 107, 11, 77, 62, 66, 250, 6, 136, 207, 162, 54, 228, 81, 160, 134, 216, 54, 169, 35, 73, 54, 54, 177, 59, 192, 35, 121, 198, 137, 9, 61, 199, 6, 219, 39, 101, 116, 168, 236, 188, 31, 204, 14, 91, 147, 27, 117, 155, 50, 155, 233, 72, 61, 196, 77, 223, 253, 228, 194, 28, 166, 113, 100, 120, 99, 69, 192, 179, 71, 246, 143, 161, 91, 252, 253, 131, 84, 102, 153, 170, 82, 171, 97, 46, 91, 197, 88, 91, 181, 177, 227, 128, 168, 110, 233, 244, 101, 50, 87, 232, 144, 138, 103, 233, 90, 55, 93, 84, 207, 154, 159, 118, 241, 128, 49, 200, 255, 25, 69, 177, 181, 193, 39, 35, 1, 125, 206, 82, 90, 27, 88, 78, 7, 163, 30, 240, 155, 72, 184, 32, 194, 173, 205, 187, 146, 105, 195, 130, 247, 68, 250, 58, 194, 178, 92, 185, 81, 186, 26, 238, 124, 131, 49, 42, 13, 80, 57, 85, 187, 232, 210, 51, 8, 235, 201, 14, 252, 89, 141, 42, 129, 103, 130, 249, 224, 64, 150, 165, 129, 1, 198, 36, 173, 20, 167, 149, 147, 4, 156, 216, 229, 0, 185, 112, 173, 40, 173, 253, 97, 195, 139, 63, 176, 131, 143, 243, 149, 87, 54, 140, 102, 78, 239, 229, 240, 215, 22, 249, 138, 118, 73, 160, 16, 144, 53, 233, 136, 17, 227, 28, 95, 130, 238, 236, 228, 63, 60, 20, 49, 126, 156, 123, 87, 195, 180, 227, 51, 121, 50, 105, 21, 167, 165, 127, 151, 89, 116, 114, 127, 243, 137, 0, 187, 33, 128, 42, 83, 196, 214, 234, 163, 24, 240, 190, 66, 140, 196, 149, 143, 75, 34, 176, 84, 145, 199, 105, 236, 242, 155, 131, 174, 101, 150, 60, 50, 214, 254, 53, 253, 182, 74, 203, 101, 207, 198, 191, 195, 31, 242, 126, 6, 52, 74, 4, 237, 117, 121, 66, 52, 215, 189, 126, 66, 44, 60, 236, 201, 50, 59, 127, 85, 58, 142, 163, 109, 245, 248, 51, 42, 247, 128, 223, 201, 141, 159, 238, 91, 16, 121, 181, 20, 250, 55, 5, 131, 16, 61, 33, 238, 193, 246, 96, 183, 6, 147, 237, 30, 39, 121, 216, 146, 149, 6, 159, 185, 161, 189, 148, 191, 253, 211, 125, 4, 246, 42, 22, 25, 136, 252, 92, 39, 251, 130, 81, 222, 38, 150, 137, 132, 82, 64, 70, 109, 164, 26, 139, 44, 54, 175, 52, 21, 208, 163, 95, 15, 57, 215, 227, 69, 164, 36, 44, 151, 0, 121, 78, 242, 167, 70, 236, 178, 79, 51, 215, 56, 126, 50, 102, 101, 223, 239, 189, 37, 42, 7, 201, 50, 63, 202, 218, 192, 56, 42, 225, 56, 148, 216, 99, 35, 31, 78, 96, 247, 11, 103, 75, 126, 172, 180, 53, 22, 192, 62, 51, 37, 209, 65, 205, 30, 229, 223, 22, 77, 201, 6, 95, 99, 250, 202, 252, 68, 116, 51, 229, 70, 30, 159, 68, 136, 176, 131, 189, 24, 1, 102, 35, 171, 118, 156, 146, 81, 203, 72, 141, 251, 18, 73, 65, 65, 70, 56, 148, 70, 244, 144, 109, 185, 251, 247, 246, 173, 142, 254, 36, 116, 91, 82, 176, 239, 40, 113, 131, 21, 76, 198, 6, 145, 124, 225, 35, 224, 135, 253, 12, 101, 73, 153, 85, 149, 232, 164, 251, 50, 185, 200, 219, 56, 78, 78, 249, 132, 175, 175, 108, 204, 32, 157, 234, 170, 10, 240, 65, 21, 73, 227, 184, 249, 6, 75, 51, 75, 39, 237, 198, 93, 3, 142, 212, 171, 69, 99, 195, 112, 186, 198, 162, 169, 184, 192, 6, 47, 183, 47, 225, 196, 14, 155, 90, 24, 36, 131, 5, 111, 154, 136, 245, 129, 179, 142, 149, 87, 60, 206, 182, 100, 180, 18, 36, 50, 37, 118, 8, 250, 19, 255, 110, 145, 75, 43, 246, 115, 56, 61, 29, 37, 117, 6, 124, 72, 247, 176, 247, 109, 104, 248, 39, 27, 162, 34, 160, 117, 139, 15, 48, 169, 196, 175, 73, 223, 142, 233, 50, 195, 228, 102, 250, 34, 175, 221, 227, 215, 131, 155, 86, 60, 228, 144, 8, 196, 227, 70, 207, 113, 193, 121, 119, 23, 3, 39, 61, 8, 180, 160, 135, 79, 124, 248, 53, 3, 165, 166, 110, 132, 117, 135, 5, 91, 113, 43, 64, 179, 164, 46, 172, 136, 116, 36, 28, 114, 205, 135, 251, 163, 170, 141, 217, 85, 224, 18, 227, 76, 31, 176, 84, 100, 100, 6, 102, 40, 131, 89, 91, 222, 115, 117, 98, 7, 42, 210, 158, 238, 157, 36, 92, 4, 50, 172, 5, 180, 248, 23, 128, 2, 246, 129, 73, 162, 110, 25, 62, 211, 78, 207, 220, 152, 62, 15, 105, 225, 137, 202, 75, 137, 221, 223, 61, 99, 117, 239, 145, 246, 250, 254, 144, 57, 214, 14, 176, 233, 127, 229, 105, 70, 2, 57, 164, 228, 200, 142, 251, 192, 186, 114, 227, 127, 112, 251, 147, 32, 162, 187, 56, 242, 63, 145, 175, 179, 232, 138, 128, 17, 112, 216, 254, 115, 186, 106, 167, 199, 165, 86, 38, 45, 227, 41, 4, 112, 221, 149, 187, 59, 119, 145, 242, 181, 121, 3, 49, 163, 25, 177, 89, 105, 102, 154, 76, 236, 63, 8, 83, 134, 195, 141, 11, 92, 246, 66, 197, 178, 219, 27, 185, 91, 220, 202, 110, 74, 93, 161, 197, 235, 24, 51, 59, 132, 82, 192, 148, 165, 59, 56, 13, 224, 120, 147, 205, 86, 114, 6, 21, 228, 1, 253, 196, 150, 1, 124, 188, 51, 22, 177, 112, 27, 252, 2, 175, 46, 7, 13, 23, 204, 125, 96, 79, 81, 141, 232, 221, 19, 38, 219, 110, 104, 12, 22, 163, 84, 49, 139, 55, 132, 90, 55, 238, 79, 30, 9, 230, 120, 124, 168, 60, 7, 142, 32, 122, 227, 220, 241, 189, 46, 182, 137, 101, 6, 242, 184, 18, 42, 113, 124, 135, 46, 116, 88, 60, 19, 46, 49, 175, 21, 7, 230, 45, 70, 134, 83, 67, 101, 22, 31, 164, 253, 173, 240, 173, 207, 30, 62, 35, 244, 215, 160, 122, 130, 87, 247, 95, 225, 66, 159, 240, 79, 12, 205, 81, 34, 227, 205, 67, 210, 76, 44, 19, 6, 19, 94, 78, 89, 157, 197, 14, 147, 209, 45, 118, 50, 221, 195, 62, 128, 101, 4, 114, 149, 116, 132, 118, 128, 12, 52, 250, 184, 238, 191, 74, 153, 211, 209, 162, 154, 150, 52, 161, 164, 86, 178, 196, 2, 171, 247, 6, 75, 41, 154, 174, 90, 190, 41, 227, 128, 139, 105, 106, 36, 139, 59, 133, 216, 233, 208, 62, 10, 100, 69, 70, 65, 227, 170, 197, 166, 241, 181, 77, 197, 221, 192, 66, 239, 227, 139, 185, 63, 182, 202, 141, 171, 32, 159, 224, 82, 43, 171, 105, 200, 100, 36, 184, 172, 136, 187, 63, 97, 254, 107, 181, 29, 163, 104, 250, 76, 113, 11, 67, 57, 0, 20, 145, 241, 238, 216, 29, 93, 91, 146, 32, 254, 214, 197, 68, 90, 106, 174, 199, 216, 25, 122, 9, 104, 45, 89, 156, 134, 246, 102, 38, 135, 226, 96, 13, 82, 165, 146, 119, 15, 35, 149, 234, 35, 74, 128, 145, 160, 35, 59, 27, 198, 111, 142, 62, 84, 166, 80, 41, 152, 109, 156, 67, 119, 212, 146, 33, 135, 34, 200, 143, 230, 74, 173, 237, 126, 20, 131, 159, 217, 142, 14, 167, 28, 235, 190, 121, 161, 120, 9, 247, 197, 69, 67, 22, 210, 200, 53, 33, 118, 158, 9, 91, 162, 105, 15, 204, 117, 74, 108, 245, 146, 87, 16, 231, 253, 113, 4, 133, 55, 199, 180, 243, 252, 250, 71, 148, 251, 88, 30, 94, 245, 19, 72, 89, 110, 97, 49, 201, 248, 99, 97, 83, 239, 65, 154, 113, 35, 254, 202, 123, 184, 180, 111, 51, 233, 83, 196, 153, 179, 17, 54, 166, 194, 242, 84, 10, 209, 12, 107, 252, 121, 204, 206, 91, 20, 223, 80, 209, 29, 57, 29, 232, 2, 24, 0, 15, 115, 64, 236, 196, 187, 82, 84, 42, 206, 172, 110, 96, 71, 217, 90, 248, 246, 138, 129, 62, 127, 230, 74, 115, 227, 155, 7, 32, 96, 227, 227, 233, 25, 47, 214, 207, 103, 120, 160, 25, 21, 137, 176, 11, 77, 215, 79, 12, 37, 114, 237, 171, 202, 188, 87, 251, 154, 178, 79, 5, 178, 153, 43, 58, 123, 133, 176, 251, 15, 8, 66, 222, 219, 243, 32, 159, 155, 234, 107, 69, 103, 185, 59, 41, 187, 112, 101, 97, 75, 36, 41, 121, 6, 130, 254, 11, 233, 117, 110, 89, 178, 225, 123, 41, 243, 91, 146, 73, 46, 19, 40, 12, 120, 229, 141, 201, 17, 194, 96, 186, 127, 202, 81, 217, 50, 199, 132, 214, 92, 237, 106, 92, 183, 79, 218, 51, 84, 239, 125, 138, 219, 173, 203, 0, 116, 209, 2, 81, 245, 137, 237, 71, 254, 116, 8, 163, 32, 50, 7, 18, 139, 35, 113, 26, 95, 170, 20, 170, 246, 93, 71, 27, 253, 168, 85, 194, 204, 221, 202, 82, 49, 178, 196, 39, 82, 203, 66, 126, 235, 101, 27, 235, 197, 119, 22, 182, 77, 188, 86, 171, 198, 206, 14, 151, 172, 208, 216, 35, 232, 135, 25, 195, 45, 114, 80, 164, 28, 164, 33, 234, 70, 240, 91, 154, 88, 175, 32, 61, 28, 58, 161, 39, 0, 207, 18, 207, 35, 59, 230, 46, 148, 156, 63, 233, 110, 162, 139, 196, 91, 241, 211, 97, 196, 48, 12, 69, 105, 32, 229, 158, 96, 107, 123, 115, 162, 225, 106, 39, 19, 181, 185, 248, 6, 87, 164, 47, 45, 215, 42, 140, 124, 77, 232, 61, 153, 222, 123, 128, 251, 76, 88, 66, 84, 127, 131, 177, 50, 4, 232, 254, 249, 128, 242, 149, 53, 33, 33, 222, 192, 198, 16, 174, 18, 33, 139, 142, 14, 108, 107, 236, 192, 238, 129, 207, 233, 159, 99, 2, 192, 182, 200, 53, 167, 181, 137, 108, 37, 114, 165, 149, 144, 41, 202, 80, 169, 194, 239, 118, 179, 253, 184, 206, 11, 6, 243, 153, 61, 221, 121, 60, 97, 146, 51, 97, 49, 138, 13, 1, 33, 206, 91, 50, 243, 165, 129, 124, 216, 61, 187, 173, 11, 41, 250, 121, 249, 9, 121, 14, 223, 132, 10, 93, 173, 0, 183, 8, 149, 98, 63, 187, 139, 251, 156, 112, 190, 28, 36, 155, 120, 116, 22, 13, 186, 116, 38, 34, 6, 66, 36, 94, 39, 242, 249, 46, 143, 237, 222, 221, 184, 84, 5, 160, 10, 227, 210, 253, 76, 249, 72, 16, 253, 197, 48, 193, 206, 137, 19, 64, 119, 210, 126, 137, 51, 9, 32, 13, 252, 215, 244, 122, 205, 77, 21, 44, 111, 160, 137, 209, 59, 122, 131, 229, 250, 41, 3, 115, 246, 38, 194, 190, 171, 218, 110, 3, 249, 114, 6, 216, 46, 67, 96, 65, 247, 242, 234, 96, 92, 88, 233, 185, 194, 80, 185, 123, 13, 39, 192, 102, 239, 118, 72, 43, 127, 246, 178, 50, 93, 212, 208, 254, 26, 75, 146, 241, 162, 202, 66, 248, 207, 32, 10, 248, 30, 18, 108, 202, 52, 99, 185, 72, 120, 85, 196, 208, 139, 130, 162, 194, 44, 180, 237, 122, 243, 131, 116, 34, 71, 192, 141, 44, 180, 214, 237, 218, 118, 151, 60, 87, 141, 106, 62, 111, 25, 253, 252, 235, 227, 33, 237, 211, 78, 91, 124, 11, 111, 99, 117, 236, 34, 234, 6, 31, 143, 199, 158, 53, 125, 20, 28, 68, 83, 143, 100, 166, 77, 118, 51, 106, 18, 20, 131, 131, 37, 117, 22, 189, 95, 94, 18, 178, 30, 74, 30, 78, 117, 238, 106, 135, 208, 160, 78, 132, 137, 28, 119, 149, 79, 53, 62, 196, 207, 193, 184, 150, 189, 183, 89, 109, 5, 142, 104, 83, 43, 10, 111, 70, 76, 114, 43, 93, 42, 79, 136, 218, 193, 223, 127, 32, 185, 112, 178, 240, 92, 0, 114, 114, 146, 174, 176, 38, 15, 36, 111, 72, 187, 131, 5, 101, 4, 23, 36, 112, 71, 254, 84, 204, 193, 68, 242, 142, 235, 30, 237, 148, 237, 249, 78, 0, 218, 222, 36, 30, 198, 29, 91, 7, 109, 35, 194, 166, 0, 214, 223, 255, 72, 22, 194, 248, 103, 148, 196, 115, 25, 168, 164, 186, 22, 75, 78, 143, 157, 186, 101, 105, 202, 175, 75, 213, 235, 189, 56, 81, 229, 135, 99, 151, 244, 142, 61, 64, 232, 170, 203, 23, 22, 251, 232, 170, 21, 85, 76, 195, 112, 23, 21, 248, 248, 105, 113, 34, 201, 112, 28, 56, 203, 215, 70, 244, 66, 24, 20, 100, 2, 53, 62, 234, 18, 54, 177, 214, 186, 233, 27, 112, 93, 71, 53, 250, 92, 82, 171, 3, 183, 246, 36, 55, 110, 171, 203, 220, 108, 167, 25, 5, 227, 161, 125, 208, 147, 56, 229, 246, 59, 188, 28, 59, 128, 198, 182, 191, 16, 184, 99, 145, 50, 197, 131, 129, 147, 30, 75, 181, 55, 68, 150, 82, 211, 237, 217, 88, 219, 105, 232, 72, 61, 92, 232, 40, 45, 175, 214, 178, 54, 221, 102, 36, 110, 255, 110, 53, 159, 207, 1, 202, 88, 110, 201, 184, 246, 68, 224, 140, 217, 8, 112, 123, 143, 143, 214, 182, 227, 50, 5, 250, 253, 68, 70, 237, 141, 26, 169, 116, 25, 223, 143, 2, 189, 127, 178, 191, 109, 108, 195, 23, 144, 42, 46, 187, 100, 24, 57, 205, 25, 81, 61, 207, 200, 59, 56, 138, 123, 104, 116, 157, 131, 7, 164, 128, 240, 60, 253, 227, 53, 151, 12, 152, 58, 129, 252, 128, 166, 64, 117, 65, 17, 235, 136, 96, 185, 42, 32, 196, 141, 13, 194, 172, 250, 146, 148, 180, 149, 24, 138, 155, 69, 9, 141, 42, 2, 87, 126, 238, 23, 166, 176, 23, 55, 210, 39, 176, 232, 234, 230, 110, 180, 105, 45, 243, 68, 64, 105, 228, 127, 131, 205, 200, 158, 11, 110, 32, 146, 94, 98, 97, 130, 69, 171, 118, 111, 36, 184, 146, 66, 204, 239, 78, 15, 82, 223, 160, 22, 42, 12, 227, 60, 217, 229, 109, 223, 0, 245, 187, 41, 55, 213, 211, 240, 209, 73, 33, 174, 90, 204, 11, 184, 197, 170, 36, 189, 253, 38, 254, 0, 253, 44, 92, 167, 1, 245, 196, 135, 11, 220, 111, 7, 160, 145, 87, 192, 97, 183, 195, 162, 179, 227, 112, 41, 5, 178, 184, 122, 70, 137, 124, 21, 129, 161, 48, 237, 194, 221, 130, 110, 248, 17, 199, 144, 78, 139, 32, 72, 109, 25, 22, 104, 253, 58, 12, 46, 176, 6, 154, 28, 75, 241, 195, 35, 217, 5, 31, 109, 50, 98, 67, 190, 129, 212, 186, 127, 207, 113, 209, 136, 149, 85, 141, 146, 95, 167, 63, 224, 223, 75, 85, 81, 165, 67, 184, 244, 165, 81, 243, 147, 120, 110, 225, 55, 75, 90, 214, 249, 157, 176, 94, 11, 53, 226, 234, 178, 68, 4, 60, 153, 133, 115, 98, 48, 235, 239, 198, 120, 48, 103, 3, 17, 20, 48, 153, 54, 5, 172, 212, 167, 104, 18, 183, 230, 230, 143, 221, 193, 48, 141, 192, 75, 82, 255, 171, 153, 104, 87, 225, 159, 155, 176, 84, 132, 51, 174, 70, 158, 115, 90, 58, 168, 28, 105, 242, 128, 155, 63, 52, 125, 134, 104, 90, 6, 68, 167, 23, 73, 208, 224, 149, 15, 212, 136, 91, 108, 51, 205, 250, 2, 213, 33, 96, 178, 188, 173, 73, 145, 36, 75, 156, 68, 111, 201, 245, 209, 204, 207, 167, 134, 4, 240, 79, 125, 179, 30, 39, 44, 202, 131, 78, 201, 207, 243, 233, 149, 32, 163, 233, 193, 101, 69, 98, 101, 193, 204, 218, 9, 218, 197, 49, 124, 239, 147, 176, 227, 92, 208, 189, 213, 175, 71, 251, 77, 63, 74, 233, 1, 131, 70, 36, 133, 132, 190, 203, 127, 199, 52, 30, 220, 88, 159, 127, 61, 161, 178, 75, 175, 124, 4, 124, 120, 237, 131, 113, 4, 12, 181, 219, 118, 88, 70, 152, 235, 232, 157, 56, 201, 61, 80, 198, 54, 218, 154, 156, 105, 159, 80, 5, 86, 97, 124, 192, 110, 108, 84, 192, 29, 137, 67, 38, 191, 0, 171, 89, 45, 105, 28, 118, 164, 128, 153, 114, 255, 222, 81, 12, 77, 176, 39, 60, 179, 14, 177, 83, 86, 240, 24, 107, 129, 44, 37, 32, 28, 192, 62, 182, 228, 235, 102, 142, 134, 20, 79, 128, 54, 46, 99, 174, 1, 42, 116, 89, 209, 211, 104, 90, 231, 27, 2, 215, 101, 186, 175, 252, 82, 118, 120, 107, 129, 116, 214, 167, 170, 184, 238, 142, 22, 3, 174, 245, 161, 89, 10, 203, 110, 117, 222, 165, 139, 145, 160, 148, 95, 150, 236, 107, 61, 188, 219, 100, 137, 4, 178, 166, 134, 137, 225, 167, 187, 105, 203, 144, 197, 73, 104, 151, 36, 106, 83, 234, 49, 125, 157, 13, 38, 92, 15, 23, 33, 0, 15, 132, 232, 49, 147, 255, 199, 93, 86, 69, 87, 1, 175, 180, 166, 39, 40, 137, 251, 88, 228, 28, 207, 119, 45, 65, 190, 136, 18, 23, 53, 179, 91, 174, 247, 7, 80, 3, 76, 93, 251, 244, 245, 101, 161, 95, 19, 228, 161, 53, 152, 252, 251, 58, 214, 87, 9, 152, 153, 184, 223, 194, 155, 144, 55, 82, 166, 167, 12, 137, 245, 221, 51, 183, 102, 195, 94, 15, 124, 102]; + use hex_literal::hex; + + pub const ENC_32: &[u8; 32] = &hex!("c6ddb328c7e0eb6ce7204daa79b0ae25f632272b8d4c5726c2cbe64cf890cbfa"); + pub const ENC_128: &[u8; 128] = &hex!("c1c19d4a28434a8b65272ecf74c4eb0ad8a5106639d54cf417f7423bfecde55e83fef26659ff12f3bd9f19196d6e5f84a4f8a95a3bf3dee61886e25be1ead60864d8722c04288521b153d1bae477a49e000932c83e336830d41d86fb825bfc63e983e54e007532f1c4cd40c7cf346d0f736e03fd20fc65eaabce46f2fe29d550"); + pub const ENC_4096: &[u8; 4096] = &hex!("7ab9bc64153fc2d93d09223d9db09f92522cd1904ef4d798855f200245a18e7428e62be563c9f8c1043078b222388c3cf7deb12297867b2c4e3e751f5ca1107f1d317a85bb6fd6891c2ffb5b1d68b431e50010b7aeb26a39a417fe4c583c68f1a0133610f9f3d440d3be50756504b97bc0af8c01d3c751792d6a549ac4b4cd3b250a3fdb94e512dd8825c21f99b274a39118ae60b200a0ad8f536d268b2c83eaf8c7da21ee430d1335ef0932960bb28954edda29dd8f0be40b5e77c714fb941abb9190fd3bc020b52b2411cc67487071081f34bec7177b944cf47587325e116850a175dcc713a0f01738d2a625e8aad3b0b656d264e40677e6f390b9da8b458db018cda521b4d1c760652fc052f9a8645e144d9407fd3b2cae5f64a8f66261bb344d0dd1a577133a06aec6d0db9b5df3327f4e2a62bf84474c100cb0d4fe33f7f94e970692c3fefdc7f1f0b1ad1c50b729337a2c2dd41f40fde080f60a87c77aae77aab7014b2fb557817998a55913be1b80d8d8c493a0f0367d00732248ab19fc8f159577691624a4280be729d91dc7daf05a6b1a20cbcb3d7c30eb38fdb6b823f2a3a95f907834390608f7fbd4fe399ef03f8121e8a716594fac89752c6878621db5efe829e43a2b882dee0543457deba13380bd4df193d39d88aceb6193f82138a55b036533230db718801da6d9a87b9007f2721f46e6e105a0ec111fb3224109b3ca5c3f29da35b93b28d6911aaafe55e16c7f208ee5a8333a726b40b568d2b4ea4125d7445e6178721988904a8c814d63e5c743eaace60a242f836c3464681c41a370b8453b909031b3caeb241d9641b89a1d170887463c74d19d74b8f6126d1851caf7cba457e571bc29a22944f696377cd30d8400417941aa012a9323c5da8efd7d1ed5074ae5564424f55d50491b61aa7ecd913ffd3523168da2b18f2a2d5a1e5349dbc85edfd9fefec0af4ad90a502eb24c04d3b363b1a2310fb6b4dd3a2a0f78b6e92cccd2526b67604eaffda6a1f7a773069243e04ad3c2132d90f0b69ddab778386479154031739b7b08ccad3ff6c2c9b6f6f11f00edd750ba5a6fbbddec5899fd2cbb5b2963f23fc90d956621dd2a1756803ff6eb6ab9380b009420623e73519b4743baae3d1e8d5ebe622ed3c4ce145445892a75e46691a2cbdfcdbbc23538e9c8863ae410cd7b3e7e00f5266cb0c1c1bcb760008337b89b324fb9749125bd691a3c8f6b79a97899b9592da770d597a91979dc04b6c8fd696b1b2b204c9906edf3efbe2c99d2b8d2f14968f1967631bfb590b753522fe5040ec563a45ff56f05032c216e3346a5b2bc4a753ddf6737bc347432036f36607012828d7881e1314c65b51d4866694afb003bbdd3a29f99be92d186b8b974e5a12e294e9c77960c381cffde5843ca2eb839659ef509c4b56e23126ca958bf02efb0feead97eabfcd4862265a20bb2458181856e1bd9a112f205ffc0ca8faea7a0a819eb0dc43038565db8fa932d849db50e1b76f966c6e45c2ee921f370c02b089195fe1103c50198ab5247e256ccbab0969397449e4b53b41e28ee73dee7be4fb02a5863b6f589c69b5f52ab4a8f1d9620059b8b833f35251049ae8a49efc3c163b7149396cfd2a276f2b365aa110de50fcda299fbb9364c7ee21846097aa6bf5bf7fbda7ae83adfa2804871f100179157573ed5ff81b0e49449b0eaee6486399a7cbdeb40ec41cb2b2e6ef249d003cca022c98056ad34e235ff307e3eb213c7319824d923fb3721ed38689ab6d464da99c6dae31aec3fa3f3df03fb668aca2993f25a1e4a12430c85196e4de55b469faf80961378e4e385181cfbc6581fbcd745b9b4bf1c734d831afff53b9e304acd4a6e61bbb48a44ffa7a5ece73ebe64415e59c27cef3b6718b768d0236af06cc3b38e116ad8f91fbd71a2a61f4e0cd622251138dc385984232ca19eca41af07db5fc1f87eafb8d60c853fbdd32b8d32cf574db31c2c46b4566b1646ee1f79c6a352e2bcfdb2f04189ca857773ad6f1b2f62652f3f367fad2cdf75f360af06056370d609b587beed6d5e8e59cd77fa54ee96203a65d9d1d96a056df2834c314569a165c08cefc7e047106f3fd11e5025be9ccb2aad4958e59ce534a3e0f1f772b4b5d873414dfa07e05e3b665fcb93cd52210c1d80a47320ecf1be0cb2cc0e739139747e8d8464d01b50ddb792c68b658a2972cf3070dc2167fb6b11969e52cea707f7454cdacd5b05467d598a2d8e4dc6532e9cc399cc70292ef63fc2749230c832b5d3695ba5584489d166fdd295b8602151eb94009c6b41e0640e44d776614c0876d8df580c49abaa71e8881b5b7de5ca6acba334f419ef4232e948109dee19e4e3a3fbb6c3bf9cfc02d11f5acdaf2ebc68b528df7c71a07bd60a68b20b027369d0696d5a02b09bbb3db7bee0b00ed11486cedb51680f792dec2483fb95d607920b15c17769706050782c30fe9dbaee0ad7ccf2cc467eab008d46d6ec9525d98a238fd1a4390add976953d4c4bb4e0c5a08779f38e5bdab2f937a72ad864ff6bee9655dfa59d5ac3e90e0e3bee7fcabb6dbb95d510e11df1c48a8ba9b00af841e7487d3840e4b517559dd63dc91c2a947adc87090f77b4ca40acc884c54d3451349ce946db298b2ab1d76448dcbf7fbddfd6437d780be294179f327bdc64f7f1a4274b1e1d986e92a0f1495c3fed33967dd5626c03f34e47bf280f3ce4c880b7845d2894922e0490e75f3704735d1f4e4f7e495883e7c2ac7cc00659fc1d543a923d913c23d69514f20c0b7fc42d02ee0ca4d133f360e145ecd644f3d1e38702b0d52ee4a0e23ca7f162168bd26c3231d0ed09611e9028253fb6fa9c1ce5024b936926d9295c55c245373489d318e8d3b7bdae1903a52c22b798e69851e224cea1e16463c862036c7e2dcf767894caee2713f5f0864dead7c701c92e9f7cde906ff30ff222dfaad894a6be69d438c5a6db13b726a1b7bd56d2163be4b53383f9079194d209a585a36cc7d6513e3f6de7219ca24898db46ffbbb7b03368cb352c50ca47eddac3e90915c24e0cc70220d8f964d3fa6bad83bea976bc125b77490db1a61e4f29f6c656febd24c39ceccedc4d371332c8222597eb0725f75c610bc804bee63a67890c3fa3571e066d75958247a91af2e48fa5337639d317880af53d951583025c170d09bca0721096b95007507ba0f3203c589f6eb813be2b3ec300643c0bd51c1d048a1eabe3784d68e5a6f9db5b623354e1f7ae69604f4d9003330c09c860763169a9c3339d173434c879fcd07343b7c31460cdca5a223e41f12b6a7caa145131610260130f54446a350afcacd0cb441f2d4c42ec1928f53f19ed3337ac3c18949519fb11debd7779a7c76467fab34d929297bbe61f7686f8670a7f0f88fcb88296d251356c5d8f4f3f5a07c4c9530e04b43f0fda14c10d508574a3bf3ccf1baed4f0b6996b972fe44dd437977a472d62ca68aa98ddd69feea9a25e379e2de63014bb230b70d88785cef3906bd263634a161233ca220e0d7af4336e5fe414aadcb0a366083584f47e442911228d794f7b03362fe0e07b42ab08e7d1f2f3965e2ef1854c6689f8935d6d09188f9fb720bc2effb6e3aa316807c57b76e51629b926590fd9d317715b05c60df51f667a7dcfca6493187cb50ab1a5fffc175b133a14f91ff2320a7f7683485367dd897030bb8278f442ab79470a65b4e5adaee72175702fb0fb5c1e70faa937301a1ee0955961b9d843b14887f3bb6f5bf9ae809ccdc5f61b9e0aa4bdae7612d461964625ddf2b314b909becf3b4dc81467aed657c65ccaf961c2bee176f20fcf44385c030bebd8ffaed3bf6ce14fd3aa9beb549da955147fbe37e191f975961bf234c583ad2b0ccd9f81b2b1fd00fd5fa1d51e7e497ac1a469393bbc58b82af2f9beec41fd4d2f498dcae448f1f6f402d7c85b1f46bef33622da4fc2c72109f564a1393beabb52cb9bb18e7ece3d00a982fa2dbe41c3b1c3204dc1e1e2dc880824cdeea858f996f06a0c6f3b6a33fff4a44db2707a3ff4b0ee63bde964f0f1d869c37d1cf6fec3399a187f1272e6cf4a214dc34cc914d58fb9ac38b60356d4c73807650c34a23ea763c7018f7c0b22782f7fd842c475bb385257229a03bff09bd7a1c69b70a6fd5ef4460ddd43dbd63b6dfcac00591dafd7657ba0cfbefc193bb4361bfd2a847173c54feb7f25f93678e27167b7beb84eaa8e70da714ab83ea75f018e43c649e3efa2c867597becdb73352cae6e10f6cfe3c621ede7d2cedac145479ccf5f0176ddf221701f1ec51dc40772df0991d3c2f89c28669bca9736f00cb39015f74987b09599b1cf0963d587ba1bea9f68ca3ddab3ee03d0cc1e5dd13b1d1cb01641d610c88212500ce76ba313ac360952f56de1c4053dbe9a1b9d7258c4063d12363daf547f920a259d1e8177e46ed8d98f940977ad6f8cf1373f4f27718f8de815e3cc35078f393f968844fb677f2c16ad824d9f15dc0ef91de5a161cf7b686cc919512e9653236145b00167adcf60f25ff2e04ba6d5f2e59c2bf3dbd27b248ea0d82558b852caf900bf638a0a1703247a39538755e2daabf76d0ac47415eb7707b8400e2990d1542497233f989630613f106d7a722098bdf51ac2775a09c5789d16db42f8a7203969ab1551dfa3738215e4df23812716305ac40f69c236664bdcc6f19e028bae4d68a2c7d587b5a4f8b555568d77c61bbf794924ce18ec34c08f46fa17363350bf48a9880d934f5628436f7ef779750a7f54600a31515145155eb4e19338554bfd6256f53526ddf8f07e6d1a5c20d3a55fa603bd6e4781e54653270b8f377b75ce6260ff5153b0f20b7197972a4a320d3787e3d795353782c4c299bfd2dcbced2e5dd1b98ca72f87671e9a06689eba9ab58a13bb2fb856a579a654f74377d868c14c4d32c436759da19167e227c85017a8ba3734fcc7467e59597ee65b344e446abf9e2e6321da203829c40d4ed6da5de56b7b374125ffb07f45820b9d378c434c218455df145520bf51ec2dc3adde3d69cbb5e25b42a400b833d564bbaebd728500fc68aa6d7a84a727c258386c40d2dd0284643b8090a819cb0de4c5f8f702d1db64082cdb2c2c892c584667d90f4af35a22ebc34d811c55e7c61a1e05f47bd672d33049e0bc7500920897cd6f9928e9a54676541ca5d4620f4f7c7aed444b84d1977d36ef97e0e5dc556da4900e2998d3a924cd183ab901860df078c047492b7c284e49d95058d87c9434385b49f8032d47acd69b9168b9c45c228e6af7c7b79b86af67fd03f9b1ca279ae2e94056f7399f4f437733d70bc3b6d8317d1b0397341a204010b2396fc76b786d2bb2e19985039f020b9aa12206aefb1943fae16a485d6f9854e6792be2f9d1bc901d98b59edf9b80f7b8a682f8e0e93e87929d7285ec8442f1d3e5b6158efb338d4b330195238e645d3276496241cec27056a205b59d4f1edc2d505ab69b506d49634e637e4634707f66500dc576895ed12118c6cd22ecac150aae81ae827b06cde0913b4d79c306848736ffb0f85d60f4f8acfeec16e7c17af748b93dc6eff08a77672ddc21fddcd729cd84eb416c7003f15a30ab0b756a03cc0674f9c7818eb1c197d81af566751473a3f2780356039057a834a35aed5fbe1a0ad483600721184aa4b26abd1a98413387c28b13cee1bb141d957221e9ff428b1ef262038b24bee5636760af8a1a1e2a3cc3bcbf44861abecf45f36f4a4d02fe84314016752fd7335fbd8f6d0"); + + pub const DEC_32: &str = "17fcf46621eb6d2aefa3edb5cfe90e2f"; + pub const DEC_128: &str = "fa5943385153d8d7383f5514d5af03a811ef6c50e143362f42604e6cee015694fef5b57457c48e2120b706960f1aa8ca8b2b689367e383060403f2c75322bf92"; + pub const DEC_4096: &str = "50fe36085e0358265f268b8a346dcf1ad21af411014847ee7acdbb514d481547ced9588d7340340f53ed238e81ed95d7222f31b5240716714ed14ad242a339ba384ac55abe04a2a7fe29dad466d6295abe8a2721ae631daaf8c252d3018583087b0dc04b751e8674cb3327ded952dbe4de5efda1a024612ad39d5c2cbb42c4dbc14a60253d198574348f2c9cd86fbb85dfd47f2a065645d0e5fb50465573676aa51b4c9f3fefbee1c26914692423529ffcd12cb005c9cf11e2d4d8531a80643cc9a7f750af11e382c3b91a20ff6fa115d90fd2fb6f9c02e1589abb6f58d128b58f46292879dd9d3464d1bc54f3fff4a51662f8dca64fc6c93f5e7c6093a4a4bbf7e6b663ee4b8dce74bcde64071372b6464e485f5b84d078b64ba01735b00fe3ea777494c95d04934b9cef30c08c5f1b4d22df4fd4395089c8056dc0cec9600d4647a6aa738065d2466e23a616e5d0dae28ea8635ebf992a6dda3452a11ba96744737a1f1f663f4c3fcca70206fd461a005da15702b69520af0e7a0f2e259b6ac7165fd31eeb18750c8fce982bbb2bd80adaffdea327cc59c2557f9ebb0c833bfffc5d0fec32b927f42d859d338c83451667d7c090c5bd40cf60ccf11c2ecde16ae7e64755826a8dfa9ca074e1e4951357cc2c881736a37ff2b429cea6601e85e5129dbd1a889e68fac59293ac3a200f455f78f3323577750c7dfee9b5de34401ec67bb0274caf72e192fc6bbd8802d5737d2f9d80b8c9a0b1f284ffcc3e0806dcd4bf2943f2e60e15afe12247f2952d46e40e3597f3bd252696c906e29ddbcefe14893bb6959e5a7e7b0e74c53cfd1480d0201a99f44b55c561434216dfb4e1541850258d102f71ee768e57a49f55a6de94df9dd3f712a17daa61b5cc2bb8daf50968168ff374b9923f9d668046a974b0d21b316e217256c744e1b5fdb245a885d7d1eddd4c892fca11d48cf2353d3ca6111faa52eefea861c4be4e348ed33a3694f8039a27679e2d2d279e79ec8d755b5543768c96325883f12ecedf32e078fb1ea016ffdf92fec58d41a81d458f8eee0848f11b0ab94cf61a220c8916b5ecbd23e8a2a8f8ebe5218ec7d66a0a9ec9bab6b00cc86f3930fab52e54454f97df355870592c3ae074281e0b81ec103aea2b879aa4f61ab606c8fe5f21c841b1d3eb67b72f7589023c537a9027c12f50f83d827f45693338ad233347cf2f6fb90180fadf0f718186615cdefe044a777bf454c9f025bf26726acdab1fadc6112ca9f10db89381bb0c75d38e5960897cf2e71093fb5d86341362fdbb51c2f9608c067118983d3064266b65593142b0f545e47f441658fac423d1d9474713f581f1e6f033a3c8ce4dbdc5d25d5435117d8ede16073c068aa1bd019bcec8b1952750fcdeaf797a07932025704a5f42a796ad6e578b5dbf1ad1e6be02bd6a3683c077e27cdb2da4e5ed3caefbd08b1539d96a4ae77246e134300becdfc9a7c970a9aafa585a2e1a934fec89e2b17620b23aa581ef9b7096bfde51e227db23b97541333f219e634fe869705236cba9db31038ddaa5a632fd43f4457f620f4eb8c2d24dfa694515dd287105465ba9fc0e09d51730cc5c7c55dc3863673ebf0dd8b4b90e9d5b60b5ea9513b1f9f6383f128a6b5dc84e548cffe981e878c28e9501bcf653ab0b114728307e1e9ae50a7b0e91df1140da66adb31283bb91b211b9fcbd42bd34d211e2fdb897320fa0a5c6b15937562387fca383d7da966e8f94117e0c1eff6f5e51702b3ea2913f2029d0190407807a5b23bd0b3da1c2c64a4df740b58ada9d394d08a51455ead6f826a3bffe9250c2df2ce659d02844d6e521ff5d754550a7f704ce6995a0a96aad536b7e0e43568d441406d2e2b9feeece6182be111a12d7b64247b09a8837af4695bcb7cec85606f3c400ce2c6dc1d9e6429c0ca9ed8d40886da060ecea75a83efff2794ac01565778ab4cf076915f597524522f3c45f6ea0db4c83f364fd44062b52a51ac70743bd071dbdec3a63482951d07ffcb5ef8b83aacbfe5cbda2f7f241bcf0acc0804a3d5e9e65836e2bf1986ae13dbb361954ec0a36733ee659136767b779451df5684e90adff55440960b9a6602df4c6084e011c976c25d33cccab6763f230e1df8e5b0c41c6a1dbadca5f88785c931f8d9a1283f2690f6dfef5d20fcca2edd3c599d1f64cdbe815bc7e12ae700db9c928ad401b6aeb2a2ddccd1e921513e2950cd35a220ff64d201e9b52416c2a4b6881e8563cdb94dbf132786303d6d1f0a9f04d4e56c12201e45f6371f94431c7bb3111ece2154834b5640270eefb688f3751c4b98564fd71ba3c07806afe6dfe6e64e1c26cc7c1a8b437a829ac690a6f13603d622e6f3241e5592852ba7b1b544a3429d972e1470e449f1e7337cf3a672991b1c59b804164f2de4074608e69f53e6c6db01715e5f642c93c253a8545e8b70946443e60a934a2867d9ffc6ef0885a7c4756368f0dff8184e12c87a369a0d03e341e69ceac9555585df7b3a402ac06ed934678b0d882f1bb210feeaa6641503a9f76db8e25dcccc732161a010453ede57890bc1ef45b182c1423bdb18a186cb630d8c620d570a6638fd9c21764c2f0a1b5c2778cbd7d66e4f86c3b858659dbd67ec74d5ceaf9c4054cf21c419093647fb6636000d5ea0aa55d99a96f7d633a240db356c68fdbbeca90fc83f80d187e60f577c96d71c1eb951fed1e7f656927252e864cc2e736b711d033cd41ed8fb308a88564c9b7b34cc9d187a9a9e865573fb771a77df554037ca376bcce948b63aa1d38ab076bc0bf582ce8a42218d1fb3389f6d803b6c0623fce8a91f86146a6eb62023f21f22f4615d8f9daf7de826258122d84d92504973fbde421d0ca41fbc488"; }