1use std::{
2 collections::{HashMap, VecDeque},
3 net::SocketAddr,
4};
5
6use crate::{datatype::*, error::*, fragment::FragmentQ, raknet_log_debug, utils::*};
7
8#[derive(Clone, Copy, Debug, PartialEq, Eq)]
10#[repr(u8)]
11pub enum Reliability {
12 Unreliable = 0x00,
14 UnreliableSequenced = 0x01,
16 Reliable = 0x02,
18 ReliableOrdered = 0x03,
20 ReliableSequenced = 0x04,
22}
23
24impl Reliability {
25 pub fn to_u8(&self) -> u8 {
26 *self as u8
27 }
28
29 pub fn from(flags: u8) -> Result<Self> {
30 Self::try_from(flags)
31 }
32}
33
34impl TryFrom<u8> for Reliability {
35 type Error = RaknetError;
36
37 fn try_from(flags: u8) -> Result<Self> {
38 match flags {
39 0x00 => Ok(Self::Unreliable),
40 0x01 => Ok(Self::UnreliableSequenced),
41 0x02 => Ok(Self::Reliable),
42 0x03 => Ok(Self::ReliableOrdered),
43 0x04 => Ok(Self::ReliableSequenced),
44 _ => Err(RaknetError::IncorrectReliability),
45 }
46 }
47}
48
49const NEEDS_B_AND_AS_FLAG: u8 = 0x4;
50const CONTINUOUS_SEND_FLAG: u8 = 0x8;
51
52#[derive(Clone)]
53pub struct FrameSetPacket {
54 pub sequence_number: u32,
55 pub flags: u8,
56 pub length_in_bytes: u16,
57 pub reliable_frame_index: u32,
58 pub sequenced_frame_index: u32,
59 pub ordered_frame_index: u32,
60 pub order_channel: u8,
61 pub compound_size: u32,
62 pub compound_id: u16,
63 pub fragment_index: u32,
64 pub data: Vec<u8>,
65}
66
67impl FrameSetPacket {
68 pub fn new(r: Reliability, data: Vec<u8>) -> Self {
69 let flag = r.to_u8() << 5;
70
71 Self {
72 sequence_number: 0,
73 flags: flag,
74 length_in_bytes: data.len() as u16,
75 reliable_frame_index: 0,
76 sequenced_frame_index: 0,
77 ordered_frame_index: 0,
78 order_channel: 0,
79 compound_size: 0,
80 compound_id: 0,
81 fragment_index: 0,
82 data,
83 }
84 }
85
86 #[cfg(test)]
87 pub fn deserialize(buf: &[u8]) -> Result<(Self, bool)> {
88 let mut reader = RaknetReader::new(buf);
89 let input_len = buf.len() as u64;
90
91 let mut ret = Self {
92 sequence_number: 0,
93 flags: 0,
94 length_in_bytes: 0,
95 reliable_frame_index: 0,
96 sequenced_frame_index: 0,
97 ordered_frame_index: 0,
98 order_channel: 0,
99 compound_size: 0,
100 compound_id: 0,
101 fragment_index: 0,
102 data: vec![],
103 };
104
105 let packet_id = reader.read_u8()?;
106 if !(0x80..=0x8d).contains(&packet_id) {
107 return Err(RaknetError::PacketHeaderError);
108 }
109 ret.sequence_number = reader.read_u24(Endian::Little)?;
110 ret.flags = reader.read_u8()?;
111
112 let length_in_bits = reader.read_u16(Endian::Big)?;
113 if length_in_bits % 8 != 0 {
114 return Err(RaknetError::PacketParseError);
115 }
116 ret.length_in_bytes = length_in_bits / 8;
117
118 if ret.is_reliable()? {
119 ret.reliable_frame_index = reader.read_u24(Endian::Little)?;
120 }
121
122 if ret.is_sequenced()? {
123 ret.sequenced_frame_index = reader.read_u24(Endian::Little)?;
124 }
125 if ret.is_ordered()? {
126 ret.ordered_frame_index = reader.read_u24(Endian::Little)?;
127 ret.order_channel = reader.read_u8()?;
128 }
129
130 if ret.is_fragment() {
131 ret.compound_size = reader.read_u32(Endian::Big)?;
132 ret.compound_id = reader.read_u16(Endian::Big)?;
133 ret.fragment_index = reader.read_u32(Endian::Big)?;
134 }
135
136 ret.data.resize(usize::from(ret.length_in_bytes), 0);
137 reader.read(&mut ret.data)?;
138
139 if ret.is_fragment() && (ret.compound_size == 0 || ret.fragment_index >= ret.compound_size)
140 {
141 return Err(RaknetError::PacketParseError);
142 }
143
144 Ok((ret, reader.pos() == input_len))
145 }
146
147 pub fn serialize(&self) -> Result<Vec<u8>> {
148 if self.data.len() != usize::from(self.length_in_bytes)
149 || self.data.len() > usize::from(u16::MAX / 8)
150 || (self.is_fragment()
151 && (self.compound_size == 0 || self.fragment_index >= self.compound_size))
152 {
153 return Err(RaknetError::PacketParseError);
154 }
155
156 let mut writer = RaknetWriter::with_capacity(self._size()?);
157 let mut id = 0x80 | NEEDS_B_AND_AS_FLAG;
158
159 if (self.flags & 16) != 0 && self.fragment_index != 0 {
161 id |= CONTINUOUS_SEND_FLAG;
162 }
163
164 writer.write_u8(id)?;
165 writer.write_u24(self.sequence_number, Endian::Little)?;
166
167 writer.write_u8(self.flags)?;
169 writer.write_u16(self.length_in_bytes * 8, Endian::Big)?;
170
171 if self.is_reliable()? {
172 writer.write_u24(self.reliable_frame_index, Endian::Little)?;
173 }
174
175 if self.is_sequenced()? {
176 writer.write_u24(self.sequenced_frame_index, Endian::Little)?;
177 }
178 if self.is_ordered()? {
179 writer.write_u24(self.ordered_frame_index, Endian::Little)?;
180 writer.write_u8(self.order_channel)?;
181 }
182
183 if (self.flags & 16) != 0 {
185 writer.write_u32(self.compound_size, Endian::Big)?;
186 writer.write_u16(self.compound_id, Endian::Big)?;
187 writer.write_u32(self.fragment_index, Endian::Big)?;
188 }
189 writer.write(self.data.as_slice())?;
190
191 Ok(writer.get_raw_payload())
192 }
193
194 pub fn is_fragment(&self) -> bool {
195 (self.flags & 16) != 0
196 }
197
198 pub fn is_reliable(&self) -> Result<bool> {
199 let r = Reliability::from((self.flags & 224) >> 5)?;
200 Ok(matches!(
201 r,
202 Reliability::Reliable | Reliability::ReliableOrdered | Reliability::ReliableSequenced
203 ))
204 }
205
206 pub fn is_ordered(&self) -> Result<bool> {
207 let r = Reliability::from((self.flags & 224) >> 5)?;
208 Ok(matches!(
209 r,
210 Reliability::UnreliableSequenced
211 | Reliability::ReliableOrdered
212 | Reliability::ReliableSequenced
213 ))
214 }
215
216 pub fn is_sequenced(&self) -> Result<bool> {
217 let r = Reliability::from((self.flags & 224) >> 5)?;
218 Ok(matches!(
219 r,
220 Reliability::UnreliableSequenced | Reliability::ReliableSequenced
221 ))
222 }
223 pub fn reliability(&self) -> Result<Reliability> {
224 Reliability::from((self.flags & 224) >> 5)
225 }
226
227 pub fn _size(&self) -> Result<usize> {
228 let mut ret = 0;
229 ret += 1;
231 ret += 3;
233 ret += 1;
235 ret += 2;
237
238 if self.is_reliable()? {
239 ret += 3;
241 }
242 if self.is_sequenced()? {
243 ret += 3;
245 }
246 if self.is_ordered()? {
247 ret += 4;
249 }
250 if (self.flags & 16) != 0 {
251 ret += 10;
253 }
254 ret += self.data.len();
256 Ok(ret)
257 }
258}
259
260pub struct FrameVec {
261 pub frames: Vec<FrameSetPacket>,
262}
263
264impl FrameVec {
265 pub fn new(buf: &[u8]) -> Result<Self> {
266 let mut reader = RaknetReader::new(buf);
267 let id = reader.read_u8()?;
268 if !(0x80..=0x8d).contains(&id) {
269 return Err(RaknetError::PacketHeaderError);
270 }
271 let sequence_number = reader.read_u24(Endian::Little)?;
272 if reader.pos() == buf.len() as u64 {
273 return Err(RaknetError::PacketParseError);
274 }
275 let mut frames = Vec::new();
276
277 while reader.pos() < buf.len() as u64 {
278 let mut frame = FrameSetPacket {
279 sequence_number,
280 flags: 0,
281 length_in_bytes: 0,
282 reliable_frame_index: 0,
283 sequenced_frame_index: 0,
284 ordered_frame_index: 0,
285 order_channel: 0,
286 compound_size: 0,
287 compound_id: 0,
288 fragment_index: 0,
289 data: Vec::new(),
290 };
291
292 frame.flags = reader.read_u8()?;
293 let length_in_bits = reader.read_u16(Endian::Big)?;
294 if length_in_bits % 8 != 0 {
295 return Err(RaknetError::PacketParseError);
296 }
297 frame.length_in_bytes = length_in_bits / 8;
298
299 if frame.is_reliable()? {
300 frame.reliable_frame_index = reader.read_u24(Endian::Little)?;
301 }
302 if frame.is_sequenced()? {
303 frame.sequenced_frame_index = reader.read_u24(Endian::Little)?;
304 }
305 if frame.is_ordered()? {
306 frame.ordered_frame_index = reader.read_u24(Endian::Little)?;
307 frame.order_channel = reader.read_u8()?;
308 }
309 if frame.is_fragment() {
310 frame.compound_size = reader.read_u32(Endian::Big)?;
311 frame.compound_id = reader.read_u16(Endian::Big)?;
312 frame.fragment_index = reader.read_u32(Endian::Big)?;
313 if frame.compound_size == 0 || frame.fragment_index >= frame.compound_size {
314 return Err(RaknetError::PacketParseError);
315 }
316 }
317
318 frame.data.resize(usize::from(frame.length_in_bytes), 0);
319 reader.read(&mut frame.data)?;
320 frames.push(frame);
321 }
322
323 Ok(Self { frames })
324 }
325}
326
327#[derive(Default)]
328pub struct ACKSet {
329 ack: Vec<(u32, u32)>,
330 nack: Vec<(u32, u32)>,
331 last_max: u32,
332}
333
334impl ACKSet {
335 pub fn insert(&mut self, s: u32) {
336 if s != 0 {
337 if s > self.last_max && s != self.last_max.saturating_add(1) {
338 self.nack.push((self.last_max.saturating_add(1), s - 1));
339 }
340
341 if s > self.last_max {
342 self.last_max = s;
343 }
344 }
345
346 for i in 0..self.ack.len() {
347 let a = self.ack[i];
348 if a.0 != 0 && s == a.0 - 1 {
349 self.ack[i].0 = s;
350 return;
351 }
352 if s == a.1.saturating_add(1) {
353 self.ack[i].1 = s;
354 return;
355 }
356 }
357 self.ack.push((s, s));
358 }
359
360 pub fn get_ack(&mut self) -> Vec<(u32, u32)> {
361 std::mem::take(&mut self.ack)
362 }
363
364 pub fn get_nack(&mut self) -> Vec<(u32, u32)> {
365 std::mem::take(&mut self.nack)
366 }
367}
368
369#[derive(Default)]
370pub struct RecvQ {
371 sequenced_frame_indexes: HashMap<u8, u32>,
372 last_ordered_indexes: HashMap<u8, u32>,
373 sequence_number_ackset: ACKSet,
374 packets: HashMap<u32, FrameSetPacket>,
375 ordered_packets: HashMap<(u8, u32), FrameSetPacket>,
376 fragment_queue: FragmentQ,
377}
378
379impl RecvQ {
380 pub fn new() -> Self {
381 Self::default()
382 }
383
384 pub fn insert(&mut self, frame: FrameSetPacket) -> Result<()> {
385 if self.packets.contains_key(&frame.sequence_number) {
386 return Ok(());
387 }
388
389 let reliability = frame.reliability()?;
390 self.sequence_number_ackset.insert(frame.sequence_number);
391
392 match reliability {
393 Reliability::Unreliable => {
394 self.packets.entry(frame.sequence_number).or_insert(frame);
395 }
396 Reliability::UnreliableSequenced => {
397 let channel = frame.order_channel;
398 let sequence_index = frame.sequenced_frame_index;
399 let sequence_number = frame.sequence_number;
400 let last_index = self.sequenced_frame_indexes.entry(channel).or_default();
401 if sequence_index >= *last_index {
402 self.packets.entry(sequence_number).or_insert(frame);
403 *last_index = sequence_index + 1;
404 }
405 }
406 Reliability::Reliable => {
407 self.packets.insert(frame.sequence_number, frame);
408 }
409 Reliability::ReliableOrdered => {
410 let expected_index = self
411 .last_ordered_indexes
412 .get(&frame.order_channel)
413 .copied()
414 .unwrap_or(0);
415 if frame.ordered_frame_index < expected_index {
416 return Ok(());
417 }
418
419 if frame.is_fragment() {
420 if let Some(fragment) = self.fragment_queue.insert_and_take_completed(frame)? {
421 self.ordered_packets
422 .entry((fragment.order_channel, fragment.ordered_frame_index))
423 .or_insert(fragment);
424 }
425 } else {
426 self.ordered_packets
427 .entry((frame.order_channel, frame.ordered_frame_index))
428 .or_insert(frame);
429 }
430 }
431 Reliability::ReliableSequenced => {
432 let channel = frame.order_channel;
433 let sequence_index = frame.sequenced_frame_index;
434 let sequence_number = frame.sequence_number;
435 let last_index = self.sequenced_frame_indexes.entry(channel).or_default();
436 if sequence_index >= *last_index {
437 self.packets.entry(sequence_number).or_insert(frame);
438 *last_index = sequence_index + 1;
439 }
440 }
441 }
442 Ok(())
443 }
444
445 pub fn get_ack(&mut self) -> Vec<(u32, u32)> {
446 self.sequence_number_ackset.get_ack()
447 }
448
449 pub fn get_nack(&mut self) -> Vec<(u32, u32)> {
450 self.sequence_number_ackset.get_nack()
451 }
452
453 pub fn flush(&mut self, _peer_addr: &SocketAddr) -> Vec<FrameSetPacket> {
454 let mut ret = Vec::new();
455 let mut ordered_keys: Vec<(u8, u32)> = self.ordered_packets.keys().copied().collect();
456 ordered_keys.sort_unstable();
457
458 for (channel, index) in ordered_keys {
459 let expected_index = self.last_ordered_indexes.entry(channel).or_default();
460 if index == *expected_index {
461 if let Some(frame) = self.ordered_packets.remove(&(channel, index)) {
462 ret.push(frame);
463 *expected_index = index + 1;
464 }
465 }
466 }
467
468 let mut packets: Vec<_> = self.packets.drain().map(|(_, frame)| frame).collect();
469 packets.sort_unstable_by_key(|frame| frame.sequence_number);
470 ret.extend(packets);
471 ret
472 }
473 pub fn get_ordered_packet(&self) -> usize {
474 self.ordered_packets.len()
475 }
476
477 pub fn get_fragment_queue_size(&self) -> usize {
478 self.fragment_queue.size()
479 }
480
481 pub fn get_ordered_keys(&self) -> Vec<(u8, u32)> {
482 self.ordered_packets.keys().copied().collect()
483 }
484
485 pub fn get_size(&self) -> usize {
486 self.packets.len()
487 }
488}
489
490pub struct SendQ {
491 mtu: u16,
492 ack_sequence_number: u32,
493 sequence_number: u32,
494 reliable_frame_index: u32,
495 sequenced_frame_indexes: HashMap<u8, u32>,
496 ordered_frame_indexes: HashMap<u8, u32>,
497 compound_id: u16,
498 packets: VecDeque<FrameSetPacket>,
500 rto: i64,
501 srtt: i64,
502 sent_packet: Vec<(FrameSetPacket, bool, i64, u32, Vec<u32>)>,
503}
504
505impl SendQ {
506 pub const DEFAULT_TIMEOUT_MILLS: i64 = 50;
507 const MAX_IN_FLIGHT_PACKETS: usize = 64;
508
509 const RTO_UBOUND: i64 = 12000;
510 const RTO_LBOUND: i64 = 50;
511
512 pub fn new(mtu: u16) -> Self {
513 Self {
514 mtu,
515 ack_sequence_number: 0,
516 sequence_number: 0,
517 packets: VecDeque::new(),
518 sent_packet: vec![],
519 reliable_frame_index: 0,
520 sequenced_frame_indexes: HashMap::new(),
521 ordered_frame_indexes: HashMap::new(),
522 compound_id: 0,
523
524 rto: SendQ::DEFAULT_TIMEOUT_MILLS,
525 srtt: SendQ::DEFAULT_TIMEOUT_MILLS,
526 }
527 }
528
529 pub fn insert(&mut self, reliability: Reliability, buf: &[u8]) -> Result<()> {
530 self.insert_with_order_channel(reliability, buf, 0)
531 }
532
533 pub fn insert_with_order_channel(
534 &mut self,
535 reliability: Reliability,
536 buf: &[u8],
537 order_channel: u8,
538 ) -> Result<()> {
539 let max_payload = self
540 .mtu
541 .checked_sub(60)
542 .map(usize::from)
543 .filter(|size| *size > 0)
544 .ok_or(RaknetError::PacketSizeExceedMTU)?;
545
546 match reliability {
547 Reliability::Unreliable => {
548 if buf.len() > max_payload {
549 return Err(RaknetError::PacketSizeExceedMTU);
550 }
551
552 let frame = FrameSetPacket::new(reliability, buf.to_vec());
553 self.packets.push_back(frame);
554 }
555 Reliability::UnreliableSequenced => {
556 if buf.len() > max_payload {
557 return Err(RaknetError::PacketSizeExceedMTU);
558 }
559
560 let sequenced_frame_index = {
561 let index = self
562 .sequenced_frame_indexes
563 .entry(order_channel)
564 .or_default();
565 let current = *index;
566 *index += 1;
567 current
568 };
569 let ordered_frame_index = self
570 .ordered_frame_indexes
571 .get(&order_channel)
572 .copied()
573 .unwrap_or(0);
574 let mut frame = FrameSetPacket::new(reliability, buf.to_vec());
575 frame.order_channel = order_channel;
576 frame.ordered_frame_index = ordered_frame_index;
577 frame.sequenced_frame_index = sequenced_frame_index;
578 self.packets.push_back(frame);
579 }
580 Reliability::Reliable => {
581 if buf.len() > max_payload {
582 return Err(RaknetError::PacketSizeExceedMTU);
583 }
584
585 let mut frame = FrameSetPacket::new(reliability, buf.to_vec());
586 frame.reliable_frame_index = self.reliable_frame_index;
587 self.packets.push_back(frame);
588 self.reliable_frame_index += 1;
589 }
590 Reliability::ReliableOrdered => {
591 if buf.len() < max_payload {
592 let mut frame = FrameSetPacket::new(reliability, buf.to_vec());
593 frame.order_channel = order_channel;
594 frame.reliable_frame_index = self.reliable_frame_index;
595 frame.ordered_frame_index =
596 *self.ordered_frame_indexes.entry(order_channel).or_default();
597 self.packets.push_back(frame);
598 self.reliable_frame_index += 1;
599 } else {
600 let compound_size = buf.len().div_ceil(max_payload);
601 let compound_size = u32::try_from(compound_size)
602 .map_err(|_| RaknetError::PacketSizeExceedMTU)?;
603 let ordered_frame_index =
604 *self.ordered_frame_indexes.entry(order_channel).or_default();
605
606 for (fragment_index, chunk) in buf.chunks(max_payload).enumerate() {
607 let mut frame = FrameSetPacket::new(reliability, chunk.to_vec());
608 frame.flags |= 16;
609 frame.compound_size = compound_size;
610 frame.compound_id = self.compound_id;
611 frame.fragment_index = fragment_index as u32;
612 frame.order_channel = order_channel;
613 frame.reliable_frame_index = self.reliable_frame_index;
614 frame.ordered_frame_index = ordered_frame_index;
615 self.packets.push_back(frame);
616 self.reliable_frame_index += 1;
617 }
618 self.compound_id += 1;
619 }
620 *self.ordered_frame_indexes.entry(order_channel).or_default() += 1;
621 }
622 Reliability::ReliableSequenced => {
623 if buf.len() > max_payload {
624 return Err(RaknetError::PacketSizeExceedMTU);
625 }
626
627 let sequenced_frame_index = {
628 let index = self
629 .sequenced_frame_indexes
630 .entry(order_channel)
631 .or_default();
632 let current = *index;
633 *index += 1;
634 current
635 };
636 let ordered_frame_index = self
637 .ordered_frame_indexes
638 .get(&order_channel)
639 .copied()
640 .unwrap_or(0);
641 let mut frame = FrameSetPacket::new(reliability, buf.to_vec());
642 frame.order_channel = order_channel;
643 frame.reliable_frame_index = self.reliable_frame_index;
644 frame.sequenced_frame_index = sequenced_frame_index;
645 frame.ordered_frame_index = ordered_frame_index;
646 self.packets.push_back(frame);
647 self.reliable_frame_index += 1;
648 }
649 };
650 Ok(())
651 }
652
653 fn update_rto(&mut self, rtt: i64) {
654 self.srtt = ((self.srtt as f64 * 0.8) + (rtt as f64 * 0.2)) as i64;
657 let rto_right = (1.5 * self.srtt as f64) as i64;
660 let rto_right = if rto_right > SendQ::RTO_LBOUND {
661 rto_right
662 } else {
663 SendQ::RTO_LBOUND
664 };
665 self.rto = if rto_right < SendQ::RTO_UBOUND {
666 rto_right
667 } else {
668 SendQ::RTO_UBOUND
669 };
670 }
671
672 pub fn get_rto(&self) -> i64 {
673 self.rto
674 }
675
676 pub fn nack(&mut self, sequence: u32, tick: i64) {
677 for i in 0..self.sent_packet.len() {
678 let item = &mut self.sent_packet[i];
679 if item.1 && item.0.sequence_number == sequence {
680 raknet_log_debug!(
681 "packet {}-{}-{} nack {} times",
682 item.0.sequence_number,
683 item.0.reliable_frame_index,
684 item.0.ordered_frame_index,
685 item.3 + 1
686 );
687 item.0.sequence_number = self.sequence_number;
688 self.sequence_number += 1;
689 item.1 = false;
690 item.2 = tick;
691 item.3 += 1;
692 item.4.push(item.0.sequence_number);
693 }
694 }
695 }
696
697 pub fn ack(&mut self, sequence: u32, tick: i64) {
698 if sequence > self.ack_sequence_number.saturating_add(1) {
699 for missing in self.ack_sequence_number.saturating_add(1)..sequence {
700 self.nack(missing, tick);
701 }
702 }
703
704 self.ack_sequence_number = self.ack_sequence_number.max(sequence);
705
706 let mut rtts = vec![];
707
708 for i in 0..self.sent_packet.len() {
709 let item = &mut self.sent_packet[i];
710 if item.0.sequence_number == sequence || item.4.contains(&sequence) {
711 rtts.push(tick - item.2);
712 self.sent_packet.remove(i);
713 break;
714 }
715 }
716
717 for i in rtts {
718 self.update_rto(i);
719 }
720 }
721
722 fn tick(&mut self, tick: i64) {
723 for i in 0..self.sent_packet.len() {
724 let p = &mut self.sent_packet[i];
725
726 let mut cur_rto = self.rto;
727
728 for _ in 0..p.3 {
731 cur_rto = (cur_rto as f64 * 1.5) as i64;
732 }
733
734 if p.1 && tick - p.2 >= cur_rto {
735 p.0.sequence_number = self.sequence_number;
736 self.sequence_number += 1;
737 p.1 = false;
738 p.4.push(p.0.sequence_number);
739 }
740 }
741 }
742
743 pub fn flush(&mut self, tick: i64, peer_addr: &SocketAddr) -> Vec<FrameSetPacket> {
744 self.tick(tick);
745
746 let mut ret = Vec::new();
747 self.sent_packet
748 .sort_unstable_by_key(|packet| packet.0.sequence_number);
749
750 for packet in &mut self.sent_packet {
751 if !packet.1 {
752 raknet_log_debug!(
753 "{} , packet {}-{}-{} resend {} times",
754 peer_addr,
755 packet.0.sequence_number,
756 packet.0.reliable_frame_index,
757 packet.0.ordered_frame_index,
758 packet.3 + 1
759 );
760 ret.push(packet.0.clone());
761 packet.1 = true;
762 packet.2 = tick;
763 packet.3 += 1;
764 }
765 }
766
767 let queued_count = self.packets.len();
768 for _ in 0..queued_count {
769 let Some(mut packet) = self.packets.pop_front() else {
770 break;
771 };
772 let reliable = packet.is_reliable().unwrap_or(false);
773 if reliable && self.sent_packet.len() >= Self::MAX_IN_FLIGHT_PACKETS {
774 self.packets.push_back(packet);
775 continue;
776 }
777
778 packet.sequence_number = self.sequence_number;
779 self.sequence_number += 1;
780
781 if reliable {
782 ret.push(packet.clone());
783 let sequence_number = packet.sequence_number;
784 self.sent_packet
785 .push((packet, true, tick, 0, vec![sequence_number]));
786 } else {
787 ret.push(packet);
788 }
789 }
790
791 ret
792 }
793
794 pub fn is_empty(&self) -> bool {
795 self.packets.is_empty() && self.sent_packet.is_empty()
796 }
797
798 pub fn get_reliable_queue_size(&self) -> usize {
799 self.packets.len()
800 }
801
802 pub fn get_sent_queue_size(&self) -> usize {
803 self.sent_packet.len()
804 }
805}
806
807#[test]
808fn malformed_datagrams_are_rejected() {
809 assert!(FrameVec::new(&[0x80, 0, 0]).is_err());
810 assert!(FrameVec::new(&[0x10, 0, 0, 0]).is_err());
811}
812
813#[test]
814fn send_queue_rejects_an_invalid_mtu() {
815 let mut send_queue = SendQ::new(59);
816 assert!(send_queue.insert(Reliability::Reliable, &[0xfe]).is_err());
817}
818
819#[tokio::test]
820async fn test_recvq_orders_channels_independently() {
821 let mut recvq = RecvQ::new();
822
823 let mut later_on_channel_one = FrameSetPacket::new(Reliability::ReliableOrdered, vec![1]);
824 later_on_channel_one.sequence_number = 0;
825 later_on_channel_one.order_channel = 1;
826 later_on_channel_one.ordered_frame_index = 1;
827 recvq.insert(later_on_channel_one).unwrap();
828
829 let mut first_on_channel_two = FrameSetPacket::new(Reliability::ReliableOrdered, vec![2]);
830 first_on_channel_two.sequence_number = 1;
831 first_on_channel_two.order_channel = 2;
832 first_on_channel_two.ordered_frame_index = 0;
833 recvq.insert(first_on_channel_two).unwrap();
834
835 let ready = recvq.flush(&"127.0.0.1:0".parse().unwrap());
836 assert_eq!(ready.len(), 1);
837 assert_eq!(ready[0].order_channel, 2);
838
839 let mut first_on_channel_one = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0]);
840 first_on_channel_one.sequence_number = 2;
841 first_on_channel_one.order_channel = 1;
842 first_on_channel_one.ordered_frame_index = 0;
843 recvq.insert(first_on_channel_one).unwrap();
844
845 let ready = recvq.flush(&"127.0.0.1:0".parse().unwrap());
846 assert_eq!(ready.len(), 2);
847 assert_eq!(ready[0].ordered_frame_index, 0);
848 assert_eq!(ready[1].ordered_frame_index, 1);
849 assert!(ready.iter().all(|frame| frame.order_channel == 1));
850}
851
852#[tokio::test]
853async fn test_sendq_maintains_ordered_indexes_per_channel() {
854 let mut sendq = SendQ::new(1500);
855 sendq
856 .insert_with_order_channel(Reliability::ReliableOrdered, &[0xfe, 1], 3)
857 .unwrap();
858 sendq
859 .insert_with_order_channel(Reliability::ReliableOrdered, &[0xfe, 2], 9)
860 .unwrap();
861
862 let sent = sendq.flush(0, &"127.0.0.1:0".parse().unwrap());
863 assert_eq!(sent.len(), 2);
864 assert_eq!(sent[0].order_channel, 3);
865 assert_eq!(sent[0].ordered_frame_index, 0);
866 assert_eq!(sent[1].order_channel, 9);
867 assert_eq!(sent[1].ordered_frame_index, 0);
868}
869
870#[tokio::test]
871async fn test_ackset() {
872 let mut ackset = ACKSet::default();
873
874 ackset.insert(0);
875 ackset.insert(1);
876 ackset.insert(2);
877 ackset.insert(4);
878
879 let acks = ackset.get_ack();
880
881 assert!(acks == vec![(0, 2), (4, 4)]);
882
883 let mut ackset = ACKSet::default();
884
885 ackset.insert(0);
886 ackset.insert(1);
887 ackset.insert(2);
888 ackset.insert(6);
889
890 let acks = ackset.get_ack();
891
892 assert!(acks == vec![(0, 2), (6, 6)]);
893
894 let acks = ackset.get_ack();
895
896 assert!(acks == vec![]);
897
898 ackset.insert(0);
899 ackset.insert(2);
900
901 let acks = ackset.get_ack();
902
903 assert!(acks == vec![(0, 0), (2, 2)]);
904}
905
906#[tokio::test]
907async fn test_frame_serialize_deserialize() {
908 let p: Vec<u8> = [
910 132, 0, 0, 0, 64, 0, 144, 0, 0, 0, 9, 146, 33, 7, 47, 57, 18, 128, 111, 0, 0, 0, 0, 20,
911 200, 47, 41, 0,
912 ]
913 .to_vec();
914
915 let a = FrameSetPacket::deserialize(&p).unwrap();
916 assert!(a.0.serialize().unwrap() == p);
917}
918
919#[tokio::test]
920async fn test_recvq() {
921 let mut r = RecvQ::new();
922 let mut p = FrameSetPacket::new(Reliability::Reliable, vec![]);
923 p.sequence_number = 0;
924 p.ordered_frame_index = 0;
925 r.insert(p).unwrap();
926
927 let mut p = FrameSetPacket::new(Reliability::Reliable, vec![]);
928 p.sequence_number = 1;
929 p.ordered_frame_index = 1;
930 r.insert(p).unwrap();
931
932 let ret = r.flush(&"0.0.0.0:0".parse().unwrap());
933 assert!(ret.len() == 2);
934}
935
936#[tokio::test]
937async fn test_recvq_fragment() {
938 let mut r = RecvQ::new();
939 let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![1]);
940 p.flags |= 16;
941 p.sequence_number = 0;
942 p.ordered_frame_index = 0;
943 p.compound_id = 1;
944 p.compound_size = 3;
945 p.fragment_index = 0;
946 p.order_channel = 7;
947 r.insert(p).unwrap();
948
949 let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![2]);
950 p.flags |= 16;
951 p.sequence_number = 1;
952 p.ordered_frame_index = 0;
953 p.compound_id = 1;
954 p.compound_size = 3;
955 p.fragment_index = 1;
956 p.order_channel = 7;
957 r.insert(p).unwrap();
958
959 let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![3]);
960 p.flags |= 16;
961 p.sequence_number = 2;
962 p.ordered_frame_index = 0;
963 p.compound_id = 1;
964 p.compound_size = 3;
965 p.fragment_index = 2;
966 p.order_channel = 7;
967 r.insert(p).unwrap();
968
969 let ret = r.flush(&"0.0.0.0:0".parse().unwrap());
970 assert!(ret.len() == 1);
971 assert!(ret[0].data == vec![1, 2, 3]);
972 assert_eq!(ret[0].order_channel, 7);
973}
974
975#[tokio::test]
976async fn test_sendq() {
977 let mut s = SendQ::new(1500);
978 let p = FrameSetPacket::new(Reliability::Reliable, vec![]);
979 s.insert(Reliability::Reliable, &p.serialize().unwrap())
980 .unwrap();
981
982 let p = FrameSetPacket::new(Reliability::Reliable, vec![]);
983 s.insert(Reliability::Reliable, &p.serialize().unwrap())
984 .unwrap();
985
986 let sockaddr: SocketAddr = "127.0.0.1:8000".parse().unwrap();
987 let ret = s.flush(0, &sockaddr);
988 assert!(ret.len() == 2);
989
990 s.ack(0, 0);
991 s.ack(1, 0);
992
993 let ret = s.flush(300, &sockaddr);
994 assert!(ret.is_empty());
995}
996
997#[test]
998fn send_queue_pipelines_reliable_packets_with_a_bounded_window() {
999 let mut sendq = SendQ::new(1500);
1000 let peer = "127.0.0.1:8000".parse().unwrap();
1001
1002 for index in 0..SendQ::MAX_IN_FLIGHT_PACKETS + 1 {
1003 sendq
1004 .insert(Reliability::ReliableOrdered, &[0xfe, index as u8])
1005 .unwrap();
1006 let sent = sendq.flush(0, &peer);
1007 if index < SendQ::MAX_IN_FLIGHT_PACKETS {
1008 assert_eq!(sent.len(), 1);
1009 assert_eq!(sent[0].ordered_frame_index, index as u32);
1010 } else {
1011 assert!(sent.is_empty());
1012 }
1013 }
1014
1015 assert_eq!(sendq.get_sent_queue_size(), SendQ::MAX_IN_FLIGHT_PACKETS);
1016 assert_eq!(sendq.get_reliable_queue_size(), 1);
1017
1018 sendq.ack(0, 1);
1019 let sent = sendq.flush(1, &peer);
1020 assert_eq!(sent.len(), 1);
1021 assert_eq!(
1022 sent[0].ordered_frame_index,
1023 SendQ::MAX_IN_FLIGHT_PACKETS as u32
1024 );
1025 assert_eq!(sendq.get_sent_queue_size(), SendQ::MAX_IN_FLIGHT_PACKETS);
1026 assert_eq!(sendq.get_reliable_queue_size(), 0);
1027}
1028
1029#[test]
1030fn send_queue_retransmits_immediately_after_nack() {
1031 let mut sendq = SendQ::new(1500);
1032 let peer = "127.0.0.1:8000".parse().unwrap();
1033 sendq.insert(Reliability::Reliable, &[0xfe]).unwrap();
1034
1035 let first = sendq.flush(0, &peer);
1036 assert_eq!(first.len(), 1);
1037 assert_eq!(first[0].sequence_number, 0);
1038
1039 sendq.nack(0, 1);
1040 let retransmitted = sendq.flush(1, &peer);
1041 assert_eq!(retransmitted.len(), 1);
1042 assert_eq!(retransmitted[0].sequence_number, 1);
1043}
1044
1045#[tokio::test]
1046async fn test_client_packet1() {
1047 let a = [
1048 140, 3, 0, 0, 112, 44, 192, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 254, 236,
1049 189, 203, 114, 234, 74, 183, 239, 185, 79, 175, 170, 30, 99, 159, 110, 125, 59, 36, 1, 222,
1050 166, 122, 19, 35, 97, 48, 18, 19, 161, 11, 82, 69, 197, 23, 128, 248, 38, 32, 9, 107, 218,
1051 152, 91, 69, 61, 79, 53, 234, 141, 78, 243, 52, 234, 5, 170, 119, 90, 149, 41, 165, 48, 41,
1052 11, 12, 2, 95, 214, 154, 255, 198, 47, 86, 120, 77, 15, 75, 202, 203, 24, 57, 46, 153, 249,
1053 223, 255, 199, 127, 253, 47, 255, 246, 111, 255, 229, 255, 253, 111, 255, 227, 191, 254,
1054 63, 255, 243, 191, 253, 219, 255, 249, 239, 163, 201, 96, 58, 255, 247, 255, 237, 127, 255,
1055 247, 241, 166, 53, 25, 54, 70, 211, 206, 180, 165, 152, 91, 181, 172, 221, 53, 159, 155,
1056 243, 95, 162, 215, 107, 222, 52, 125, 177, 105, 247, 61, 165, 107, 5, 205, 158, 84, 29,
1057 244, 250, 209, 111, 85, 214, 106, 166, 21, 52, 122, 91, 93, 209, 77, 165, 222, 51, 117,
1058 215, 21, 20, 197, 109, 148, 55, 166, 220, 122, 234, 216, 101, 105, 108, 43, 157, 241, 180,
1059 218, 49, 26, 250, 189, 165, 184, 243, 129, 242, 171, 50, 170, 7, 247, 109, 241, 113, 173,
1060 221, 235, 205, 225, 60, 18, 218, 226, 196, 234, 134, 186, 57, 240, 43, 83, 43, 112, 167,
1061 150, 57, 89, 13, 75, 90, 205, 146, 244, 123, 183, 46, 111, 199, 182, 176, 214, 182, 147,
1062 141, 214, 16, 187, 227, 134, 38, 247, 234, 150, 219, 107, 84, 231, 78, 201, 17, 186, 115,
1063 189, 174, 139, 154, 51, 82, 212, 210, 192, 178, 30, 13, 49, 216, 186, 179, 218, 203, 192,
1064 143, 238, 61, 177, 37, 186, 211, 234, 147, 41, 105, 91, 87, 169, 61, 142, 239, 22, 207,
1065 170, 28, 205, 199, 117, 253, 121, 32, 107, 117, 213, 119, 166, 255, 234, 62, 254, 7, 249,
1066 238, 153, 219, 111, 9, 3, 219, 141, 28, 73, 17, 92, 83, 17, 189, 198, 100, 57, 10, 3, 97,
1067 76, 190, 221, 187, 39, 127, 167, 183, 154, 186, 253, 201, 170, 57, 35, 239, 61, 235, 150,
1068 58, 117, 103, 173, 25, 242, 186, 125, 215, 138, 220, 134, 245, 226, 53, 200, 239, 90, 53,
1069 209, 9, 215, 145, 35, 44, 130, 241, 153, 109, 214, 145, 45, 117, 32, 5, 229, 177, 185, 158,
1070 121, 210, 122, 48, 154, 7, 150, 105, 107, 162, 106, 233, 146, 41, 87, 23, 61, 163, 117,
1071 167, 149, 92, 167, 83, 215, 94, 220, 70, 165, 111, 6, 214, 196, 110, 8, 37, 237, 222, 107,
1072 184, 161, 76, 191, 243, 217, 19, 149, 142, 213, 112, 55, 134, 226, 54, 29, 163, 213, 29,
1073 218, 214, 203, 72, 246, 90, 154, 31, 61, 246, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1074 15, 77, 241, 119, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1075 143, 130, 32, 178, 239, 181, 208, 233, 63, 110, 123, 91, 85, 26, 223, 221, 174, 45, 163,
1076 41, 245, 238, 107, 247, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 139, 19,
1077 58, 211, 206, 76, 150, 180, 250, 72, 234, 212, 127, 73, 154, 161, 84, 239, 126, 253, 199,
1078 63, 158, 123, 119, 119, 203, 126, 120, 247, 220, 113, 55, 245, 97, 189, 212, 172, 255, 136,
1079 30, 159, 164, 122, 255, 95, 245, 141, 220, 159, 41, 149, 169, 218, 173, 174, 5, 249, 247,
1080 83, 205, 188, 185, 81, 220, 113, 251, 229, 101, 213, 249, 245, 123, 212, 248, 71, 239, 105,
1081 48, 151, 68, 103, 32, 175, 215, 63, 220, 113, 216, 169, 252, 243, 247, 211, 118, 230, 255,
1082 179, 210, 173, 173, 123, 230, 203, 63, 170, 163, 127, 12, 52, 39, 26, 247, 158, 182, 147,
1083 113, 52, 154, 4, 75, 219, 122, 168, 223, 120, 255, 152, 223, 138, 173, 135, 122, 79, 43,
1084 245, 27, 255, 254, 191, 210, 81, 92, 214, 250, 38, 29, 197, 90, 79, 9, 74, 164, 149, 221,
1085 158, 188, 88, 218, 126, 112, 51, 152, 213, 234, 93, 50, 12, 117, 255, 89, 208, 77, 171,
1086 214, 21, 2, 217, 182, 189, 154, 110, 76, 20, 163, 177, 136, 198, 247, 129, 234, 148, 188,
1087 103, 210, 74, 21, 203, 82, 102, 158, 161, 152, 94, 80, 251, 57, 52, 253, 77, 151, 244, 139,
1088 93, 255, 181, 29, 134, 250, 139, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1089 162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1090 215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 131, 99, 121, 131, 81, 24, 45,
1091 12, 251, 177, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 231, 153, 11, 127, 104, 76,
1092 54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 182, 7, 196, 213, 210,
1093 154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1094 35, 153, 14, 228, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1095 64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 209, 137, 62, 107, 10, 228, 191, 2, 249, 125,
1096 129, 14, 232, 81, 73, 141, 155, 111, 40, 69, 68, 110, 68, 59, 60, 24, 223, 255, 72, 255,
1097 46, 249, 125, 89, 84, 233, 223, 37, 127, 107, 52, 215, 35, 55, 12, 102, 78, 95, 15, 186,
1098 125, 75, 24, 52, 170, 155, 65, 95, 175, 52, 103, 145, 48, 154, 91, 1, 253, 123, 78, 191,
1099 187, 255, 78, 165, 68, 54, 240, 73, 243, 8, 244, 119, 205, 123, 107, 58, 108, 4, 179, 158,
1100 100, 85, 232, 39, 25, 230, 196, 245, 4, 171, 102, 155, 147, 246, 80, 140, 90, 227, 240,
1101 113, 213, 21, 20, 221, 54, 221, 182, 38, 91, 74, 215, 212, 90, 186, 18, 204, 187, 166, 181,
1102 26, 26, 90, 93, 187, 91, 180, 212, 128, 40, 129, 198, 194, 232, 88, 171, 229, 80, 28, 109,
1103 92, 203, 43, 121, 115, 125, 221, 19, 162, 178, 102, 138, 174, 109, 77, 12, 215, 168, 217,
1104 186, 36, 151, 71, 164, 139, 61, 223, 26, 12, 132, 245, 114, 68, 148, 196, 64, 138, 106,
1105 166, 160, 77, 6, 210, 66, 232, 137, 122, 107, 228, 59, 226, 184, 111, 169, 35, 203, 85, 61,
1106 165, 86, 25, 247, 221, 126, 215, 94, 76, 186, 118, 180, 30, 207, 38, 91, 77, 209, 219, 61,
1107 203, 213, 186, 225, 164, 231, 206, 213, 167, 14, 153, 252, 142, 45, 170, 227, 198, 164, 57,
1108 188, 143, 30, 109, 197, 93, 147, 103, 205, 173, 251, 214, 202, 178, 221, 27, 39, 80, 250,
1109 134, 160, 210, 46, 50, 255, 53, 31, 119, 199, 195, 137, 182, 49, 141, 199, 40, 108, 191,
1110 244, 212, 222, 63, 198, 213, 255, 188, 239, 206, 102, 155, 223, 102, 235, 159, 255, 252,
1111 241, 16, 244, 194, 233, 68, 170, 7, 27, 189, 211, 250, 189, 104, 143, 255, 241, 159, 66,
1112 221, 121, 169, 73, 98, 189, 90, 107, 78, 23, 29, 229, 215, 96, 54, 27, 153, 183, 182, 223,
1113 155, 223, 55, 127, 24, 227, 219, 167, 217, 237, 188, 31, 74, 154, 226, 255, 115, 220, 169,
1114 143, 165, 231, 135, 95, 245, 217, 118, 174, 201, 134, 255, 88, 121, 92, 132, 129, 123, 251,
1115 175, 250, 204, 189, 169, 46, 138, 78, 144, 126, 109, 161, 10, 170, 240, 32, 248, 27, 83,
1116 156, 172, 6, 162, 90, 233, 223, 85, 151, 214, 182, 21, 88, 37, 79, 242, 238, 149, 118, 143,
1117 152, 10, 131, 232, 111, 91, 209, 2, 85, 113, 239, 29, 99, 178, 37, 170, 76, 210, 173, 232,
1118 201, 104, 84, 183, 230, 220, 122, 26, 248, 138, 209, 149, 148, 167, 65, 73, 111, 91, 50,
1119 249, 194, 153, 85, 241, 204, 245, 218, 242, 215, 130, 121, 31, 84, 188, 192, 171, 13, 36,
1120 165, 54, 152, 43, 55, 157, 123, 85, 176, 228, 69, 203, 242, 197, 187, 129, 210, 10, 71,
1121 155, 231, 50, 25, 45, 147, 161, 185, 46, 15, 228, 201, 243, 56, 156, 56, 214, 92, 9, 212,
1122 134, 103, 142, 230, 53, 203, 157, 71, 83, 211, 242, 126, 118, 55, 196,
1123 ];
1124
1125 let b = FrameVec::new(&a).unwrap();
1126 assert!(b.frames.len() == 1);
1127 assert!(b.frames[0].is_fragment());
1128}
1129
1130#[tokio::test]
1131async fn test_client_packet2() {
1132 let p0 = [
1134 132, 0, 0, 0, 64, 0, 144, 0, 0, 0, 9, 162, 70, 235, 28, 218, 182, 26, 192, 0, 0, 0, 0, 16,
1135 151, 43, 113, 0,
1136 ];
1137 let p1 = [
1139 132, 1, 0, 0, 64, 0, 144, 0, 0, 0, 9, 162, 70, 235, 28, 218, 182, 26, 192, 0, 0, 0, 0, 16,
1140 151, 43, 113, 0,
1141 ];
1142 let p2 = [
1144 132, 2, 0, 0, 96, 9, 64, 1, 0, 0, 0, 0, 0, 0, 19, 4, 83, 237, 234, 82, 74, 188, 6, 23, 0,
1145 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 196, 178, 112, 86, 5, 59, 97, 219, 15, 0,
1146 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 188, 210, 59, 150, 246,
1147 167, 182, 213, 33, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0,
1148 132, 194, 47, 23, 175, 46, 78, 138, 23, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128,
1149 0, 0, 0, 0, 0, 0, 136, 219, 85, 240, 191, 125, 172, 233, 10, 0, 0, 0, 6, 23, 0, 225, 138,
1150 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 80, 211, 212, 44, 191, 227, 124, 40, 13, 0, 0, 0,
1151 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 77, 13, 19, 149, 102, 140, 134,
1152 77, 16, 0, 0, 0, 4, 83, 237, 239, 254, 225, 138, 4, 63, 87, 214, 254, 225, 138, 4, 83, 236,
1153 159, 254, 225, 138, 4, 63, 87, 46, 254, 225, 138, 4, 63, 87, 56, 128, 225, 138, 4, 63, 87,
1154 56, 123, 225, 138, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255,
1155 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255,
1156 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1157 0, 0, 0, 0, 0, 16, 151, 56, 146, 0, 0, 72, 0, 0, 0, 0, 0, 16, 151, 56, 146,
1158 ];
1159 let p3 = [132, 3, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 16, 151, 56, 161];
1161 let p4 = [
1163 140, 4, 0, 0, 112, 44, 192, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 254, 236,
1164 189, 203, 114, 234, 202, 214, 239, 249, 157, 94, 85, 61, 198, 119, 186, 181, 79, 72, 2,
1165 188, 77, 245, 140, 145, 48, 24, 137, 137, 208, 5, 169, 162, 98, 7, 32, 246, 4, 36, 97, 77,
1166 155, 201, 173, 162, 158, 231, 188, 81, 53, 171, 89, 47, 80, 189, 211, 170, 148, 148, 194,
1167 164, 156, 96, 16, 248, 178, 214, 252, 55, 126, 177, 194, 107, 122, 88, 82, 94, 198, 200,
1168 113, 201, 204, 255, 231, 127, 252, 215, 255, 242, 31, 255, 241, 95, 254, 223, 255, 251,
1169 127, 252, 215, 255, 254, 63, 255, 199, 127, 252, 159, 255, 57, 154, 12, 166, 243, 255, 252,
1170 223, 254, 247, 255, 28, 111, 90, 147, 97, 99, 52, 237, 76, 91, 138, 185, 85, 203, 218, 125,
1171 243, 165, 57, 255, 41, 122, 189, 230, 77, 211, 23, 155, 118, 223, 83, 186, 86, 208, 236,
1172 73, 213, 65, 175, 31, 253, 82, 101, 173, 102, 90, 65, 163, 183, 213, 21, 221, 84, 234, 61,
1173 83, 119, 93, 65, 81, 172, 70, 107, 233, 25, 138, 210, 179, 149, 23, 79, 18, 205, 142, 41,
1174 8, 163, 134, 179, 177, 77, 87, 182, 131, 86, 121, 80, 106, 213, 135, 125, 179, 162, 139,
1175 122, 203, 241, 131, 138, 109, 4, 93, 51, 168, 173, 135, 74, 75, 29, 214, 29, 97, 104, 4,
1176 55, 222, 182, 86, 26, 205, 189, 242, 192, 127, 217, 90, 219, 174, 48, 40, 233, 115, 171,
1177 49, 105, 141, 109, 189, 63, 182, 91, 63, 70, 141, 167, 237, 120, 166, 148, 213, 173, 92,
1178 30, 110, 149, 78, 91, 12, 66, 93, 241, 5, 93, 208, 45, 45, 156, 56, 143, 130, 18, 90, 194,
1179 147, 104, 55, 116, 209, 8, 163, 103, 211, 94, 151, 134, 91, 189, 50, 174, 235, 191, 135,
1180 138, 213, 237, 218, 21, 211, 182, 252, 233, 191, 187, 79, 255, 141, 124, 247, 204, 237,
1181 183, 132, 129, 237, 70, 142, 164, 8, 174, 169, 136, 94, 99, 178, 28, 133, 129, 48, 38, 223,
1182 238, 61, 180, 68, 183, 183, 154, 186, 253, 201, 170, 57, 123, 90, 107, 179, 110, 169, 83,
1183 119, 214, 154, 33, 175, 219, 247, 173, 200, 109, 88, 191, 189, 6, 249, 93, 171, 38, 58,
1184 225, 58, 114, 132, 69, 48, 62, 179, 205, 58, 178, 165, 14, 164, 160, 60, 54, 215, 51, 79,
1185 90, 15, 70, 243, 192, 50, 109, 77, 84, 45, 93, 50, 229, 234, 162, 103, 180, 238, 181, 146,
1186 235, 116, 234, 218, 111, 183, 81, 233, 155, 129, 53, 177, 27, 66, 73, 123, 240, 26, 110,
1187 40, 139, 238, 180, 250, 226, 137, 74, 199, 106, 184, 27, 67, 113, 155, 142, 209, 234, 14,
1188 109, 235, 247, 72, 246, 90, 154, 31, 61, 245, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1189 13, 77, 241, 87, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1190 143, 130, 32, 178, 31, 180, 208, 233, 63, 109, 123, 91, 85, 26, 223, 223, 174, 45, 163, 41,
1191 245, 30, 106, 15, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 111, 39, 116,
1192 166, 157, 153, 44, 105, 245, 145, 212, 169, 255, 148, 52, 67, 169, 222, 255, 252, 111, 237,
1193 167, 127, 74, 191, 234, 254, 100, 169, 140, 42, 171, 201, 92, 173, 142, 252, 127, 77, 86,
1194 247, 77, 251, 95, 254, 175, 127, 215, 127, 223, 246, 42, 255, 26, 253, 235, 165, 108, 133,
1195 255, 246, 151, 203, 202, 211, 250, 151, 175, 12, 203, 193, 124, 221, 155, 255, 67, 126,
1196 190, 109, 253, 99, 242, 243, 95, 211, 167, 219, 187, 237, 157, 107, 254, 43, 24, 107, 81,
1197 79, 22, 171, 225, 38, 252, 183, 240, 24, 4, 255, 114, 31, 21, 213, 235, 11, 195, 81, 239,
1198 159, 253, 161, 97, 169, 222, 77, 215, 41, 173, 164, 231, 254, 68, 157, 151, 199, 131, 31,
1199 15, 51, 229, 63, 255, 215, 120, 20, 151, 181, 190, 25, 143, 98, 173, 167, 4, 37, 210, 202,
1200 110, 79, 94, 44, 109, 63, 184, 25, 204, 106, 245, 174, 165, 184, 186, 255, 34, 232, 166,
1201 85, 235, 10, 129, 108, 219, 94, 77, 55, 38, 138, 209, 88, 68, 227, 135, 64, 117, 74, 222,
1202 11, 105, 165, 138, 101, 41, 51, 50, 138, 77, 47, 168, 253, 24, 154, 254, 166, 75, 250, 197,
1203 174, 255, 220, 14, 67, 253, 183, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1204 162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1205 215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 163, 99, 121, 131, 81, 24, 45,
1206 12, 251, 169, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 239, 153, 11, 127, 104, 76,
1207 54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 190, 7, 196, 213, 210,
1208 154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1209 35, 57, 30, 200, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1210 64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 197, 19, 125, 214, 20, 200, 127, 5, 242, 251,
1211 66, 60, 160, 71, 37, 53, 105, 190, 161, 20, 17, 185, 81, 220, 225, 193, 248, 225, 46, 251,
1212 187, 228, 247, 101, 81, 141, 255, 46, 249, 91, 163, 185, 30, 185, 97, 48, 115, 250, 122,
1213 208, 237, 91, 194, 160, 81, 221, 12, 250, 122, 165, 57, 139, 132, 209, 220, 10, 226, 191,
1214 231, 244, 187, 251, 239, 84, 74, 101, 3, 159, 52, 143, 16, 255, 174, 249, 96, 77, 135, 141,
1215 96, 214, 147, 172, 74, 252, 73, 134, 57, 113, 61, 193, 170, 217, 230, 164, 61, 20, 163,
1216 214, 56, 124, 90, 117, 5, 69, 39, 10, 164, 173, 201, 150, 210, 53, 181, 150, 174, 4, 243,
1217 174, 105, 173, 134, 134, 86, 215, 238, 23, 45, 53, 208, 156, 81, 99, 97, 116, 172, 213,
1218 114, 40, 142, 54, 174, 229, 149, 188, 185, 190, 238, 9, 81, 89, 51, 69, 215, 182, 38, 134,
1219 107, 212, 108, 93, 146, 203, 35, 210, 197, 158, 111, 13, 6, 194, 122, 57, 18, 91, 226, 64,
1220 138, 106, 166, 160, 77, 6, 210, 66, 232, 17, 165, 52, 242, 29, 113, 220, 183, 212, 145,
1221 229, 170, 158, 82, 171, 140, 251, 110, 191, 107, 47, 38, 93, 59, 90, 143, 103, 147, 173,
1222 166, 232, 237, 158, 229, 106, 221, 112, 210, 115, 231, 234, 115, 135, 76, 126, 199, 22,
1223 213, 113, 99, 210, 28, 62, 68, 79, 182, 226, 174, 201, 179, 230, 214, 67, 107, 101, 217,
1224 238, 141, 19, 40, 125, 67, 80, 227, 46, 50, 255, 61, 31, 119, 199, 195, 137, 182, 49, 141,
1225 167, 40, 108, 255, 238, 169, 189, 127, 140, 171, 255, 124, 232, 206, 102, 155, 95, 102,
1226 235, 95, 255, 186, 123, 12, 122, 225, 116, 34, 213, 131, 141, 222, 105, 253, 90, 180, 199,
1227 255, 248, 167, 80, 119, 126, 215, 36, 177, 94, 173, 53, 167, 139, 142, 242, 115, 48, 155,
1228 141, 204, 91, 219, 239, 205, 31, 154, 119, 198, 248, 246, 121, 118, 59, 239, 135, 146, 166,
1229 248, 255, 26, 119, 234, 99, 233, 229, 241, 103, 125, 182, 157, 107, 178, 225, 63, 85, 158,
1230 22, 97, 224, 222, 254, 187, 62, 115, 111, 170, 139, 162, 19, 164, 95, 91, 168, 130, 42, 60,
1231 10, 254, 198, 20, 39, 171, 129, 168, 86, 250, 247, 213, 165, 181, 109, 5, 86, 201, 147,
1232 188, 7, 165, 221, 35, 166, 194, 176, 2, 215, 86, 180, 64, 85, 220, 7, 199, 152, 108, 137,
1233 42, 147, 116, 43, 122, 54, 26, 213, 173, 57, 183, 158, 7, 190, 98, 116, 37, 229, 153, 168,
1234 243, 182, 37, 147, 47, 156, 89, 21, 207, 92, 175, 45, 127, 45, 152, 15, 65, 197, 11, 188,
1235 218, 64, 82, 106, 131, 185, 114, 211, 121, 80, 5, 75, 94, 180, 44, 95, 188, 31, 40, 173,
1236 112, 180, 121, 41, 147, 209, 50, 25, 154, 235, 242, 64, 158, 188, 140, 137, 154, 183, 230,
1237 74, 160, 54, 60, 115, 52, 175, 89, 238, 60, 154, 154, 150, 247, 163, 187,
1238 ];
1239 let p5 = [
1241 140, 5, 0, 0, 96, 9, 64, 1, 0, 0, 0, 0, 0, 0, 19, 4, 83, 237, 234, 82, 74, 188, 6, 23, 0,
1242 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 196, 178, 112, 86, 5, 59, 97, 219, 15, 0,
1243 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 188, 210, 59, 150, 246,
1244 167, 182, 213, 33, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0,
1245 132, 194, 47, 23, 175, 46, 78, 138, 23, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128,
1246 0, 0, 0, 0, 0, 0, 136, 219, 85, 240, 191, 125, 172, 233, 10, 0, 0, 0, 6, 23, 0, 225, 138,
1247 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 80, 211, 212, 44, 191, 227, 124, 40, 13, 0, 0, 0,
1248 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 77, 13, 19, 149, 102, 140, 134,
1249 77, 16, 0, 0, 0, 4, 83, 237, 239, 254, 225, 138, 4, 63, 87, 214, 254, 225, 138, 4, 83, 236,
1250 159, 254, 225, 138, 4, 63, 87, 46, 254, 225, 138, 4, 63, 87, 56, 128, 225, 138, 4, 63, 87,
1251 56, 123, 225, 138, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255,
1252 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255,
1253 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1254 0, 0, 0, 0, 0, 16, 151, 56, 146,
1255 ];
1256 let p6 = [
1258 140, 6, 0, 0, 112, 44, 192, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 254, 236,
1259 189, 203, 114, 234, 202, 214, 239, 249, 157, 94, 85, 61, 198, 119, 186, 181, 79, 72, 2,
1260 188, 77, 245, 140, 145, 48, 24, 137, 137, 208, 5, 169, 162, 98, 7, 32, 246, 4, 36, 97, 77,
1261 155, 201, 173, 162, 158, 231, 188, 81, 53, 171, 89, 47, 80, 189, 211, 170, 148, 148, 194,
1262 164, 156, 96, 16, 248, 178, 214, 252, 55, 126, 177, 194, 107, 122, 88, 82, 94, 198, 200,
1263 113, 201, 204, 255, 231, 127, 252, 215, 255, 242, 31, 255, 241, 95, 254, 223, 255, 251,
1264 127, 252, 215, 255, 254, 63, 255, 199, 127, 252, 159, 255, 57, 154, 12, 166, 243, 255, 252,
1265 223, 254, 247, 255, 28, 111, 90, 147, 97, 99, 52, 237, 76, 91, 138, 185, 85, 203, 218, 125,
1266 243, 165, 57, 255, 41, 122, 189, 230, 77, 211, 23, 155, 118, 223, 83, 186, 86, 208, 236,
1267 73, 213, 65, 175, 31, 253, 82, 101, 173, 102, 90, 65, 163, 183, 213, 21, 221, 84, 234, 61,
1268 83, 119, 93, 65, 81, 172, 70, 107, 233, 25, 138, 210, 179, 149, 23, 79, 18, 205, 142, 41,
1269 8, 163, 134, 179, 177, 77, 87, 182, 131, 86, 121, 80, 106, 213, 135, 125, 179, 162, 139,
1270 122, 203, 241, 131, 138, 109, 4, 93, 51, 168, 173, 135, 74, 75, 29, 214, 29, 97, 104, 4,
1271 55, 222, 182, 86, 26, 205, 189, 242, 192, 127, 217, 90, 219, 174, 48, 40, 233, 115, 171,
1272 49, 105, 141, 109, 189, 63, 182, 91, 63, 70, 141, 167, 237, 120, 166, 148, 213, 173, 92,
1273 30, 110, 149, 78, 91, 12, 66, 93, 241, 5, 93, 208, 45, 45, 156, 56, 143, 130, 18, 90, 194,
1274 147, 104, 55, 116, 209, 8, 163, 103, 211, 94, 151, 134, 91, 189, 50, 174, 235, 191, 135,
1275 138, 213, 237, 218, 21, 211, 182, 252, 233, 191, 187, 79, 255, 141, 124, 247, 204, 237,
1276 183, 132, 129, 237, 70, 142, 164, 8, 174, 169, 136, 94, 99, 178, 28, 133, 129, 48, 38, 223,
1277 238, 61, 180, 68, 183, 183, 154, 186, 253, 201, 170, 57, 123, 90, 107, 179, 110, 169, 83,
1278 119, 214, 154, 33, 175, 219, 247, 173, 200, 109, 88, 191, 189, 6, 249, 93, 171, 38, 58,
1279 225, 58, 114, 132, 69, 48, 62, 179, 205, 58, 178, 165, 14, 164, 160, 60, 54, 215, 51, 79,
1280 90, 15, 70, 243, 192, 50, 109, 77, 84, 45, 93, 50, 229, 234, 162, 103, 180, 238, 181, 146,
1281 235, 116, 234, 218, 111, 183, 81, 233, 155, 129, 53, 177, 27, 66, 73, 123, 240, 26, 110,
1282 40, 139, 238, 180, 250, 226, 137, 74, 199, 106, 184, 27, 67, 113, 155, 142, 209, 234, 14,
1283 109, 235, 247, 72, 246, 90, 154, 31, 61, 245, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1284 13, 77, 241, 87, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1285 143, 130, 32, 178, 31, 180, 208, 233, 63, 109, 123, 91, 85, 26, 223, 223, 174, 45, 163, 41,
1286 245, 30, 106, 15, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 111, 39, 116,
1287 166, 157, 153, 44, 105, 245, 145, 212, 169, 255, 148, 52, 67, 169, 222, 255, 252, 111, 237,
1288 167, 127, 74, 191, 234, 254, 100, 169, 140, 42, 171, 201, 92, 173, 142, 252, 127, 77, 86,
1289 247, 77, 251, 95, 254, 175, 127, 215, 127, 223, 246, 42, 255, 26, 253, 235, 165, 108, 133,
1290 255, 246, 151, 203, 202, 211, 250, 151, 175, 12, 203, 193, 124, 221, 155, 255, 67, 126,
1291 190, 109, 253, 99, 242, 243, 95, 211, 167, 219, 187, 237, 157, 107, 254, 43, 24, 107, 81,
1292 79, 22, 171, 225, 38, 252, 183, 240, 24, 4, 255, 114, 31, 21, 213, 235, 11, 195, 81, 239,
1293 159, 253, 161, 97, 169, 222, 77, 215, 41, 173, 164, 231, 254, 68, 157, 151, 199, 131, 31,
1294 15, 51, 229, 63, 255, 215, 120, 20, 151, 181, 190, 25, 143, 98, 173, 167, 4, 37, 210, 202,
1295 110, 79, 94, 44, 109, 63, 184, 25, 204, 106, 245, 174, 165, 184, 186, 255, 34, 232, 166,
1296 85, 235, 10, 129, 108, 219, 94, 77, 55, 38, 138, 209, 88, 68, 227, 135, 64, 117, 74, 222,
1297 11, 105, 165, 138, 101, 41, 51, 50, 138, 77, 47, 168, 253, 24, 154, 254, 166, 75, 250, 197,
1298 174, 255, 220, 14, 67, 253, 183, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1299 162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1300 215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 163, 99, 121, 131, 81, 24, 45,
1301 12, 251, 169, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 239, 153, 11, 127, 104, 76,
1302 54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 190, 7, 196, 213, 210,
1303 154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1304 35, 57, 30, 200, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1305 64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 197, 19, 125, 214, 20, 200, 127, 5, 242, 251,
1306 66, 60, 160, 71, 37, 53, 105, 190, 161, 20, 17, 185, 81, 220, 225, 193, 248, 225, 46, 251,
1307 187, 228, 247, 101, 81, 141, 255, 46, 249, 91, 163, 185, 30, 185, 97, 48, 115, 250, 122,
1308 208, 237, 91, 194, 160, 81, 221, 12, 250, 122, 165, 57, 139, 132, 209, 220, 10, 226, 191,
1309 231, 244, 187, 251, 239, 84, 74, 101, 3, 159, 52, 143, 16, 255, 174, 249, 96, 77, 135, 141,
1310 96, 214, 147, 172, 74, 252, 73, 134, 57, 113, 61, 193, 170, 217, 230, 164, 61, 20, 163,
1311 214, 56, 124, 90, 117, 5, 69, 39, 10, 164, 173, 201, 150, 210, 53, 181, 150, 174, 4, 243,
1312 174, 105, 173, 134, 134, 86, 215, 238, 23, 45, 53, 208, 156, 81, 99, 97, 116, 172, 213,
1313 114, 40, 142, 54, 174, 229, 149, 188, 185, 190, 238, 9, 81, 89, 51, 69, 215, 182, 38, 134,
1314 107, 212, 108, 93, 146, 203, 35, 210, 197, 158, 111, 13, 6, 194, 122, 57, 18, 91, 226, 64,
1315 138, 106, 166, 160, 77, 6, 210, 66, 232, 17, 165, 52, 242, 29, 113, 220, 183, 212, 145,
1316 229, 170, 158, 82, 171, 140, 251, 110, 191, 107, 47, 38, 93, 59, 90, 143, 103, 147, 173,
1317 166, 232, 237, 158, 229, 106, 221, 112, 210, 115, 231, 234, 115, 135, 76, 126, 199, 22,
1318 213, 113, 99, 210, 28, 62, 68, 79, 182, 226, 174, 201, 179, 230, 214, 67, 107, 101, 217,
1319 238, 141, 19, 40, 125, 67, 80, 227, 46, 50, 255, 61, 31, 119, 199, 195, 137, 182, 49, 141,
1320 167, 40, 108, 255, 238, 169, 189, 127, 140, 171, 255, 124, 232, 206, 102, 155, 95, 102,
1321 235, 95, 255, 186, 123, 12, 122, 225, 116, 34, 213, 131, 141, 222, 105, 253, 90, 180, 199,
1322 255, 248, 167, 80, 119, 126, 215, 36, 177, 94, 173, 53, 167, 139, 142, 242, 115, 48, 155,
1323 141, 204, 91, 219, 239, 205, 31, 154, 119, 198, 248, 246, 121, 118, 59, 239, 135, 146, 166,
1324 248, 255, 26, 119, 234, 99, 233, 229, 241, 103, 125, 182, 157, 107, 178, 225, 63, 85, 158,
1325 22, 97, 224, 222, 254, 187, 62, 115, 111, 170, 139, 162, 19, 164, 95, 91, 168, 130, 42, 60,
1326 10, 254, 198, 20, 39, 171, 129, 168, 86, 250, 247, 213, 165, 181, 109, 5, 86, 201, 147,
1327 188, 7, 165, 221, 35, 166, 194, 176, 2, 215, 86, 180, 64, 85, 220, 7, 199, 152, 108, 137,
1328 42, 147, 116, 43, 122, 54, 26, 213, 173, 57, 183, 158, 7, 190, 98, 116, 37, 229, 153, 168,
1329 243, 182, 37, 147, 47, 156, 89, 21, 207, 92, 175, 45, 127, 45, 152, 15, 65, 197, 11, 188,
1330 218, 64, 82, 106, 131, 185, 114, 211, 121, 80, 5, 75, 94, 180, 44, 95, 188, 31, 40, 173,
1331 112, 180, 121, 41, 147, 209, 50, 25, 154, 235, 242, 64, 158, 188, 140, 137, 154, 183, 230,
1332 74, 160, 54, 60, 115, 52, 175, 89, 238, 60, 154, 154, 150, 247, 163, 187,
1333 ];
1334 let ps: Vec<Vec<u8>> = vec![
1335 p0.to_vec(),
1336 p1.to_vec(),
1337 p2.to_vec(),
1338 p3.to_vec(),
1339 p4.to_vec(),
1340 p5.to_vec(),
1341 p6.to_vec(),
1342 ];
1343
1344 let mut n = 0;
1345
1346 let mut rq = RecvQ::new();
1347 for i in ps {
1348 let v = FrameVec::new(&i).unwrap();
1349 for i in v.frames {
1350 rq.insert(i).unwrap();
1351 if !rq.flush(&"0.0.0.0:0".parse().unwrap()).is_empty() {
1352 n += 1;
1353 }
1354 }
1355 }
1356
1357 assert!(n == 5);
1358}