1use std::io::SeekFrom;
4
5use smb_dtyp::binrw_util::prelude::*;
6
7use super::negotiate::CompressionAlgorithm;
8use binrw::io::TakeSeekExt;
9use binrw::prelude::*;
10
11#[binrw::binrw]
12#[derive(Debug, PartialEq, Eq)]
13#[brw(little)]
14pub enum CompressedMessage {
15 Unchained(CompressedUnchainedMessage),
16 Chained(CompressedChainedMessage),
17}
18
19impl CompressedMessage {
20 pub fn total_size(&self) -> usize {
21 match self {
22 CompressedMessage::Unchained(m) => {
23 m.data.len() + CompressedUnchainedMessage::STRUCT_SIZE
24 }
25 CompressedMessage::Chained(m) => {
26 m.items.iter().map(|i| i.payload_data.len()).sum::<usize>()
27 + m.items.len() * 4
28 + CompressedChainedMessage::STRUCT_SIZE
29 }
30 }
31 }
32}
33
34#[binrw::binrw]
35#[derive(Debug, PartialEq, Eq)]
36#[brw(magic(b"\xfcSMB"), little)]
37pub struct CompressedUnchainedMessage {
38 pub original_size: u32,
39 #[brw(assert(!matches!(compression_algorithm, CompressionAlgorithm::None)))]
41 pub compression_algorithm: CompressionAlgorithm,
42 #[br(assert(flags == 0))]
43 #[bw(calc = 0)]
44 flags: u16,
45 #[bw(calc = 0)]
46 offset: u32,
47 #[br(seek_before = SeekFrom::Current(offset as i64))]
48 #[br(parse_with = binrw::helpers::until_eof)]
49 pub data: Vec<u8>,
50}
51
52impl CompressedUnchainedMessage {
53 const MAGIC_SIZE: usize = 4;
54 pub const STRUCT_SIZE: usize = Self::MAGIC_SIZE
55 + std::mem::size_of::<u32>() * 2
56 + std::mem::size_of::<CompressionAlgorithm>()
57 + std::mem::size_of::<u16>();
58}
59
60#[binrw::binrw]
61#[derive(Debug, PartialEq, Eq)]
62#[brw(magic(b"\xfcSMB"), little)]
63pub struct CompressedChainedMessage {
64 pub original_size: u32,
65 #[br(parse_with = binrw::helpers::until_eof)]
66 pub items: Vec<CompressedChainedItem>,
67}
68
69impl CompressedChainedMessage {
70 pub const STRUCT_SIZE: usize = std::mem::size_of::<u32>() + 4;
71}
72
73#[binrw::binrw]
74#[derive(Debug, PartialEq, Eq)]
75pub struct CompressedChainedItem {
76 pub compression_algorithm: CompressionAlgorithm,
77 pub flags: u16,
78 #[bw(calc = PosMarker::default())]
79 length: PosMarker<u32>,
80 #[brw(if(compression_algorithm.original_size_required()))]
82 #[bw(assert(original_size.is_none() ^ compression_algorithm.original_size_required()))]
83 pub original_size: Option<u32>,
84 #[br(map_stream = |s| s.take_seek(length.value as u64 - (if compression_algorithm.original_size_required() {4} else {0})), parse_with = binrw::helpers::until_eof)]
86 #[bw(write_with = PosMarker::write_size, args(&length))]
87 pub payload_data: Vec<u8>,
88}
89
90#[binrw::binrw]
91#[derive(Debug, PartialEq, Eq)]
92pub struct CompressedData {
93 #[br(parse_with = binrw::helpers::until_eof)]
94 data: Vec<u8>,
95}
96
97#[cfg(test)]
98mod tests {
99 use std::io::Cursor;
100
101 use super::*;
102
103 #[test]
104 pub fn test_comp_chained_simple() {
105 let data_bytes = [
109 0xfcu8, 0x53, 0x4d, 0x42, 0x70, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x68, 0x0, 0x0, 0x0,
110 0xfe, 0x53, 0x4d, 0x42, 0x40, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x1, 0x0,
111 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
112 0xfe, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x28, 0x0, 0x30, 0x0, 0x0, 0x0,
113 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0x0,
114 0x1, 0xf, 0x2a, 0x2, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x8, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0,
115 0x0, 0x3, 0x0, 0x0, 0x0, 0xee, 0x5, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0,
116 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x75, 0xb9, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
117 0x15, 0x24, 0x4d, 0x70, 0x45, 0x61, 0x5f, 0x44, 0x32, 0x36, 0x32, 0x41, 0x43, 0x36,
118 0x32, 0x34, 0x34, 0x35, 0x31, 0x32, 0x39, 0x35, 0x4, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0,
119 0x0, 0x0, 0x0, 0x0, 0xee, 0x0, 0x0, 0x0,
120 ];
121
122 let mut cursor = Cursor::new(data_bytes);
123
124 assert_eq!(
125 CompressedMessage::read_le(&mut cursor).unwrap(),
126 CompressedMessage::Chained(CompressedChainedMessage {
127 original_size: 368,
128 items: vec![
129 CompressedChainedItem {
130 compression_algorithm: CompressionAlgorithm::None,
131 flags: 1,
132 original_size: None,
133 payload_data: vec![
134 0xfe, 0x53, 0x4d, 0x42, 0x40, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10,
135 0x0, 0x1, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x91, 0x0, 0x0,
136 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
137 0x7d, 0x0, 0x0, 0x28, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
138 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0x0, 0x1,
139 0xf, 0x2a, 0x2, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x8, 0x1, 0x0, 0x0, 0x0,
140 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0xee, 0x5, 0x0, 0x0, 0xc, 0x0, 0x0,
141 0x0, 0x8d, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0
142 ],
143 },
144 CompressedChainedItem {
145 compression_algorithm: CompressionAlgorithm::None,
146 flags: 0xb975,
147 original_size: None,
148 payload_data: vec![
149 0x0, 0x0, 0x0, 0x0, 0x15, 0x24, 0x4d, 0x70, 0x45, 0x61, 0x5f, 0x44,
150 0x32, 0x36, 0x32, 0x41, 0x43, 0x36, 0x32, 0x34, 0x34, 0x35, 0x31, 0x32,
151 0x39, 0x35
152 ],
153 },
154 CompressedChainedItem {
155 compression_algorithm: CompressionAlgorithm::PatternV1,
156 flags: 0,
157 original_size: None,
158 payload_data: vec![0x0, 0x0, 0x0, 0x0, 0xee, 0x0, 0x0, 0x0]
159 }
160 ]
161 })
162 );
163 }
164
165 #[test]
166 pub fn test_comp_chained_with_orig_size() {
167 let data = vec![
169 0xfc, 0x53, 0x4d, 0x42, 0x50, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x50, 0x0, 0x0, 0x0,
170 0xfe, 0x53, 0x4d, 0x42, 0x40, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x1, 0x0,
171 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
172 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x25,
173 0x16, 0x98, 0xbc, 0x89, 0x8e, 0x3e, 0x86, 0xae, 0xb7, 0x13, 0x55, 0x7c, 0xfa, 0xf1,
174 0xbb, 0x11, 0x0, 0x50, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
175 0x0, 0x5, 0x0, 0x0, 0x0, 0xf7, 0x4, 0x0, 0x0, 0xc8, 0x7, 0x0, 0x0, 0xf2, 0x3, 0x4d,
176 0x5a, 0x90, 0x0, 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0xb8,
177 0x0, 0x1, 0x0, 0x12, 0x40, 0x7, 0x0, 0xf, 0x2, 0x0, 0xa, 0xf3, 0x2e, 0x20, 0x1, 0x0,
178 0x0, 0xe, 0x1f, 0xba, 0xe, 0x0, 0xb4, 0x9, 0xcd, 0x21, 0xb8, 0x1, 0x4c, 0xcd, 0x21,
179 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x63,
180 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x69,
181 0x6e, 0x20, 0x44, 0x4f, 0x53, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x2e, 0xd, 0xd, 0xa, 0x24,
182 0x5a, 0x0, 0x84, 0xa9, 0x8e, 0xee, 0xb9, 0xed, 0xef, 0x80, 0xea, 0x4, 0x0, 0xd1, 0x99,
183 0x6e, 0x86, 0xeb, 0xdd, 0xef, 0x80, 0xea, 0x9f, 0x6e, 0x83, 0xeb, 0xe8, 0x10, 0x0,
184 0xb1, 0x81, 0xeb, 0xe1, 0xef, 0x80, 0xea, 0xbe, 0x90, 0x84, 0xeb, 0xec, 0x8, 0x0, 0x31,
185 0x83, 0xeb, 0xe3, 0x20, 0x0, 0x31, 0x81, 0xeb, 0xef, 0x38, 0x0, 0xb1, 0x81, 0xea, 0xad,
186 0xef, 0x80, 0xea, 0xe4, 0x97, 0x13, 0xea, 0xf0, 0x10, 0x0, 0x31, 0x80, 0xea, 0x7f,
187 0x38, 0x0, 0x40, 0x88, 0xeb, 0x5e, 0xe9, 0x40, 0x0, 0x31, 0x85, 0xeb, 0xf3, 0x10, 0x0,
188 0x31, 0x84, 0xeb, 0x90, 0x8, 0x0, 0x31, 0x83, 0xeb, 0xa9, 0x8, 0x0, 0x11, 0x80, 0x50,
189 0x0, 0x40, 0x99, 0x6e, 0x7f, 0xea, 0x58, 0x0, 0x31, 0x99, 0x6e, 0x82, 0x10, 0x0, 0x40,
190 0x52, 0x69, 0x63, 0x68, 0x44, 0x0, 0x3, 0x9f, 0x0, 0xd4, 0x0, 0x50, 0x45, 0x0, 0x0,
191 0x64, 0x86, 0x24, 0x0, 0xbb, 0xf4, 0xba, 0x23, 0x14, 0x0, 0xf1, 0xb, 0xf0, 0x0, 0x22,
192 0x0, 0xb, 0x2, 0xe, 0x26, 0x0, 0x90, 0xa6, 0x0, 0x0, 0xe0, 0x1d, 0x0, 0x0, 0xf0, 0x61,
193 0x0, 0x90, 0x2, 0xb1, 0x0, 0x0, 0x10, 0x22, 0x0, 0x20, 0x40, 0x1, 0x7, 0x0, 0x0, 0xc,
194 0x0, 0x56, 0x10, 0x0, 0x0, 0xa, 0x0, 0x4, 0x0, 0x1, 0x2, 0x0, 0x30, 0xf0, 0x44, 0x1,
195 0x28, 0x0, 0xb1, 0x26, 0xd1, 0xc2, 0x0, 0x1, 0x0, 0x60, 0x41, 0x0, 0x0, 0x8, 0x17, 0x0,
196 0x22, 0x0, 0x20, 0x7, 0x0, 0x1, 0x35, 0x0, 0x0, 0x2, 0x0, 0x0, 0x40, 0x0, 0x3, 0x2,
197 0x0, 0x1, 0xb, 0x0, 0xc1, 0x70, 0x14, 0x0, 0x8f, 0xb3, 0x1, 0x0, 0x28, 0x47, 0x14, 0x0,
198 0xb8, 0x61, 0x0, 0xf3, 0x14, 0x40, 0x1, 0x28, 0x8e, 0x3, 0x0, 0x0, 0x70, 0xd, 0x0,
199 0xb4, 0xcf, 0x6, 0x0, 0x0, 0x70, 0xc2, 0x0, 0xb8, 0x25, 0x0, 0x0, 0x0, 0x90, 0x43, 0x1,
200 0xdc, 0x5f, 0x0, 0x0, 0x10, 0x10, 0x4, 0x0, 0x70, 0x40, 0x0, 0xf, 0x2, 0x0, 0x1, 0x20,
201 0xa0, 0x5b, 0x42, 0x0, 0x7, 0x1a, 0x0, 0x57, 0x40, 0x14, 0x0, 0xf8, 0x6, 0x10, 0x0,
202 0xb, 0x2, 0x0, 0xb2, 0x2e, 0x72, 0x64, 0x61, 0x74, 0x61, 0x0, 0x0, 0x30, 0x5c, 0xd,
203 0x91, 0x0, 0x13, 0x60, 0x8, 0x0, 0x7, 0x2, 0x0, 0x62, 0x40, 0x0, 0x0, 0x48, 0x2e, 0x70,
204 0x28, 0x0, 0x2, 0x94, 0x0, 0x40, 0xd, 0x0, 0x0, 0xd0, 0x9c, 0x0, 0x17, 0xd, 0x26, 0x0,
205 0x3, 0x28, 0x0, 0x12, 0x69, 0x28, 0x0, 0x22, 0x24, 0x26, 0x7c, 0x0, 0x23, 0x0, 0x30,
206 0x8, 0x0, 0x7, 0x2, 0x0, 0x1, 0x50, 0x0, 0x12, 0x65, 0x28, 0x0, 0x0, 0xfc, 0x0, 0x63,
207 0x0, 0x70, 0x14, 0x0, 0x0, 0xc0, 0x8, 0x0, 0x7, 0x2, 0x0, 0xc1, 0x40, 0x0, 0x0, 0x40,
208 0x50, 0x52, 0x4f, 0x54, 0x44, 0x41, 0x54, 0x41, 0x1b, 0x1, 0x22, 0x30, 0x16, 0xa4, 0x0,
209 0x0, 0x8, 0x0, 0x7, 0x2, 0x0, 0x0, 0x50, 0x0, 0xa0, 0x47, 0x46, 0x49, 0x44, 0x53, 0x0,
210 0x0, 0x0, 0x2c, 0xa9, 0x70, 0x0, 0x43, 0x16, 0x0, 0x0, 0xb0, 0x8, 0x0, 0x7, 0x2, 0x0,
211 0x81, 0x40, 0x0, 0x0, 0x42, 0x50, 0x61, 0x64, 0x31, 0x13, 0x0, 0x61, 0x10, 0x9, 0x0,
212 0x0, 0xf0, 0x16, 0xb, 0x0, 0xc, 0x2, 0x0, 0xf2, 0x0, 0x80, 0x0, 0x0, 0x42, 0x2e, 0x74,
213 0x65, 0x78, 0x74, 0x0, 0x0, 0x0, 0xb, 0xa1, 0x4c, 0xc5, 0x1, 0x2d, 0xb0, 0x4c, 0x30,
214 0x0, 0x80, 0x20, 0x0, 0x0, 0x68, 0x50, 0x41, 0x47, 0x45, 0x40, 0x0, 0xf0, 0x0, 0x80,
215 0x42, 0x44, 0x0, 0x0, 0xb0, 0x6c, 0x0, 0x0, 0x50, 0x44, 0x0, 0x0, 0xa0, 0x63, 0x13,
216 0x0, 0x5, 0x2, 0x0, 0x40, 0x20, 0x0, 0x0, 0x60, 0x28, 0x0, 0xf5, 0x4, 0x4c, 0x4b, 0x0,
217 0x0, 0x1c, 0x64, 0x2, 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x70, 0x2, 0x0, 0x0, 0xf0, 0xa7,
218 0x24, 0x0, 0x0, 0x2, 0x0, 0x1, 0x28, 0x0, 0x80, 0x4f, 0x4f, 0x4c, 0x43, 0x4f, 0x44,
219 0x45, 0xbe, 0xf4, 0x1, 0x22, 0x70, 0xb3, 0x40, 0x1, 0x20, 0x60, 0xaa, 0x1f, 0x0, 0x5,
220 0x2, 0x0, 0x4, 0x78, 0x0, 0xe0, 0x4b, 0x44, 0x0, 0x0, 0xea, 0x5d, 0x0, 0x0, 0x0, 0xa0,
221 0xb3, 0x0, 0x0, 0x60, 0x24, 0x2, 0xd, 0x28, 0x0, 0x1, 0x78, 0x0, 0x60, 0x56, 0x52,
222 0x46, 0x59, 0x19, 0x15, 0xe, 0x4, 0x8f, 0xb4, 0x0, 0x0, 0x20, 0x3, 0x0, 0x0, 0xf0,
223 0x28, 0x0, 0x3, 0x50, 0x48, 0x44, 0x4c, 0x53, 0x76, 0xe, 0x3, 0x22, 0x20, 0xb7, 0x78,
224 0x0, 0x25, 0x10, 0xae, 0x74, 0x0, 0x0, 0x2, 0x0, 0x1, 0xa0, 0x0, 0x90, 0x41, 0x47,
225 0x45, 0x42, 0x47, 0x46, 0x58, 0x68, 0x69, 0x45, 0x3, 0x21, 0xb7, 0x0, 0x8d, 0x2, 0x1e,
226 0x40, 0x28, 0x0, 0xf1, 0x0, 0x54, 0x52, 0x41, 0x43, 0x45, 0x53, 0x55, 0x50, 0xa3, 0x19,
227 0x0, 0x0, 0x0, 0xc0, 0xb7, 0x3d, 0x0, 0x2d, 0x0, 0xb0, 0x28, 0x0, 0x1, 0x40, 0x1, 0xb2,
228 0x43, 0x4d, 0x52, 0x43, 0xf3, 0xe, 0x0, 0x0, 0x0, 0xe0, 0xb7, 0xe0, 0x1, 0x1d, 0xd0,
229 0x28, 0x0, 0x50, 0x60, 0x4b, 0x56, 0x41, 0x53, 0x18, 0x1, 0x10, 0x7e, 0x61, 0x4, 0x13,
230 0xf0, 0xa0, 0x0, 0x1d, 0xe0, 0x28, 0x0, 0x50, 0x68, 0x4b, 0x53, 0x43, 0x50, 0xac, 0x0,
231 0x10, 0x60, 0x7f, 0x3, 0x22, 0x20, 0xb8, 0x50, 0x0, 0x20, 0x10, 0xaf, 0x13, 0x0, 0x5,
232 0x2, 0x0, 0x0, 0x40, 0x1, 0x90, 0x44, 0x52, 0x56, 0x50, 0x52, 0x58, 0x0, 0x0, 0xb7,
233 0x16, 0x0, 0x13, 0x30, 0x28, 0x0, 0x1e, 0x20, 0x28, 0x0, 0x50, 0x66, 0x6f, 0x74, 0x68,
234 0x6b, 0x24, 0x0, 0x0, 0xad, 0x3, 0x13, 0x40, 0x28, 0x0, 0x1e, 0x30, 0x28, 0x0, 0xe0,
235 0x49, 0x4e, 0x49, 0x54, 0x4b, 0x44, 0x42, 0x47, 0xa6, 0xf1, 0x1, 0x0, 0x0, 0x50, 0x6e,
236 0x5, 0x4e, 0x2, 0x0, 0x0, 0x40, 0x28, 0x0, 0x90, 0x4d, 0x49, 0x4e, 0x49, 0x45, 0x58,
237 0x0, 0x0, 0xbc, 0x20, 0x3, 0x22, 0x50, 0xba, 0x68, 0x1, 0x20, 0x40, 0xb1, 0x62, 0x0,
238 0x5, 0x2, 0x0, 0x40, 0x20, 0x0, 0x0, 0x62, 0x50, 0x0, 0x0, 0x11, 0x0, 0xee, 0x1b, 0xe0,
239 0x9, 0x0, 0x0, 0x80, 0xba, 0x0, 0x0, 0xf0, 0x9, 0x0, 0x0, 0x70, 0x28, 0x0, 0x40, 0x50,
240 0x61, 0x64, 0x32, 0x28, 0x0, 0x71, 0x0, 0x90, 0x1b, 0x0, 0x0, 0x70, 0xc4, 0xb, 0x0,
241 0xc, 0x2, 0x0, 0x52, 0x80, 0x0, 0x0, 0x62, 0x2e, 0x6f, 0x3, 0x40, 0x0, 0x80, 0x29,
242 0x1c, 0x69, 0x1, 0x0, 0xed, 0x4, 0x49, 0x0, 0x0, 0x60, 0xbb, 0x2b, 0x0, 0xf1, 0x4,
243 0x40, 0x0, 0x0, 0xc8, 0x41, 0x4c, 0x4d, 0x4f, 0x53, 0x54, 0x52, 0x4f, 0x40, 0x9c, 0x0,
244 0x0, 0x0, 0x30, 0xfc, 0x8d, 0x0, 0x3d, 0x0, 0x50, 0xbc, 0x28, 0x0, 0xf2, 0x0, 0x43,
245 0x41, 0x43, 0x48, 0x45, 0x41, 0x4c, 0x49, 0x0, 0x8e, 0x0, 0x0, 0x0, 0xd0, 0xfc, 0x20,
246 0x1, 0x1e, 0x70, 0x28, 0x0, 0x0, 0xf8, 0x2, 0x0, 0xc0, 0x3, 0x72, 0x50, 0xb4, 0x1, 0x0,
247 0x0, 0x60, 0xfd, 0x50, 0x0, 0x1d, 0x80, 0x28, 0x0, 0x10, 0xc0, 0x28, 0x0, 0xe0, 0x56,
248 0x52, 0x46, 0x44, 0x50, 0x3c, 0x1, 0x0, 0x0, 0x20, 0xff, 0x0, 0x0, 0xa0, 0xd8, 0x2,
249 0xe, 0x28, 0x0, 0x0, 0x18, 0x1, 0x0, 0x50, 0x0, 0x30, 0xb4, 0x14, 0x2, 0xf4, 0x2, 0x1,
250 0x74, 0x5, 0x39, 0x0, 0x40, 0xbd, 0xa0, 0x0, 0x81, 0x20, 0x0, 0x0, 0xc2, 0x50, 0x61,
251 0x64, 0x33, 0x15, 0x0, 0x61, 0x80, 0x1d, 0x0, 0x0, 0x80, 0x2, 0x3f, 0x4, 0xc, 0x2, 0x0,
252 0x90, 0x80, 0x0, 0x0, 0xc2, 0x43, 0x46, 0x47, 0x52, 0x4f, 0xe3, 0x0, 0x1, 0xa8, 0x5,
253 0x21, 0x20, 0x1, 0x70, 0x3, 0x1a, 0x50, 0x50, 0x0, 0x0, 0x18, 0x1, 0x41, 0x50, 0x61,
254 0x64, 0x34, 0x40, 0x0, 0x50, 0xd0, 0x1f, 0x0, 0x0, 0x30, 0x22, 0x7, 0xe, 0x2, 0x0,
255 0x80, 0x80, 0x0, 0x0, 0xca, 0x2e, 0x72, 0x73, 0x72, 0xfe, 0x3, 0x1, 0xc4, 0x5, 0x9d,
256 0x0, 0x40, 0x1, 0x0, 0x90, 0x3, 0x0, 0x0, 0x80, 0x50, 0x0, 0xc1, 0x42, 0x2e, 0x72,
257 0x65, 0x6c, 0x6f, 0x63, 0x0, 0x0, 0xdc, 0x55, 0x1, 0xdc, 0x5, 0x78, 0x0, 0x60, 0x1,
258 0x0, 0x0, 0x10, 0xc1, 0x55, 0x0, 0x50, 0x0, 0x40, 0x0, 0x0, 0x42, 0x4, 0x0, 0x0, 0x0,
259 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x8, 0x0, 0x0,
260 ];
261 let mut cursor = Cursor::new(data);
262 let comp_msg = CompressedMessage::read_le(&mut cursor).unwrap();
263 assert_eq!(
264 comp_msg,
265 CompressedMessage::Chained(CompressedChainedMessage {
266 original_size: 4176,
267 items: vec![
268 CompressedChainedItem {
269 compression_algorithm: CompressionAlgorithm::None,
270 flags: 1,
271 original_size: None,
272 payload_data: vec![
273 0xfe, 0x53, 0x4d, 0x42, 0x40, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8,
274 0x0, 0x1, 0x0, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0,
275 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1d,
276 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x25, 0x16, 0x98, 0xbc, 0x89, 0x8e,
277 0x3e, 0x86, 0xae, 0xb7, 0x13, 0x55, 0x7c, 0xfa, 0xf1, 0xbb, 0x11, 0x0,
278 0x50, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
279 ],
280 },
281 CompressedChainedItem {
282 compression_algorithm: CompressionAlgorithm::LZ4,
283 flags: 0,
284 original_size: Some(0x7c8),
285 payload_data: vec![
286 0xf2, 0x3, 0x4d, 0x5a, 0x90, 0x0, 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0,
287 0x0, 0xff, 0xff, 0x0, 0x0, 0xb8, 0x0, 0x1, 0x0, 0x12, 0x40, 0x7, 0x0,
288 0xf, 0x2, 0x0, 0xa, 0xf3, 0x2e, 0x20, 0x1, 0x0, 0x0, 0xe, 0x1f, 0xba,
289 0xe, 0x0, 0xb4, 0x9, 0xcd, 0x21, 0xb8, 0x1, 0x4c, 0xcd, 0x21, 0x54,
290 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20,
291 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75,
292 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x44, 0x4f, 0x53, 0x20, 0x6d, 0x6f, 0x64,
293 0x65, 0x2e, 0xd, 0xd, 0xa, 0x24, 0x5a, 0x0, 0x84, 0xa9, 0x8e, 0xee,
294 0xb9, 0xed, 0xef, 0x80, 0xea, 0x4, 0x0, 0xd1, 0x99, 0x6e, 0x86, 0xeb,
295 0xdd, 0xef, 0x80, 0xea, 0x9f, 0x6e, 0x83, 0xeb, 0xe8, 0x10, 0x0, 0xb1,
296 0x81, 0xeb, 0xe1, 0xef, 0x80, 0xea, 0xbe, 0x90, 0x84, 0xeb, 0xec, 0x8,
297 0x0, 0x31, 0x83, 0xeb, 0xe3, 0x20, 0x0, 0x31, 0x81, 0xeb, 0xef, 0x38,
298 0x0, 0xb1, 0x81, 0xea, 0xad, 0xef, 0x80, 0xea, 0xe4, 0x97, 0x13, 0xea,
299 0xf0, 0x10, 0x0, 0x31, 0x80, 0xea, 0x7f, 0x38, 0x0, 0x40, 0x88, 0xeb,
300 0x5e, 0xe9, 0x40, 0x0, 0x31, 0x85, 0xeb, 0xf3, 0x10, 0x0, 0x31, 0x84,
301 0xeb, 0x90, 0x8, 0x0, 0x31, 0x83, 0xeb, 0xa9, 0x8, 0x0, 0x11, 0x80,
302 0x50, 0x0, 0x40, 0x99, 0x6e, 0x7f, 0xea, 0x58, 0x0, 0x31, 0x99, 0x6e,
303 0x82, 0x10, 0x0, 0x40, 0x52, 0x69, 0x63, 0x68, 0x44, 0x0, 0x3, 0x9f,
304 0x0, 0xd4, 0x0, 0x50, 0x45, 0x0, 0x0, 0x64, 0x86, 0x24, 0x0, 0xbb,
305 0xf4, 0xba, 0x23, 0x14, 0x0, 0xf1, 0xb, 0xf0, 0x0, 0x22, 0x0, 0xb, 0x2,
306 0xe, 0x26, 0x0, 0x90, 0xa6, 0x0, 0x0, 0xe0, 0x1d, 0x0, 0x0, 0xf0, 0x61,
307 0x0, 0x90, 0x2, 0xb1, 0x0, 0x0, 0x10, 0x22, 0x0, 0x20, 0x40, 0x1, 0x7,
308 0x0, 0x0, 0xc, 0x0, 0x56, 0x10, 0x0, 0x0, 0xa, 0x0, 0x4, 0x0, 0x1, 0x2,
309 0x0, 0x30, 0xf0, 0x44, 0x1, 0x28, 0x0, 0xb1, 0x26, 0xd1, 0xc2, 0x0,
310 0x1, 0x0, 0x60, 0x41, 0x0, 0x0, 0x8, 0x17, 0x0, 0x22, 0x0, 0x20, 0x7,
311 0x0, 0x1, 0x35, 0x0, 0x0, 0x2, 0x0, 0x0, 0x40, 0x0, 0x3, 0x2, 0x0, 0x1,
312 0xb, 0x0, 0xc1, 0x70, 0x14, 0x0, 0x8f, 0xb3, 0x1, 0x0, 0x28, 0x47,
313 0x14, 0x0, 0xb8, 0x61, 0x0, 0xf3, 0x14, 0x40, 0x1, 0x28, 0x8e, 0x3,
314 0x0, 0x0, 0x70, 0xd, 0x0, 0xb4, 0xcf, 0x6, 0x0, 0x0, 0x70, 0xc2, 0x0,
315 0xb8, 0x25, 0x0, 0x0, 0x0, 0x90, 0x43, 0x1, 0xdc, 0x5f, 0x0, 0x0, 0x10,
316 0x10, 0x4, 0x0, 0x70, 0x40, 0x0, 0xf, 0x2, 0x0, 0x1, 0x20, 0xa0, 0x5b,
317 0x42, 0x0, 0x7, 0x1a, 0x0, 0x57, 0x40, 0x14, 0x0, 0xf8, 0x6, 0x10, 0x0,
318 0xb, 0x2, 0x0, 0xb2, 0x2e, 0x72, 0x64, 0x61, 0x74, 0x61, 0x0, 0x0,
319 0x30, 0x5c, 0xd, 0x91, 0x0, 0x13, 0x60, 0x8, 0x0, 0x7, 0x2, 0x0, 0x62,
320 0x40, 0x0, 0x0, 0x48, 0x2e, 0x70, 0x28, 0x0, 0x2, 0x94, 0x0, 0x40, 0xd,
321 0x0, 0x0, 0xd0, 0x9c, 0x0, 0x17, 0xd, 0x26, 0x0, 0x3, 0x28, 0x0, 0x12,
322 0x69, 0x28, 0x0, 0x22, 0x24, 0x26, 0x7c, 0x0, 0x23, 0x0, 0x30, 0x8,
323 0x0, 0x7, 0x2, 0x0, 0x1, 0x50, 0x0, 0x12, 0x65, 0x28, 0x0, 0x0, 0xfc,
324 0x0, 0x63, 0x0, 0x70, 0x14, 0x0, 0x0, 0xc0, 0x8, 0x0, 0x7, 0x2, 0x0,
325 0xc1, 0x40, 0x0, 0x0, 0x40, 0x50, 0x52, 0x4f, 0x54, 0x44, 0x41, 0x54,
326 0x41, 0x1b, 0x1, 0x22, 0x30, 0x16, 0xa4, 0x0, 0x0, 0x8, 0x0, 0x7, 0x2,
327 0x0, 0x0, 0x50, 0x0, 0xa0, 0x47, 0x46, 0x49, 0x44, 0x53, 0x0, 0x0, 0x0,
328 0x2c, 0xa9, 0x70, 0x0, 0x43, 0x16, 0x0, 0x0, 0xb0, 0x8, 0x0, 0x7, 0x2,
329 0x0, 0x81, 0x40, 0x0, 0x0, 0x42, 0x50, 0x61, 0x64, 0x31, 0x13, 0x0,
330 0x61, 0x10, 0x9, 0x0, 0x0, 0xf0, 0x16, 0xb, 0x0, 0xc, 0x2, 0x0, 0xf2,
331 0x0, 0x80, 0x0, 0x0, 0x42, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x0, 0x0, 0x0,
332 0xb, 0xa1, 0x4c, 0xc5, 0x1, 0x2d, 0xb0, 0x4c, 0x30, 0x0, 0x80, 0x20,
333 0x0, 0x0, 0x68, 0x50, 0x41, 0x47, 0x45, 0x40, 0x0, 0xf0, 0x0, 0x80,
334 0x42, 0x44, 0x0, 0x0, 0xb0, 0x6c, 0x0, 0x0, 0x50, 0x44, 0x0, 0x0, 0xa0,
335 0x63, 0x13, 0x0, 0x5, 0x2, 0x0, 0x40, 0x20, 0x0, 0x0, 0x60, 0x28, 0x0,
336 0xf5, 0x4, 0x4c, 0x4b, 0x0, 0x0, 0x1c, 0x64, 0x2, 0x0, 0x0, 0x0, 0xb1,
337 0x0, 0x0, 0x70, 0x2, 0x0, 0x0, 0xf0, 0xa7, 0x24, 0x0, 0x0, 0x2, 0x0,
338 0x1, 0x28, 0x0, 0x80, 0x4f, 0x4f, 0x4c, 0x43, 0x4f, 0x44, 0x45, 0xbe,
339 0xf4, 0x1, 0x22, 0x70, 0xb3, 0x40, 0x1, 0x20, 0x60, 0xaa, 0x1f, 0x0,
340 0x5, 0x2, 0x0, 0x4, 0x78, 0x0, 0xe0, 0x4b, 0x44, 0x0, 0x0, 0xea, 0x5d,
341 0x0, 0x0, 0x0, 0xa0, 0xb3, 0x0, 0x0, 0x60, 0x24, 0x2, 0xd, 0x28, 0x0,
342 0x1, 0x78, 0x0, 0x60, 0x56, 0x52, 0x46, 0x59, 0x19, 0x15, 0xe, 0x4,
343 0x8f, 0xb4, 0x0, 0x0, 0x20, 0x3, 0x0, 0x0, 0xf0, 0x28, 0x0, 0x3, 0x50,
344 0x48, 0x44, 0x4c, 0x53, 0x76, 0xe, 0x3, 0x22, 0x20, 0xb7, 0x78, 0x0,
345 0x25, 0x10, 0xae, 0x74, 0x0, 0x0, 0x2, 0x0, 0x1, 0xa0, 0x0, 0x90, 0x41,
346 0x47, 0x45, 0x42, 0x47, 0x46, 0x58, 0x68, 0x69, 0x45, 0x3, 0x21, 0xb7,
347 0x0, 0x8d, 0x2, 0x1e, 0x40, 0x28, 0x0, 0xf1, 0x0, 0x54, 0x52, 0x41,
348 0x43, 0x45, 0x53, 0x55, 0x50, 0xa3, 0x19, 0x0, 0x0, 0x0, 0xc0, 0xb7,
349 0x3d, 0x0, 0x2d, 0x0, 0xb0, 0x28, 0x0, 0x1, 0x40, 0x1, 0xb2, 0x43,
350 0x4d, 0x52, 0x43, 0xf3, 0xe, 0x0, 0x0, 0x0, 0xe0, 0xb7, 0xe0, 0x1,
351 0x1d, 0xd0, 0x28, 0x0, 0x50, 0x60, 0x4b, 0x56, 0x41, 0x53, 0x18, 0x1,
352 0x10, 0x7e, 0x61, 0x4, 0x13, 0xf0, 0xa0, 0x0, 0x1d, 0xe0, 0x28, 0x0,
353 0x50, 0x68, 0x4b, 0x53, 0x43, 0x50, 0xac, 0x0, 0x10, 0x60, 0x7f, 0x3,
354 0x22, 0x20, 0xb8, 0x50, 0x0, 0x20, 0x10, 0xaf, 0x13, 0x0, 0x5, 0x2,
355 0x0, 0x0, 0x40, 0x1, 0x90, 0x44, 0x52, 0x56, 0x50, 0x52, 0x58, 0x0,
356 0x0, 0xb7, 0x16, 0x0, 0x13, 0x30, 0x28, 0x0, 0x1e, 0x20, 0x28, 0x0,
357 0x50, 0x66, 0x6f, 0x74, 0x68, 0x6b, 0x24, 0x0, 0x0, 0xad, 0x3, 0x13,
358 0x40, 0x28, 0x0, 0x1e, 0x30, 0x28, 0x0, 0xe0, 0x49, 0x4e, 0x49, 0x54,
359 0x4b, 0x44, 0x42, 0x47, 0xa6, 0xf1, 0x1, 0x0, 0x0, 0x50, 0x6e, 0x5,
360 0x4e, 0x2, 0x0, 0x0, 0x40, 0x28, 0x0, 0x90, 0x4d, 0x49, 0x4e, 0x49,
361 0x45, 0x58, 0x0, 0x0, 0xbc, 0x20, 0x3, 0x22, 0x50, 0xba, 0x68, 0x1,
362 0x20, 0x40, 0xb1, 0x62, 0x0, 0x5, 0x2, 0x0, 0x40, 0x20, 0x0, 0x0, 0x62,
363 0x50, 0x0, 0x0, 0x11, 0x0, 0xee, 0x1b, 0xe0, 0x9, 0x0, 0x0, 0x80, 0xba,
364 0x0, 0x0, 0xf0, 0x9, 0x0, 0x0, 0x70, 0x28, 0x0, 0x40, 0x50, 0x61, 0x64,
365 0x32, 0x28, 0x0, 0x71, 0x0, 0x90, 0x1b, 0x0, 0x0, 0x70, 0xc4, 0xb, 0x0,
366 0xc, 0x2, 0x0, 0x52, 0x80, 0x0, 0x0, 0x62, 0x2e, 0x6f, 0x3, 0x40, 0x0,
367 0x80, 0x29, 0x1c, 0x69, 0x1, 0x0, 0xed, 0x4, 0x49, 0x0, 0x0, 0x60,
368 0xbb, 0x2b, 0x0, 0xf1, 0x4, 0x40, 0x0, 0x0, 0xc8, 0x41, 0x4c, 0x4d,
369 0x4f, 0x53, 0x54, 0x52, 0x4f, 0x40, 0x9c, 0x0, 0x0, 0x0, 0x30, 0xfc,
370 0x8d, 0x0, 0x3d, 0x0, 0x50, 0xbc, 0x28, 0x0, 0xf2, 0x0, 0x43, 0x41,
371 0x43, 0x48, 0x45, 0x41, 0x4c, 0x49, 0x0, 0x8e, 0x0, 0x0, 0x0, 0xd0,
372 0xfc, 0x20, 0x1, 0x1e, 0x70, 0x28, 0x0, 0x0, 0xf8, 0x2, 0x0, 0xc0, 0x3,
373 0x72, 0x50, 0xb4, 0x1, 0x0, 0x0, 0x60, 0xfd, 0x50, 0x0, 0x1d, 0x80,
374 0x28, 0x0, 0x10, 0xc0, 0x28, 0x0, 0xe0, 0x56, 0x52, 0x46, 0x44, 0x50,
375 0x3c, 0x1, 0x0, 0x0, 0x20, 0xff, 0x0, 0x0, 0xa0, 0xd8, 0x2, 0xe, 0x28,
376 0x0, 0x0, 0x18, 0x1, 0x0, 0x50, 0x0, 0x30, 0xb4, 0x14, 0x2, 0xf4, 0x2,
377 0x1, 0x74, 0x5, 0x39, 0x0, 0x40, 0xbd, 0xa0, 0x0, 0x81, 0x20, 0x0, 0x0,
378 0xc2, 0x50, 0x61, 0x64, 0x33, 0x15, 0x0, 0x61, 0x80, 0x1d, 0x0, 0x0,
379 0x80, 0x2, 0x3f, 0x4, 0xc, 0x2, 0x0, 0x90, 0x80, 0x0, 0x0, 0xc2, 0x43,
380 0x46, 0x47, 0x52, 0x4f, 0xe3, 0x0, 0x1, 0xa8, 0x5, 0x21, 0x20, 0x1,
381 0x70, 0x3, 0x1a, 0x50, 0x50, 0x0, 0x0, 0x18, 0x1, 0x41, 0x50, 0x61,
382 0x64, 0x34, 0x40, 0x0, 0x50, 0xd0, 0x1f, 0x0, 0x0, 0x30, 0x22, 0x7,
383 0xe, 0x2, 0x0, 0x80, 0x80, 0x0, 0x0, 0xca, 0x2e, 0x72, 0x73, 0x72,
384 0xfe, 0x3, 0x1, 0xc4, 0x5, 0x9d, 0x0, 0x40, 0x1, 0x0, 0x90, 0x3, 0x0,
385 0x0, 0x80, 0x50, 0x0, 0xc1, 0x42, 0x2e, 0x72, 0x65, 0x6c, 0x6f, 0x63,
386 0x0, 0x0, 0xdc, 0x55, 0x1, 0xdc, 0x5, 0x78, 0x0, 0x60, 0x1, 0x0, 0x0,
387 0x10, 0xc1, 0x55, 0x0, 0x50, 0x0, 0x40, 0x0, 0x0, 0x42
388 ]
389 },
390 CompressedChainedItem {
391 compression_algorithm: CompressionAlgorithm::PatternV1,
392 flags: 0,
393 original_size: None,
394 payload_data: vec![0x0, 0x0, 0x0, 0x0, 0x38, 0x8, 0x0, 0x0]
395 },
396 ]
397 })
398 )
399 }
400
401 #[test]
402 pub fn test_compressed_data_chained_write() {
403 let value = CompressedMessage::Chained(CompressedChainedMessage {
404 original_size: 368,
405 items: vec![
406 CompressedChainedItem {
407 compression_algorithm: CompressionAlgorithm::None,
408 flags: 1,
409 original_size: None,
410 payload_data: vec![
411 0xfe, 0x53, 0x4d, 0x42, 0x40, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0,
412 0x1, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x3, 0x0, 0x0,
413 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x9, 0x0,
414 0x0, 0x2c, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
415 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0x0, 0x1, 0xf, 0x2a, 0x2,
416 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x8, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3,
417 0x0, 0x0, 0x0, 0x11, 0x7, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x69, 0x0, 0x20,
418 0x0, 0xc, 0x0, 0x0, 0x0,
419 ],
420 },
421 CompressedChainedItem {
422 compression_algorithm: CompressionAlgorithm::None,
423 flags: 0,
424 original_size: None,
425 payload_data: vec![
426 0x0, 0x0, 0x0, 0x0, 0x15, 0x24, 0x4d, 0x70, 0x45, 0x61, 0x5f, 0x44, 0x32,
427 0x36, 0x32, 0x41, 0x43, 0x36, 0x32, 0x34, 0x34, 0x35, 0x31, 0x32, 0x39,
428 0x35,
429 ],
430 },
431 CompressedChainedItem {
432 compression_algorithm: CompressionAlgorithm::PatternV1,
433 flags: 0,
434 original_size: None,
435 payload_data: vec![0x0, 0x0, 0x0, 0x0, 0xee, 0x0, 0x0, 0x0],
436 },
437 ],
438 });
439
440 let mut cursor = Cursor::new(Vec::new());
441 value.write_le(&mut cursor).unwrap();
442
443 assert_eq!(
444 cursor.into_inner(),
445 [
446 0xfc, 0x53, 0x4d, 0x42, 0x70, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x68, 0x0, 0x0,
447 0x0, 0xfe, 0x53, 0x4d, 0x42, 0x40, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0,
448 0x1, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x3, 0x0, 0x0, 0x0, 0x0,
449 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, 0x2c, 0x0, 0x30,
450 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
451 0x0, 0x0, 0x29, 0x0, 0x1, 0xf, 0x2a, 0x2, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x8, 0x1,
452 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x11, 0x7, 0x0, 0x0, 0xc, 0x0,
453 0x0, 0x0, 0x69, 0x0, 0x20, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0,
454 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x24, 0x4d, 0x70, 0x45, 0x61, 0x5f, 0x44, 0x32,
455 0x36, 0x32, 0x41, 0x43, 0x36, 0x32, 0x34, 0x34, 0x35, 0x31, 0x32, 0x39, 0x35, 0x4,
456 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xee, 0x0, 0x0, 0x0
457 ]
458 );
459 }
460}