use crate::error::AnamnesisError;
use crate::parse::gguf::GgufType;
use crate::remember::fp8::f32_bits_to_bf16_bits;
use iq_grids::{
IQ1S_DELTA, IQ1S_GRID, IQ2S_GRID, IQ2XS_GRID, IQ2XXS_GRID, IQ3S_GRID, IQ3XXS_GRID, KMASK_IQ2XS,
KSIGNS_IQ2XS,
};
const QK_SMALL: usize = 32;
const QK_K: usize = 256;
const POW3_TQ1_0: [u8; 6] = [1, 3, 9, 27, 81, 243];
const K_VALUES_IQ4_NL: [i8; 16] = [
-127, -104, -83, -65, -49, -35, -22, -10, 1, 13, 25, 38, 53, 69, 89, 113,
];
const K_VALUES_MXFP4: [i8; 16] = [0, 1, 2, 3, 4, 6, 8, 12, 0, -1, -2, -3, -4, -6, -8, -12];
#[inline]
fn read_f16_bytes(bytes: [u8; 2]) -> f32 {
f32::from(half::f16::from_le_bytes(bytes))
}
#[inline]
fn read_f32_bytes(bytes: [u8; 4]) -> f32 {
f32::from_le_bytes(bytes)
}
#[inline]
fn e8m0_to_fp32_half(e: u8) -> f32 {
let bits: u32 = if e < 2 {
0x0020_0000_u32 << u32::from(e)
} else {
(u32::from(e) - 1) << 23
};
f32::from_bits(bits)
}
#[inline]
#[allow(clippy::as_conversions, clippy::cast_possible_wrap)]
fn iq1s_grid_as_i8(packed: u64) -> [i8; 8] {
packed.to_le_bytes().map(|b| b as i8)
}
#[inline]
#[allow(clippy::indexing_slicing)]
fn read_scales12(block: &[u8], offset: usize) -> [u8; 12] {
[
block[offset],
block[offset + 1],
block[offset + 2],
block[offset + 3],
block[offset + 4],
block[offset + 5],
block[offset + 6],
block[offset + 7],
block[offset + 8],
block[offset + 9],
block[offset + 10],
block[offset + 11],
]
}
#[inline]
fn write_scratch_to_bf16(scratch: &[f32], out_block: &mut [u8]) {
for (&val, out_pair) in scratch.iter().zip(out_block.chunks_exact_mut(2)) {
let bf16 = f32_bits_to_bf16_bits(val.to_bits());
out_pair.copy_from_slice(&bf16.to_le_bytes());
}
}
fn validate_dequant_input(data: &[u8], dtype: GgufType, n_elements: usize) -> crate::Result<usize> {
let block_size = dtype.block_size();
if !n_elements.is_multiple_of(block_size) {
return Err(AnamnesisError::Parse {
reason: format!(
"GGUF dequant: n_elements {n_elements} is not a multiple of block size \
{block_size} for {dtype}"
),
});
}
let out_byte_len = n_elements
.checked_mul(2)
.ok_or_else(|| AnamnesisError::Parse {
reason: format!("GGUF dequant: output byte length {n_elements}×2 overflows usize"),
})?;
let n_blocks = n_elements / block_size;
let type_size = dtype
.type_size()
.ok_or_else(|| AnamnesisError::Unsupported {
format: "GGUF".into(),
detail: format!("dequantisation not yet supported for {dtype}"),
})?;
let expected_bytes = n_blocks
.checked_mul(type_size)
.ok_or_else(|| AnamnesisError::Parse {
reason: "GGUF dequant: expected byte count overflows usize".into(),
})?;
if data.len() != expected_bytes {
return Err(AnamnesisError::Parse {
reason: format!(
"GGUF dequant: data length {} != expected {expected_bytes} for \
{n_blocks} blocks of {dtype}",
data.len()
),
});
}
Ok(out_byte_len)
}
#[inline]
fn run_legacy_kernel<F, P>(
data: &[u8],
type_size: usize,
mut sink: F,
mut unpack: P,
) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
P: FnMut(&[u8], &mut [f32; QK_SMALL]),
{
let mut scratch = [0.0_f32; QK_SMALL];
let mut block_out = [0u8; QK_SMALL * 2];
for in_block in data.chunks_exact(type_size) {
unpack(in_block, &mut scratch);
write_scratch_to_bf16(&scratch, &mut block_out);
sink(&block_out)?;
}
Ok(())
}
#[inline]
fn run_super_kernel<F, P>(
data: &[u8],
type_size: usize,
mut sink: F,
mut unpack: P,
) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
P: FnMut(&[u8], &mut [f32; QK_K]),
{
let mut scratch = [0.0_f32; QK_K];
let mut block_out = [0u8; QK_K * 2];
for in_block in data.chunks_exact(type_size) {
unpack(in_block, &mut scratch);
write_scratch_to_bf16(&scratch, &mut block_out);
sink(&block_out)?;
}
Ok(())
}
fn dispatch_streaming<F>(data: &[u8], dtype: GgufType, sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
#[allow(clippy::wildcard_enum_match_arm)]
match dtype {
GgufType::Q4_0 => dequant_q4_0(data, sink),
GgufType::Q4_1 => dequant_q4_1(data, sink),
GgufType::Q5_0 => dequant_q5_0(data, sink),
GgufType::Q5_1 => dequant_q5_1(data, sink),
GgufType::Q8_0 => dequant_q8_0(data, sink),
GgufType::Q8_1 => dequant_q8_1(data, sink),
GgufType::Q2_K => dequant_q2_k(data, sink),
GgufType::Q3_K => dequant_q3_k(data, sink),
GgufType::Q4_K => dequant_q4_k(data, sink),
GgufType::Q5_K => dequant_q5_k(data, sink),
GgufType::Q6_K => dequant_q6_k(data, sink),
GgufType::Q8_K => dequant_q8_k(data, sink),
GgufType::IQ4_NL => dequant_iq4_nl(data, sink),
GgufType::IQ4_XS => dequant_iq4_xs(data, sink),
GgufType::IQ2_XXS => dequant_iq2_xxs(data, sink),
GgufType::IQ2_XS => dequant_iq2_xs(data, sink),
GgufType::IQ2_S => dequant_iq2_s(data, sink),
GgufType::IQ3_XXS => dequant_iq3_xxs(data, sink),
GgufType::IQ3_S => dequant_iq3_s(data, sink),
GgufType::IQ1_S => dequant_iq1_s(data, sink),
GgufType::IQ1_M => dequant_iq1_m(data, sink),
GgufType::TQ1_0 => dequant_tq1_0(data, sink),
GgufType::TQ2_0 => dequant_tq2_0(data, sink),
GgufType::MXFP4 => dequant_mxfp4(data, sink),
_ => Err(AnamnesisError::Unsupported {
format: "GGUF".into(),
detail: format!("dequantisation not yet supported for {dtype}"),
}),
}
}
pub fn dequantize_gguf_to_bf16(
data: &[u8],
dtype: GgufType,
n_elements: usize,
) -> crate::Result<Vec<u8>> {
if n_elements == 0 {
return Ok(Vec::new());
}
let out_byte_len = validate_dequant_input(data, dtype, n_elements)?;
let mut out: Vec<u8> = Vec::with_capacity(out_byte_len);
dispatch_streaming(data, dtype, |block_out| {
out.extend_from_slice(block_out);
Ok(())
})?;
Ok(out)
}
pub fn dequantize_gguf_blocks_to_bf16<F>(
data: &[u8],
dtype: GgufType,
n_elements: usize,
sink: F,
) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
if n_elements == 0 {
return Ok(());
}
let _ = validate_dequant_input(data, dtype, n_elements)?;
dispatch_streaming(data, dtype, sink)
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_precision_loss
)]
fn dequant_q4_0<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_legacy_kernel(data, 18, sink, |in_block, scratch| {
let d = read_f16_bytes([in_block[0], in_block[1]]);
for j in 0..16 {
let lo = i32::from(in_block[2 + j] & 0x0F) - 8;
let hi = i32::from(in_block[2 + j] >> 4) - 8;
scratch[j] = lo as f32 * d;
scratch[j + 16] = hi as f32 * d;
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_precision_loss
)]
fn dequant_q4_1<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_legacy_kernel(data, 20, sink, |in_block, scratch| {
let d = read_f16_bytes([in_block[0], in_block[1]]);
let m = read_f16_bytes([in_block[2], in_block[3]]);
for j in 0..16 {
let lo = i32::from(in_block[4 + j] & 0x0F);
let hi = i32::from(in_block[4 + j] >> 4);
scratch[j] = lo as f32 * d + m;
scratch[j + 16] = hi as f32 * d + m;
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_possible_truncation,
clippy::cast_possible_wrap,
clippy::cast_precision_loss
)]
fn dequant_q5_0<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_legacy_kernel(data, 22, sink, |in_block, scratch| {
let d = read_f16_bytes([in_block[0], in_block[1]]);
let qh = u32::from_le_bytes([in_block[2], in_block[3], in_block[4], in_block[5]]);
for j in 0..16 {
let j_u32 = j as u32;
let xh_0 = ((qh >> j_u32) << 4) & 0x10;
let xh_1 = (qh >> (j_u32 + 12)) & 0x10;
let x0 = (i32::from(in_block[6 + j] & 0x0F) | xh_0 as i32) - 16;
let x1 = (i32::from(in_block[6 + j] >> 4) | xh_1 as i32) - 16;
scratch[j] = x0 as f32 * d;
scratch[j + 16] = x1 as f32 * d;
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_possible_truncation,
clippy::cast_possible_wrap,
clippy::cast_precision_loss
)]
fn dequant_q5_1<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_legacy_kernel(data, 24, sink, |in_block, scratch| {
let d = read_f16_bytes([in_block[0], in_block[1]]);
let m = read_f16_bytes([in_block[2], in_block[3]]);
let qh = u32::from_le_bytes([in_block[4], in_block[5], in_block[6], in_block[7]]);
for j in 0..16 {
let j_u32 = j as u32;
let xh_0 = ((qh >> j_u32) << 4) & 0x10;
let xh_1 = (qh >> (j_u32 + 12)) & 0x10;
let x0 = i32::from(in_block[8 + j] & 0x0F) | xh_0 as i32;
let x1 = i32::from(in_block[8 + j] >> 4) | xh_1 as i32;
scratch[j] = x0 as f32 * d + m;
scratch[j + 16] = x1 as f32 * d + m;
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_possible_wrap
)]
fn dequant_q8_0<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_legacy_kernel(data, 34, sink, |in_block, scratch| {
let d = read_f16_bytes([in_block[0], in_block[1]]);
for j in 0..QK_SMALL {
let signed = in_block[2 + j] as i8;
scratch[j] = f32::from(signed) * d;
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_possible_wrap
)]
fn dequant_q8_1<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_legacy_kernel(data, 36, sink, |in_block, scratch| {
let d = read_f16_bytes([in_block[0], in_block[1]]);
for j in 0..QK_SMALL {
let signed = in_block[4 + j] as i8;
scratch[j] = f32::from(signed) * d;
}
})
}
#[allow(clippy::indexing_slicing)]
fn dequant_iq4_nl<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_legacy_kernel(data, 18, sink, |in_block, scratch| {
let d = read_f16_bytes([in_block[0], in_block[1]]);
for j in 0..16 {
let lo = K_VALUES_IQ4_NL[usize::from(in_block[2 + j] & 0x0F)];
let hi = K_VALUES_IQ4_NL[usize::from(in_block[2 + j] >> 4)];
scratch[j] = f32::from(lo) * d;
scratch[j + 16] = f32::from(hi) * d;
}
})
}
#[allow(clippy::indexing_slicing)]
fn dequant_mxfp4<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_legacy_kernel(data, 17, sink, |in_block, scratch| {
let d = e8m0_to_fp32_half(in_block[0]);
for j in 0..16 {
let lo = K_VALUES_MXFP4[usize::from(in_block[1 + j] & 0x0F)];
let hi = K_VALUES_MXFP4[usize::from(in_block[1 + j] >> 4)];
scratch[j] = f32::from(lo) * d;
scratch[j + 16] = f32::from(hi) * d;
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_possible_wrap
)]
fn dequant_q8_k<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_super_kernel(data, 292, sink, |in_block, scratch| {
let d = read_f32_bytes([in_block[0], in_block[1], in_block[2], in_block[3]]);
for j in 0..QK_K {
let signed = in_block[4 + j] as i8;
scratch[j] = f32::from(signed) * d;
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_precision_loss
)]
fn dequant_q2_k<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_super_kernel(data, 84, sink, |in_block, scratch| {
let scales = &in_block[0..16];
let qs = &in_block[16..80];
let d = read_f16_bytes([in_block[80], in_block[81]]);
let dmin = read_f16_bytes([in_block[82], in_block[83]]);
let mut is: usize = 0;
let mut y_off: usize = 0;
let mut q_off: usize = 0;
for _n in 0..2 {
let mut shift: u32 = 0;
for _j in 0..4 {
let sc_a = scales[is];
is += 1;
let dl_a = d * f32::from(sc_a & 0x0F);
let ml_a = dmin * f32::from(sc_a >> 4);
for l in 0..16 {
let q2 = i32::from((qs[q_off + l] >> shift) & 0x03);
scratch[y_off + l] = dl_a * (q2 as f32) - ml_a;
}
let sc_b = scales[is];
is += 1;
let dl_b = d * f32::from(sc_b & 0x0F);
let ml_b = dmin * f32::from(sc_b >> 4);
for l in 0..16 {
let q2 = i32::from((qs[q_off + l + 16] >> shift) & 0x03);
scratch[y_off + l + 16] = dl_b * (q2 as f32) - ml_b;
}
y_off += 32;
shift += 2;
}
q_off += 32;
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_precision_loss
)]
fn dequant_q3_k<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_super_kernel(data, 110, sink, |in_block, scratch| {
let hmask = &in_block[0..32];
let qs = &in_block[32..96];
let packed_scales = read_scales12(in_block, 96);
let d_all = read_f16_bytes([in_block[108], in_block[109]]);
let scales = q3_k_unpack_scales(&packed_scales);
let mut is: usize = 0;
let mut y_off: usize = 0;
let mut q_off: usize = 0;
let mut m: u8 = 1;
for _n in 0..2 {
let mut shift: u32 = 0;
for _j in 0..4 {
let sc_a = scales[is];
is += 1;
let dl_a = d_all * (f32::from(sc_a) - 32.0);
for l in 0..16 {
let q2 = i32::from((qs[q_off + l] >> shift) & 0x03);
let hi = i32::from(hmask[l] & m == 0) * 4;
scratch[y_off + l] = dl_a * ((q2 - hi) as f32);
}
let sc_b = scales[is];
is += 1;
let dl_b = d_all * (f32::from(sc_b) - 32.0);
for l in 0..16 {
let q2 = i32::from((qs[q_off + l + 16] >> shift) & 0x03);
let hi = i32::from(hmask[l + 16] & m == 0) * 4;
scratch[y_off + l + 16] = dl_b * ((q2 - hi) as f32);
}
y_off += 32;
shift += 2;
m <<= 1;
}
q_off += 32;
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_precision_loss
)]
fn dequant_q4_k<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_super_kernel(data, 144, sink, |in_block, scratch| {
let d = read_f16_bytes([in_block[0], in_block[1]]);
let dmin = read_f16_bytes([in_block[2], in_block[3]]);
let scales = read_scales12(in_block, 4);
let qs = &in_block[16..144];
let mut is: usize = 0;
let mut y_off: usize = 0;
let mut q_off: usize = 0;
for _j in 0..4 {
let (sc_lo, min_lo) = get_scale_min_k4(is, &scales);
let (sc_hi, min_hi) = get_scale_min_k4(is + 1, &scales);
let d_lo = d * f32::from(sc_lo);
let off_lo = dmin * f32::from(min_lo);
let d_hi = d * f32::from(sc_hi);
let off_hi = dmin * f32::from(min_hi);
for l in 0..32 {
let lo = i32::from(qs[q_off + l] & 0x0F);
let hi = i32::from(qs[q_off + l] >> 4);
scratch[y_off + l] = d_lo * (lo as f32) - off_lo;
scratch[y_off + l + 32] = d_hi * (hi as f32) - off_hi;
}
q_off += 32;
y_off += 64;
is += 2;
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_precision_loss
)]
fn dequant_q5_k<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_super_kernel(data, 176, sink, |in_block, scratch| {
let d = read_f16_bytes([in_block[0], in_block[1]]);
let dmin = read_f16_bytes([in_block[2], in_block[3]]);
let scales = read_scales12(in_block, 4);
let qh = &in_block[16..48];
let ql = &in_block[48..176];
let mut is: usize = 0;
let mut y_off: usize = 0;
let mut q_off: usize = 0;
let mut u1: u8 = 1;
let mut u2: u8 = 2;
for _j in 0..4 {
let (sc_lo, min_lo) = get_scale_min_k4(is, &scales);
let (sc_hi, min_hi) = get_scale_min_k4(is + 1, &scales);
let d_lo = d * f32::from(sc_lo);
let off_lo = dmin * f32::from(min_lo);
let d_hi = d * f32::from(sc_hi);
let off_hi = dmin * f32::from(min_hi);
for l in 0..32 {
let lo = i32::from(ql[q_off + l] & 0x0F) + i32::from(qh[l] & u1 != 0) * 16;
let hi = i32::from(ql[q_off + l] >> 4) + i32::from(qh[l] & u2 != 0) * 16;
scratch[y_off + l] = d_lo * (lo as f32) - off_lo;
scratch[y_off + l + 32] = d_hi * (hi as f32) - off_hi;
}
q_off += 32;
y_off += 64;
is += 2;
u1 <<= 2;
u2 <<= 2;
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::similar_names,
clippy::as_conversions,
clippy::cast_possible_wrap,
clippy::cast_precision_loss
)]
fn dequant_q6_k<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_super_kernel(data, 210, sink, |in_block, scratch| {
let ql_all = &in_block[0..128];
let qh_all = &in_block[128..192];
let sc_all = &in_block[192..208];
let d = read_f16_bytes([in_block[208], in_block[209]]);
let mut y_off: usize = 0;
let mut ql_off: usize = 0;
let mut qh_off: usize = 0;
let mut sc_off: usize = 0;
for _n in 0..2 {
for l in 0..32 {
let is = l / 16;
let q1 =
i32::from((ql_all[ql_off + l] & 0x0F) | ((qh_all[qh_off + l] & 0x03) << 4))
- 32;
let q2 = i32::from(
(ql_all[ql_off + l + 32] & 0x0F) | (((qh_all[qh_off + l] >> 2) & 0x03) << 4),
) - 32;
let q3 = i32::from(
(ql_all[ql_off + l] >> 4) | (((qh_all[qh_off + l] >> 4) & 0x03) << 4),
) - 32;
let q4 = i32::from(
(ql_all[ql_off + l + 32] >> 4) | (((qh_all[qh_off + l] >> 6) & 0x03) << 4),
) - 32;
let s0 = sc_all[sc_off + is] as i8;
let s2 = sc_all[sc_off + is + 2] as i8;
let s4 = sc_all[sc_off + is + 4] as i8;
let s6 = sc_all[sc_off + is + 6] as i8;
scratch[y_off + l] = d * f32::from(s0) * (q1 as f32);
scratch[y_off + l + 32] = d * f32::from(s2) * (q2 as f32);
scratch[y_off + l + 64] = d * f32::from(s4) * (q3 as f32);
scratch[y_off + l + 96] = d * f32::from(s6) * (q4 as f32);
}
y_off += 128;
ql_off += 64;
qh_off += 32;
sc_off += 8;
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_precision_loss,
clippy::cast_possible_truncation
)]
fn dequant_iq4_xs<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_super_kernel(data, 136, sink, |in_block, scratch| {
let d = read_f16_bytes([in_block[0], in_block[1]]);
let scales_h = u16::from_le_bytes([in_block[2], in_block[3]]);
let scales_l = [in_block[4], in_block[5], in_block[6], in_block[7]];
let qs = &in_block[8..136];
let mut y_off: usize = 0;
let mut q_off: usize = 0;
for ib in 0..8 {
let ib_u32 = ib as u32;
let sc_lo = (scales_l[ib / 2] >> (4 * (ib_u32 % 2))) & 0x0F;
let sc_hi = (scales_h >> (2 * ib_u32)) & 0x03;
let ls = i32::from(sc_lo) | (i32::from(sc_hi) << 4);
let dl = d * ((ls - 32) as f32);
for j in 0..16 {
let lo = K_VALUES_IQ4_NL[usize::from(qs[q_off + j] & 0x0F)];
let hi = K_VALUES_IQ4_NL[usize::from(qs[q_off + j] >> 4)];
scratch[y_off + j] = dl * f32::from(lo);
scratch[y_off + j + 16] = dl * f32::from(hi);
}
q_off += 16;
y_off += 32;
}
})
}
#[inline]
#[allow(clippy::indexing_slicing)]
fn write_signed_grid(scratch: &mut [f32], y_off: usize, dl: f32, grid: [u8; 8], signs: u8) {
for j in 0..8 {
let sign_bit = f32::from(u8::from(signs & KMASK_IQ2XS[j] != 0));
let sign = 1.0 - 2.0 * sign_bit;
scratch[y_off + j] = dl * f32::from(grid[j]) * sign;
}
}
#[inline]
#[allow(clippy::indexing_slicing)]
fn write_delta_grid(scratch: &mut [f32], y_off: usize, dl: f32, grid: [i8; 8], delta: f32) {
for j in 0..8 {
scratch[y_off + j] = dl * (f32::from(grid[j]) + delta);
}
}
#[inline]
#[allow(
clippy::as_conversions,
clippy::cast_possible_truncation,
clippy::cast_possible_wrap
)]
fn decode_pow3_ternary(packed: u8, pow3_n: u8, d: f32) -> f32 {
let q = packed.wrapping_mul(pow3_n);
let xi = ((u16::from(q) * 3) >> 8) as i16;
f32::from(xi - 1) * d
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_precision_loss,
clippy::cast_possible_truncation
)]
fn dequant_iq2_xxs<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_super_kernel(data, 66, sink, |in_block, scratch| {
let d = read_f16_bytes([in_block[0], in_block[1]]);
let qs = &in_block[2..66];
let mut y_off: usize = 0;
for ib32 in 0..8 {
let base = 8 * ib32;
let aux32_0 = u32::from_le_bytes([qs[base], qs[base + 1], qs[base + 2], qs[base + 3]]);
let aux32_1 =
u32::from_le_bytes([qs[base + 4], qs[base + 5], qs[base + 6], qs[base + 7]]);
let aux8 = aux32_0.to_le_bytes();
let db = d * (0.5 + ((aux32_1 >> 28) as f32)) * 0.25;
for l in 0..4 {
let grid = IQ2XXS_GRID[usize::from(aux8[l])].to_le_bytes();
let l_u32 = l as u32;
let signs = KSIGNS_IQ2XS[((aux32_1 >> (7 * l_u32)) & 0x7F) as usize];
write_signed_grid(scratch, y_off, db, grid, signs);
y_off += 8;
}
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_precision_loss,
clippy::needless_range_loop
)]
fn dequant_iq2_xs<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_super_kernel(data, 74, sink, |in_block, scratch| {
let d = read_f16_bytes([in_block[0], in_block[1]]);
let qs = &in_block[2..66];
let scales = &in_block[66..74];
let mut y_off: usize = 0;
for ib32 in 0..8 {
let db0 = d * (0.5 + f32::from(scales[ib32] & 0x0F)) * 0.25;
let db1 = d * (0.5 + f32::from(scales[ib32] >> 4)) * 0.25;
for l in 0..4 {
let word_off = 8 * ib32 + 2 * l;
let word = u16::from_le_bytes([qs[word_off], qs[word_off + 1]]);
let grid = IQ2XS_GRID[usize::from(word & 0x01FF)].to_le_bytes();
let signs = KSIGNS_IQ2XS[usize::from(word >> 9)];
let dl = if l < 2 { db0 } else { db1 };
write_signed_grid(scratch, y_off, dl, grid, signs);
y_off += 8;
}
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_precision_loss,
clippy::cast_possible_truncation,
clippy::needless_range_loop
)]
fn dequant_iq2_s<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_super_kernel(data, 82, sink, |in_block, scratch| {
let d = read_f16_bytes([in_block[0], in_block[1]]);
let qs_indices = &in_block[2..34];
let qs_signs = &in_block[34..66];
let qh = &in_block[66..74];
let scales = &in_block[74..82];
let mut y_off: usize = 0;
for ib32 in 0..8 {
let db0 = d * (0.5 + f32::from(scales[ib32] & 0x0F)) * 0.25;
let db1 = d * (0.5 + f32::from(scales[ib32] >> 4)) * 0.25;
for l in 0..4 {
let l_u32 = l as u32;
let high = (u32::from(qh[ib32]) << (8 - 2 * l_u32)) & 0x0300;
let idx = u32::from(qs_indices[4 * ib32 + l]) | high;
let grid = IQ2S_GRID[idx as usize].to_le_bytes();
let signs = qs_signs[4 * ib32 + l];
let dl = if l < 2 { db0 } else { db1 };
write_signed_grid(scratch, y_off, dl, grid, signs);
y_off += 8;
}
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_precision_loss,
clippy::cast_possible_truncation
)]
fn dequant_iq3_xxs<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_super_kernel(data, 98, sink, |in_block, scratch| {
let d = read_f16_bytes([in_block[0], in_block[1]]);
let qs = &in_block[2..98];
let mut y_off: usize = 0;
for ib32 in 0..8 {
let ss_off = 64 + 4 * ib32;
let aux32 =
u32::from_le_bytes([qs[ss_off], qs[ss_off + 1], qs[ss_off + 2], qs[ss_off + 3]]);
let db = d * (0.5 + ((aux32 >> 28) as f32)) * 0.5;
for l in 0..4 {
let l_u32 = l as u32;
let signs = KSIGNS_IQ2XS[((aux32 >> (7 * l_u32)) & 0x7F) as usize];
let g1 = IQ3XXS_GRID[usize::from(qs[8 * ib32 + 2 * l])].to_le_bytes();
let g2 = IQ3XXS_GRID[usize::from(qs[8 * ib32 + 2 * l + 1])].to_le_bytes();
let combined = [g1[0], g1[1], g1[2], g1[3], g2[0], g2[1], g2[2], g2[3]];
write_signed_grid(scratch, y_off, db, combined, signs);
y_off += 8;
}
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_precision_loss,
clippy::cast_possible_truncation,
clippy::needless_range_loop,
clippy::similar_names
)]
fn dequant_iq3_s<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_super_kernel(data, 110, sink, |in_block, scratch| {
let d = read_f16_bytes([in_block[0], in_block[1]]);
let qs = &in_block[2..66];
let qh = &in_block[66..74];
let signs = &in_block[74..106];
let scales = &in_block[106..110];
let mut y_off: usize = 0;
for outer in 0..4 {
let scale_byte = scales[outer];
let db1 = d * (1.0 + 2.0 * f32::from(scale_byte & 0x0F));
let db2 = d * (1.0 + 2.0 * f32::from(scale_byte >> 4));
let qh_first = u32::from(qh[2 * outer]);
let qs_first = 16 * outer;
let sg_first = 8 * outer;
for l in 0..4 {
let l_u32 = l as u32;
let hi1 = (qh_first << (8 - 2 * l_u32)) & 0x0100;
let hi2 = (qh_first << (7 - 2 * l_u32)) & 0x0100;
let idx1 = u32::from(qs[qs_first + 2 * l]) | hi1;
let idx2 = u32::from(qs[qs_first + 2 * l + 1]) | hi2;
let g1 = IQ3S_GRID[idx1 as usize].to_le_bytes();
let g2 = IQ3S_GRID[idx2 as usize].to_le_bytes();
let combined = [g1[0], g1[1], g1[2], g1[3], g2[0], g2[1], g2[2], g2[3]];
let signs_l = signs[sg_first + l];
write_signed_grid(scratch, y_off, db1, combined, signs_l);
y_off += 8;
}
let qh_second = u32::from(qh[2 * outer + 1]);
let qs_second = 16 * outer + 8;
let sg_second = 8 * outer + 4;
for l in 0..4 {
let l_u32 = l as u32;
let hi1 = (qh_second << (8 - 2 * l_u32)) & 0x0100;
let hi2 = (qh_second << (7 - 2 * l_u32)) & 0x0100;
let idx1 = u32::from(qs[qs_second + 2 * l]) | hi1;
let idx2 = u32::from(qs[qs_second + 2 * l + 1]) | hi2;
let g1 = IQ3S_GRID[idx1 as usize].to_le_bytes();
let g2 = IQ3S_GRID[idx2 as usize].to_le_bytes();
let combined = [g1[0], g1[1], g1[2], g1[3], g2[0], g2[1], g2[2], g2[3]];
let signs_l = signs[sg_second + l];
write_signed_grid(scratch, y_off, db2, combined, signs_l);
y_off += 8;
}
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_precision_loss,
clippy::cast_possible_truncation,
clippy::cast_possible_wrap
)]
fn dequant_iq1_s<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_super_kernel(data, 50, sink, |in_block, scratch| {
let d = read_f16_bytes([in_block[0], in_block[1]]);
let qs = &in_block[2..34];
let qh_bytes = &in_block[34..50];
let mut y_off: usize = 0;
for ib32 in 0..8 {
let qh_off = 2 * ib32;
let qh = u16::from_le_bytes([qh_bytes[qh_off], qh_bytes[qh_off + 1]]);
let dl = d * f32::from(2 * ((qh >> 12) & 7) + 1);
let delta = if qh & 0x8000 == 0 {
IQ1S_DELTA
} else {
-IQ1S_DELTA
};
for l in 0..4 {
let l_u32 = l as u32;
let hi = ((u32::from(qh) >> (3 * l_u32)) & 7) << 8;
let idx = u32::from(qs[4 * ib32 + l]) | hi;
let grid = iq1s_grid_as_i8(IQ1S_GRID[idx as usize]);
write_delta_grid(scratch, y_off, dl, grid, delta);
y_off += 8;
}
}
})
}
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_precision_loss,
clippy::cast_possible_truncation,
clippy::cast_possible_wrap,
clippy::similar_names
)]
fn dequant_iq1_m<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_super_kernel(data, 56, sink, |in_block, scratch| {
let qs = &in_block[0..32];
let qh = &in_block[32..48];
let scales = &in_block[48..56];
let sc0 = u16::from_le_bytes([scales[0], scales[1]]);
let sc1 = u16::from_le_bytes([scales[2], scales[3]]);
let sc2 = u16::from_le_bytes([scales[4], scales[5]]);
let sc3 = u16::from_le_bytes([scales[6], scales[7]]);
let scale_u16 =
(sc0 >> 12) | ((sc1 >> 8) & 0x00F0) | ((sc2 >> 4) & 0x0F00) | (sc3 & 0xF000);
let d = f32::from(half::f16::from_bits(scale_u16));
let sc = [sc0, sc1, sc2, sc3];
let delta_for = |qh_byte: u8, mask: u8| -> f32 {
if qh_byte & mask == 0 {
IQ1S_DELTA
} else {
-IQ1S_DELTA
}
};
let mut y_off: usize = 0;
for ib32 in 0..8 {
let shift_a = 6 * ((ib32 % 2) as u32);
let dl1 = d * f32::from(2 * ((sc[ib32 / 2] >> shift_a) & 7) + 1);
let dl2 = d * f32::from(2 * ((sc[ib32 / 2] >> (shift_a + 3)) & 7) + 1);
let qs_off = 4 * ib32;
let qh_off = 2 * ib32;
let qh_a = qh[qh_off];
let qh_b = qh[qh_off + 1];
let qh_a_u32 = u32::from(qh_a);
let qh_b_u32 = u32::from(qh_b);
let groups: [(u32, f32, f32); 4] = [
(
u32::from(qs[qs_off]) | ((qh_a_u32 << 8) & 0x0700),
dl1,
delta_for(qh_a, 0x08),
),
(
u32::from(qs[qs_off + 1]) | ((qh_a_u32 << 4) & 0x0700),
dl1,
delta_for(qh_a, 0x80),
),
(
u32::from(qs[qs_off + 2]) | ((qh_b_u32 << 8) & 0x0700),
dl2,
delta_for(qh_b, 0x08),
),
(
u32::from(qs[qs_off + 3]) | ((qh_b_u32 << 4) & 0x0700),
dl2,
delta_for(qh_b, 0x80),
),
];
for &(idx, dl, delta) in &groups {
let grid = iq1s_grid_as_i8(IQ1S_GRID[idx as usize]);
write_delta_grid(scratch, y_off, dl, grid, delta);
y_off += 8;
}
}
})
}
#[allow(clippy::indexing_slicing, clippy::needless_range_loop)]
fn dequant_tq1_0<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_super_kernel(data, 54, sink, |in_block, scratch| {
let qs = &in_block[0..48];
let qh = &in_block[48..52];
let d = read_f16_bytes([in_block[52], in_block[53]]);
let mut y_off: usize = 0;
for n in 0..5 {
for m in 0..32 {
scratch[y_off] = decode_pow3_ternary(qs[m], POW3_TQ1_0[n], d);
y_off += 1;
}
}
for n in 0..5 {
for m in 0..16 {
scratch[y_off] = decode_pow3_ternary(qs[32 + m], POW3_TQ1_0[n], d);
y_off += 1;
}
}
for n in 0..4 {
for j in 0..4 {
scratch[y_off] = decode_pow3_ternary(qh[j], POW3_TQ1_0[n], d);
y_off += 1;
}
}
})
}
#[allow(clippy::indexing_slicing)]
fn dequant_tq2_0<F>(data: &[u8], sink: F) -> crate::Result<()>
where
F: FnMut(&[u8]) -> crate::Result<()>,
{
run_super_kernel(data, 66, sink, |in_block, scratch| {
let qs = &in_block[0..64];
let d = read_f16_bytes([in_block[64], in_block[65]]);
let mut y_off: usize = 0;
for chunk_off in [0_usize, 32] {
for l in 0..4_u32 {
for m in 0..32 {
let q = (qs[chunk_off + m] >> (l * 2)) & 3;
scratch[y_off] = (f32::from(q) - 1.0) * d;
y_off += 1;
}
}
}
})
}
#[inline]
#[allow(clippy::indexing_slicing)]
fn get_scale_min_k4(j: usize, scales: &[u8; 12]) -> (u8, u8) {
if j < 4 {
(scales[j] & 63, scales[j + 4] & 63)
} else {
let d = (scales[j + 4] & 0x0F) | ((scales[j - 4] >> 6) << 4);
let m = (scales[j + 4] >> 4) | ((scales[j] >> 6) << 4);
(d, m)
}
}
#[inline]
#[allow(
clippy::indexing_slicing,
clippy::identity_op,
clippy::as_conversions,
clippy::cast_possible_wrap
)]
fn q3_k_unpack_scales(packed: &[u8; 12]) -> [i8; 16] {
const KMASK1: u32 = 0x0303_0303;
const KMASK2: u32 = 0x0f0f_0f0f;
let aux0_in = u32::from_le_bytes([packed[0], packed[1], packed[2], packed[3]]);
let aux1_in = u32::from_le_bytes([packed[4], packed[5], packed[6], packed[7]]);
let aux2_in = u32::from_le_bytes([packed[8], packed[9], packed[10], packed[11]]);
let tmp = aux2_in;
let aux0 = (aux0_in & KMASK2) | (((tmp >> 0) & KMASK1) << 4);
let aux1 = (aux1_in & KMASK2) | (((tmp >> 2) & KMASK1) << 4);
let aux2 = ((aux0_in >> 4) & KMASK2) | (((tmp >> 4) & KMASK1) << 4);
let aux3 = ((aux1_in >> 4) & KMASK2) | (((tmp >> 6) & KMASK1) << 4);
let mut out = [0i8; 16];
for (i, &word) in [aux0, aux1, aux2, aux3].iter().enumerate() {
let bytes = word.to_le_bytes();
out[i * 4] = bytes[0] as i8;
out[i * 4 + 1] = bytes[1] as i8;
out[i * 4 + 2] = bytes[2] as i8;
out[i * 4 + 3] = bytes[3] as i8;
}
out
}
#[cfg(test)]
#[allow(
clippy::indexing_slicing,
clippy::as_conversions,
clippy::cast_possible_truncation,
clippy::cast_possible_wrap,
clippy::cast_precision_loss,
clippy::cast_sign_loss,
clippy::unwrap_used,
clippy::expect_used,
clippy::panic,
clippy::float_cmp,
clippy::wildcard_enum_match_arm,
clippy::manual_is_multiple_of,
clippy::needless_range_loop
)]
mod tests {
use super::*;
fn bf16_pair_to_f32(bytes: &[u8]) -> f32 {
let bits = u16::from_le_bytes([bytes[0], bytes[1]]);
f32::from(half::bf16::from_bits(bits))
}
fn f16_bytes(v: f32) -> [u8; 2] {
half::f16::from_f32(v).to_le_bytes()
}
#[test]
fn zero_elements_returns_empty() {
let out = dequantize_gguf_to_bf16(&[], GgufType::Q4_0, 0).unwrap();
assert!(out.is_empty());
}
#[test]
fn rejects_non_multiple_of_block_size() {
let data = vec![0u8; 18];
let err = dequantize_gguf_to_bf16(&data, GgufType::Q4_0, 17).unwrap_err();
assert!(matches!(err, AnamnesisError::Parse { .. }));
}
#[test]
fn rejects_wrong_data_length() {
let data = vec![0u8; 17];
let err = dequantize_gguf_to_bf16(&data, GgufType::Q4_0, 32).unwrap_err();
assert!(matches!(err, AnamnesisError::Parse { .. }));
}
#[test]
fn mxfp4_now_supported_returns_parse_error_on_bad_length() {
let err = dequantize_gguf_to_bf16(&[], GgufType::MXFP4, 32).unwrap_err();
assert!(matches!(err, AnamnesisError::Parse { .. }));
}
#[test]
fn overflow_guard_rejects_huge_n_elements() {
let n_elements = (usize::MAX / 32) * 32;
let err = dequantize_gguf_to_bf16(&[], GgufType::Q4_0, n_elements).unwrap_err();
match err {
AnamnesisError::Parse { reason } => {
assert!(
reason.contains("overflows usize"),
"expected overflow error, got: {reason}"
);
}
other => panic!("expected Parse overflow, got {other:?}"),
}
}
#[test]
fn streaming_calls_sink_once_per_block() {
let mut data = vec![0u8; 36];
data[0..2].copy_from_slice(&f16_bytes(0.0));
data[18..20].copy_from_slice(&f16_bytes(0.0));
let mut block_count = 0;
let mut total_bytes = 0;
dequantize_gguf_blocks_to_bf16(&data, GgufType::Q4_0, 64, |block| {
block_count += 1;
total_bytes += block.len();
Ok(())
})
.unwrap();
assert_eq!(block_count, 2);
assert_eq!(total_bytes, 128);
}
#[test]
fn streaming_propagates_sink_error() {
let mut data = vec![0u8; 18];
data[0..2].copy_from_slice(&f16_bytes(0.0));
let err = dequantize_gguf_blocks_to_bf16(&data, GgufType::Q4_0, 32, |_block| {
Err(AnamnesisError::Parse {
reason: "sink aborted".into(),
})
})
.unwrap_err();
match err {
AnamnesisError::Parse { reason } => assert_eq!(reason, "sink aborted"),
other => panic!("expected Parse from sink, got {other:?}"),
}
}
#[test]
fn streaming_matches_vec_variant() {
let mut data = vec![0u8; 36];
data[0..2].copy_from_slice(&f16_bytes(1.0));
for j in 0..16 {
data[2 + j] = (j as u8) << 4 | (j as u8);
}
data[18..20].copy_from_slice(&f16_bytes(-0.5));
for j in 0..16 {
data[20 + j] = 0xF0;
}
let vec_out = dequantize_gguf_to_bf16(&data, GgufType::Q4_0, 64).unwrap();
let mut streamed = Vec::with_capacity(vec_out.len());
dequantize_gguf_blocks_to_bf16(&data, GgufType::Q4_0, 64, |block| {
streamed.extend_from_slice(block);
Ok(())
})
.unwrap();
assert_eq!(vec_out, streamed);
}
#[test]
fn streaming_zero_elements_makes_no_sink_calls() {
let mut calls = 0;
dequantize_gguf_blocks_to_bf16(&[], GgufType::Q4_0, 0, |_block| {
calls += 1;
Ok(())
})
.unwrap();
assert_eq!(calls, 0);
}
#[test]
fn q8_0_all_zero_block() {
let mut block = vec![0u8; 34];
block[0..2].copy_from_slice(&f16_bytes(0.0));
let out = dequantize_gguf_to_bf16(&block, GgufType::Q8_0, 32).unwrap();
assert_eq!(out.len(), 64);
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn q8_0_identity_scale() {
let mut block = vec![0u8; 34];
block[0..2].copy_from_slice(&f16_bytes(1.0));
for j in 0..32 {
let v: i8 = (j as i8).wrapping_sub(16);
block[2 + j] = v as u8;
}
let out = dequantize_gguf_to_bf16(&block, GgufType::Q8_0, 32).unwrap();
for j in 0..32 {
let expected = f32::from((j as i8).wrapping_sub(16));
let got = bf16_pair_to_f32(&out[j * 2..j * 2 + 2]);
assert_eq!(got, expected, "Q8_0[{j}]");
}
}
#[test]
fn q8_0_multi_block() {
let mut data = vec![0u8; 68];
data[0..2].copy_from_slice(&f16_bytes(2.0));
for j in 0..32 {
data[2 + j] = 1;
}
data[34..36].copy_from_slice(&f16_bytes(-1.0));
for j in 0..32 {
data[36 + j] = 3;
}
let out = dequantize_gguf_to_bf16(&data, GgufType::Q8_0, 64).unwrap();
for j in 0..32 {
assert_eq!(bf16_pair_to_f32(&out[j * 2..j * 2 + 2]), 2.0);
}
for j in 32..64 {
assert_eq!(bf16_pair_to_f32(&out[j * 2..j * 2 + 2]), -3.0);
}
}
#[test]
fn q4_0_zeroed_nibbles_centers_at_minus_8() {
let mut block = vec![0u8; 18];
block[0..2].copy_from_slice(&f16_bytes(1.0));
let out = dequantize_gguf_to_bf16(&block, GgufType::Q4_0, 32).unwrap();
for j in 0..32 {
assert_eq!(bf16_pair_to_f32(&out[j * 2..j * 2 + 2]), -8.0);
}
}
#[test]
fn q4_0_identity_nibble_round_trip() {
let mut block = vec![0u8; 18];
block[0..2].copy_from_slice(&f16_bytes(1.0));
for j in 0..16usize {
block[2 + j] = ((j as u8) << 4) | (j as u8);
}
let out = dequantize_gguf_to_bf16(&block, GgufType::Q4_0, 32).unwrap();
for j in 0..16 {
let expected = j as f32 - 8.0;
assert_eq!(bf16_pair_to_f32(&out[j * 2..j * 2 + 2]), expected);
assert_eq!(
bf16_pair_to_f32(&out[(j + 16) * 2..(j + 16) * 2 + 2]),
expected
);
}
}
#[test]
fn q4_1_affine_transform() {
let mut block = vec![0u8; 20];
block[0..2].copy_from_slice(&f16_bytes(1.0));
block[2..4].copy_from_slice(&f16_bytes(10.0));
for j in 0..16 {
block[4 + j] = 0xFF;
}
let out = dequantize_gguf_to_bf16(&block, GgufType::Q4_1, 32).unwrap();
for j in 0..32 {
assert_eq!(bf16_pair_to_f32(&out[j * 2..j * 2 + 2]), 25.0);
}
}
#[test]
fn q5_0_all_high_bits_set() {
let mut block = vec![0u8; 22];
block[0..2].copy_from_slice(&f16_bytes(1.0));
block[2..6].copy_from_slice(&0xFFFF_FFFFu32.to_le_bytes());
let out = dequantize_gguf_to_bf16(&block, GgufType::Q5_0, 32).unwrap();
for j in 0..32 {
assert_eq!(bf16_pair_to_f32(&out[j * 2..j * 2 + 2]), 0.0);
}
}
#[test]
fn q5_1_identity_nibbles_no_high_bits() {
let mut block = vec![0u8; 24];
block[0..2].copy_from_slice(&f16_bytes(1.0));
block[2..4].copy_from_slice(&f16_bytes(5.0));
for j in 0..16 {
block[8 + j] = 0x11;
}
let out = dequantize_gguf_to_bf16(&block, GgufType::Q5_1, 32).unwrap();
for j in 0..32 {
assert_eq!(bf16_pair_to_f32(&out[j * 2..j * 2 + 2]), 6.0);
}
}
#[test]
fn q8_1_ignores_s_field() {
let mut block = vec![0u8; 36];
block[0..2].copy_from_slice(&f16_bytes(1.0));
block[2..4].copy_from_slice(&f16_bytes(999.0));
for j in 0..32 {
let v: i8 = j as i8;
block[4 + j] = v as u8;
}
let out = dequantize_gguf_to_bf16(&block, GgufType::Q8_1, 32).unwrap();
for j in 0..32 {
assert_eq!(bf16_pair_to_f32(&out[j * 2..j * 2 + 2]), f32::from(j as i8));
}
}
#[test]
fn q8_k_f32_scale() {
let mut block = vec![0u8; 292];
block[0..4].copy_from_slice(&0.5_f32.to_le_bytes());
for j in 0..256 {
let v: i8 = ((j as i32) - 128) as i8;
block[4 + j] = v as u8;
}
let out = dequantize_gguf_to_bf16(&block, GgufType::Q8_K, 256).unwrap();
for j in 0..256 {
let expected = f32::from(((j as i32) - 128) as i8) * 0.5;
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
expected,
"Q8_K[{j}]"
);
}
}
#[test]
fn q2_k_zero_scales_and_mins() {
let block = vec![0u8; 84];
let out = dequantize_gguf_to_bf16(&block, GgufType::Q2_K, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn q2_k_uniform_scale_uniform_qs() {
let mut block = vec![0u8; 84];
for j in 0..16 {
block[j] = 0x02;
}
for j in 0..64 {
block[16 + j] = 0x55;
}
block[80..82].copy_from_slice(&f16_bytes(1.0));
block[82..84].copy_from_slice(&f16_bytes(0.0));
let out = dequantize_gguf_to_bf16(&block, GgufType::Q2_K, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 2.0);
}
}
#[test]
fn q3_k_unpack_scales_zero() {
let scales = q3_k_unpack_scales(&[0u8; 12]);
assert_eq!(scales, [0i8; 16]);
}
#[test]
fn q3_k_unpack_scales_low_half_trivial() {
let mut packed = [0u8; 12];
packed[0] = 0x00;
packed[1] = 0x01;
packed[2] = 0x02;
packed[3] = 0x03;
let scales = q3_k_unpack_scales(&packed);
assert_eq!(scales[0], 0);
assert_eq!(scales[1], 1);
assert_eq!(scales[2], 2);
assert_eq!(scales[3], 3);
}
#[test]
fn q3_k_all_zero_block() {
let block = vec![0u8; 110];
let out = dequantize_gguf_to_bf16(&block, GgufType::Q3_K, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn get_scale_min_k4_low_half() {
let scales = [
0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00,
];
assert_eq!(get_scale_min_k4(0, &scales), (0x00, 0x10));
assert_eq!(get_scale_min_k4(1, &scales), (0x01, 0x11));
assert_eq!(get_scale_min_k4(2, &scales), (0x02, 0x12));
assert_eq!(get_scale_min_k4(3, &scales), (0x03, 0x13));
}
#[test]
fn get_scale_min_k4_high_half_zero() {
let scales = [0u8; 12];
for j in 0..8 {
assert_eq!(get_scale_min_k4(j, &scales), (0, 0));
}
}
#[test]
fn q4_k_all_zero_block() {
let block = vec![0u8; 144];
let out = dequantize_gguf_to_bf16(&block, GgufType::Q4_K, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn q5_k_all_zero_block() {
let block = vec![0u8; 176];
let out = dequantize_gguf_to_bf16(&block, GgufType::Q5_K, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn q6_k_all_zero_block() {
let block = vec![0u8; 210];
let out = dequantize_gguf_to_bf16(&block, GgufType::Q6_K, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn q6_k_identity_centers_at_minus_32() {
let mut block = vec![0u8; 210];
for j in 0..16 {
block[192 + j] = 1;
}
block[208..210].copy_from_slice(&f16_bytes(1.0));
let out = dequantize_gguf_to_bf16(&block, GgufType::Q6_K, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), -32.0);
}
}
#[test]
fn iq4_nl_zero_scale_emits_zero() {
let mut block = vec![0u8; 18];
block[0..2].copy_from_slice(&f16_bytes(0.0));
for j in 0..16 {
block[2 + j] = 0xA5;
}
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ4_NL, 32).unwrap();
assert_eq!(out.len(), 64);
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn iq4_nl_zero_nibbles_emit_codebook_0() {
let mut block = vec![0u8; 18];
block[0..2].copy_from_slice(&f16_bytes(1.0));
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ4_NL, 32).unwrap();
for j in 0..32 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
-127.0,
"IQ4_NL[{j}]"
);
}
}
#[test]
fn iq4_nl_nibble_sweep() {
let mut block = vec![0u8; 18];
block[0..2].copy_from_slice(&f16_bytes(1.0));
for j in 0..16usize {
block[2 + j] = ((j as u8) << 4) | (j as u8);
}
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ4_NL, 32).unwrap();
for j in 0..16 {
let expected = f32::from(K_VALUES_IQ4_NL[j]);
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
expected,
"IQ4_NL low nibble[{j}]"
);
assert_eq!(
bf16_pair_to_f32(&out[(j + 16) * 2..(j + 16) * 2 + 2]),
expected,
"IQ4_NL high nibble[{j}]"
);
}
}
#[test]
fn iq4_xs_all_zero_block() {
let block = vec![0u8; 136];
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ4_XS, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn iq4_xs_scale_bias_centers_at_minus_32() {
let mut block = vec![0u8; 136];
block[0..2].copy_from_slice(&f16_bytes(1.0));
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ4_XS, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 4064.0);
}
}
#[test]
fn iq4_xs_ls_combination() {
let mut block = vec![0u8; 136];
block[0..2].copy_from_slice(&f16_bytes(1.0));
block[2] = 0x03;
block[3] = 0x00;
block[4] = 0x0F;
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ4_XS, 256).unwrap();
let expected_sb0 = f32::from(half::bf16::from_f32(31.0 * -127.0));
for j in 0..32 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
expected_sb0,
"IQ4_XS sub-block 0[{j}]"
);
}
for j in 32..256 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
4064.0,
"IQ4_XS sub-block >=1[{j}]"
);
}
}
#[test]
fn iq2_xxs_all_zero_block() {
let block = vec![0u8; 66];
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ2_XXS, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn iq2_xxs_grid_entry_0_sign_entry_0() {
let mut block = vec![0u8; 66];
block[0..2].copy_from_slice(&f16_bytes(1.0));
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ2_XXS, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 1.0);
}
}
#[test]
fn iq2_xxs_scale_nibble_sweep() {
let mut block = vec![0u8; 66];
block[0..2].copy_from_slice(&f16_bytes(1.0));
block[2 + 7] = 0xF0; let out = dequantize_gguf_to_bf16(&block, GgufType::IQ2_XXS, 256).unwrap();
for j in 0..32 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
31.0,
"IQ2_XXS sub-block 0[{j}]"
);
}
for j in 32..256 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
1.0,
"IQ2_XXS sub-block >=1[{j}]"
);
}
}
#[test]
fn iq2_xs_all_zero_block() {
let block = vec![0u8; 74];
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ2_XS, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn iq2_xs_scale_nibble_split() {
let mut block = vec![0u8; 74];
block[0..2].copy_from_slice(&f16_bytes(1.0));
block[66] = 0x50; let out = dequantize_gguf_to_bf16(&block, GgufType::IQ2_XS, 256).unwrap();
for j in 0..16 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
1.0,
"IQ2_XS sub-block 0 low-nibble[{j}]"
);
}
for j in 16..32 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
11.0,
"IQ2_XS sub-block 0 high-nibble[{j}]"
);
}
for j in 32..256 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
1.0,
"IQ2_XS sub-block >=1[{j}]"
);
}
}
#[test]
fn iq2_s_all_zero_block() {
let block = vec![0u8; 82];
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ2_S, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn iq2_s_qh_high_bits_select_grid_entry_256() {
let mut block = vec![0u8; 82];
block[0..2].copy_from_slice(&f16_bytes(1.0));
block[74] = 0x03; block[66] = 0x01; let out = dequantize_gguf_to_bf16(&block, GgufType::IQ2_S, 256).unwrap();
let grid = IQ2S_GRID[256].to_le_bytes();
for j in 0..8 {
let expected = f32::from(half::bf16::from_f32(0.875 * f32::from(grid[j])));
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
expected,
"IQ2_S group 0[{j}]"
);
}
for j in 8..16 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
7.0, "IQ2_S group 1[{j}]"
);
}
for j in 16..32 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
1.0, "IQ2_S groups 2-3[{j}]"
);
}
for j in 32..256 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
1.0,
"IQ2_S sub-block >=1[{j}]"
);
}
}
#[test]
fn iq3_xxs_all_zero_block() {
let block = vec![0u8; 98];
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ3_XXS, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn iq3_xxs_grid_entry_0_sign_entry_0_scale_nibble_0() {
let mut block = vec![0u8; 98];
block[0..2].copy_from_slice(&f16_bytes(1.0));
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ3_XXS, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 1.0);
}
}
#[test]
fn iq3_xxs_scale_nibble_sweep() {
let mut block = vec![0u8; 98];
block[0..2].copy_from_slice(&f16_bytes(1.0));
block[66 + 3] = 0xF0;
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ3_XXS, 256).unwrap();
for j in 0..32 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
31.0,
"IQ3_XXS sub-block 0[{j}]"
);
}
for j in 32..256 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
1.0,
"IQ3_XXS sub-block >=1[{j}]"
);
}
}
#[test]
fn iq3_s_all_zero_block() {
let block = vec![0u8; 110];
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ3_S, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn iq3_s_scale_formula() {
let mut block = vec![0u8; 110];
block[0..2].copy_from_slice(&f16_bytes(1.0));
block[106] = 0x05; let out = dequantize_gguf_to_bf16(&block, GgufType::IQ3_S, 256).unwrap();
for j in 0..32 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
11.0,
"IQ3_S sub-block A[{j}]"
);
}
for j in 32..256 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
1.0,
"IQ3_S sub-block B+[{j}]"
);
}
}
#[test]
fn iq3_s_qh_high_bit_selects_grid_entry_256() {
let mut block = vec![0u8; 110];
block[0..2].copy_from_slice(&f16_bytes(1.0));
block[106] = 0x03; block[66] = 0x01; let out = dequantize_gguf_to_bf16(&block, GgufType::IQ3_S, 256).unwrap();
let grid256 = IQ3S_GRID[256].to_le_bytes();
for j in 0..4 {
let expected = f32::from(half::bf16::from_f32(7.0 * f32::from(grid256[j])));
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
expected,
"IQ3_S grid256[{j}]"
);
}
for j in 4..8 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
7.0,
"IQ3_S group 1 low-half[{j}]"
);
}
for j in 8..32 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
7.0,
"IQ3_S sub-block A rest[{j}]"
);
}
for j in 32..256 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
1.0,
"IQ3_S sub-block B+[{j}]"
);
}
}
#[test]
fn iq1_s_all_zero_block() {
let block = vec![0u8; 50];
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ1_S, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn iq1_s_grid_entry_0_top_qh_zero() {
let mut block = vec![0u8; 50];
block[0..2].copy_from_slice(&f16_bytes(1.0));
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ1_S, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), -0.875);
}
}
#[test]
fn iq1_s_delta_sign_flip() {
let mut block = vec![0u8; 50];
block[0..2].copy_from_slice(&f16_bytes(1.0));
block[34] = 0x00;
block[35] = 0x80;
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ1_S, 256).unwrap();
for j in 0..32 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
-1.125,
"IQ1_S sub-block 0 with -delta[{j}]"
);
}
for j in 32..256 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
-0.875,
"IQ1_S sub-blocks 1..=7 with +delta[{j}]"
);
}
}
#[test]
fn iq1_m_all_zero_block() {
let block = vec![0u8; 56];
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ1_M, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn iq1_m_scale_assembly_yields_one() {
let mut block = vec![0u8; 56];
block[48 + 4] = 0x00;
block[48 + 5] = 0xC0;
block[48 + 6] = 0x00;
block[48 + 7] = 0x30;
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ1_M, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), -0.875);
}
}
#[test]
fn iq1_m_dl1_vs_dl2_split() {
let mut block = vec![0u8; 56];
block[48] = 0x38; block[49] = 0x00; block[48 + 4] = 0x00;
block[48 + 5] = 0xC0;
block[48 + 6] = 0x00;
block[48 + 7] = 0x30;
let out = dequantize_gguf_to_bf16(&block, GgufType::IQ1_M, 256).unwrap();
for j in 0..16 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
-0.875,
"IQ1_M ib32=0 sub-block A[{j}]"
);
}
for j in 16..32 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
-13.125,
"IQ1_M ib32=0 sub-block B[{j}]"
);
}
for j in 32..256 {
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
-0.875,
"IQ1_M ib32>=1[{j}]"
);
}
}
#[test]
fn tq1_0_all_zero_block() {
let block = vec![0u8; 54];
let out = dequantize_gguf_to_bf16(&block, GgufType::TQ1_0, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn tq1_0_zero_qs_qh_with_d_one() {
let mut block = vec![0u8; 54];
block[52..54].copy_from_slice(&f16_bytes(1.0));
let out = dequantize_gguf_to_bf16(&block, GgufType::TQ1_0, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), -1.0);
}
}
#[test]
fn tq2_0_all_zero_block() {
let block = vec![0u8; 66];
let out = dequantize_gguf_to_bf16(&block, GgufType::TQ2_0, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn tq2_0_zero_qs_with_d_one() {
let mut block = vec![0u8; 66];
block[64..66].copy_from_slice(&f16_bytes(1.0));
let out = dequantize_gguf_to_bf16(&block, GgufType::TQ2_0, 256).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), -1.0);
}
}
#[test]
fn tq2_0_first_byte_all_twos() {
let mut block = vec![0u8; 66];
block[0] = 0xAA;
block[64..66].copy_from_slice(&f16_bytes(1.0));
let out = dequantize_gguf_to_bf16(&block, GgufType::TQ2_0, 256).unwrap();
for j in 0..256 {
let expected = if matches!(j, 0 | 32 | 64 | 96) {
1.0
} else {
-1.0
};
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
expected,
"TQ2_0 output[{j}]"
);
}
}
#[test]
fn mxfp4_zero_block_zero_output() {
let block = vec![0u8; 17];
let out = dequantize_gguf_to_bf16(&block, GgufType::MXFP4, 32).unwrap();
for chunk in out.chunks_exact(2) {
assert_eq!(bf16_pair_to_f32(chunk), 0.0);
}
}
#[test]
fn mxfp4_e_one_yields_subnormal_scale() {
let mut block = vec![0u8; 17];
block[0] = 1;
block[1] = 0x71;
let out = dequantize_gguf_to_bf16(&block, GgufType::MXFP4, 32).unwrap();
let d = f32::from_bits(0x0040_0000);
let expected_pos_0 = 1.0_f32 * d;
let expected_pos_16 = 12.0_f32 * d;
let bits_pos_0 = f32_bits_to_bf16_bits(expected_pos_0.to_bits());
let bits_pos_16 = f32_bits_to_bf16_bits(expected_pos_16.to_bits());
let actual_pos_0 = u16::from_le_bytes([out[0], out[1]]);
let actual_pos_16 = u16::from_le_bytes([out[32], out[33]]);
assert_eq!(actual_pos_0, bits_pos_0, "MXFP4 e=1 position 0");
assert_eq!(actual_pos_16, bits_pos_16, "MXFP4 e=1 position 16");
}
#[test]
fn mxfp4_e_normal_simple() {
let mut block = vec![0u8; 17];
block[0] = 128;
block[1] = 0x71;
let out = dequantize_gguf_to_bf16(&block, GgufType::MXFP4, 32).unwrap();
for j in 0..32 {
let expected = match j {
0 => 1.0,
16 => 12.0,
_ => 0.0,
};
assert_eq!(
bf16_pair_to_f32(&out[j * 2..j * 2 + 2]),
expected,
"MXFP4 e=128 output[{j}]"
);
}
}
#[test]
fn mxfp4_e_normal_negative_codebook() {
let mut block = vec![0u8; 17];
block[0] = 128;
block[1] = 0xF9;
let out = dequantize_gguf_to_bf16(&block, GgufType::MXFP4, 32).unwrap();
assert_eq!(bf16_pair_to_f32(&out[0..2]), -1.0);
assert_eq!(bf16_pair_to_f32(&out[32..34]), -12.0);
}
}
#[allow(clippy::unreadable_literal, clippy::large_stack_arrays)]
mod iq_grids {
pub(super) const KMASK_IQ2XS: [u8; 8] = [1, 2, 4, 8, 16, 32, 64, 128];
pub(super) const KSIGNS_IQ2XS: [u8; 128] = [
0, 129, 130, 3, 132, 5, 6, 135, 136, 9, 10, 139, 12, 141, 142, 15, 144, 17, 18, 147, 20,
149, 150, 23, 24, 153, 154, 27, 156, 29, 30, 159, 160, 33, 34, 163, 36, 165, 166, 39, 40,
169, 170, 43, 172, 45, 46, 175, 48, 177, 178, 51, 180, 53, 54, 183, 184, 57, 58, 187, 60,
189, 190, 63, 192, 65, 66, 195, 68, 197, 198, 71, 72, 201, 202, 75, 204, 77, 78, 207, 80,
209, 210, 83, 212, 85, 86, 215, 216, 89, 90, 219, 92, 221, 222, 95, 96, 225, 226, 99, 228,
101, 102, 231, 232, 105, 106, 235, 108, 237, 238, 111, 240, 113, 114, 243, 116, 245, 246,
119, 120, 249, 250, 123, 252, 125, 126, 255,
];
pub(super) const IQ2XXS_GRID: [u64; 256] = [
0x0808080808080808,
0x080808080808082b,
0x0808080808081919,
0x0808080808082b08,
0x0808080808082b2b,
0x0808080808190819,
0x0808080808191908,
0x08080808082b0808,
0x08080808082b082b,
0x08080808082b2b08,
0x08080808082b2b2b,
0x0808080819080819,
0x0808080819081908,
0x0808080819190808,
0x0808080819192b08,
0x08080808192b0819,
0x08080808192b1908,
0x080808082b080808,
0x080808082b08082b,
0x080808082b082b2b,
0x080808082b2b082b,
0x0808081908080819,
0x0808081908081908,
0x0808081908190808,
0x0808081908191919,
0x0808081919080808,
0x080808192b081908,
0x080808192b192b08,
0x0808082b08080808,
0x0808082b0808082b,
0x0808082b082b082b,
0x0808082b2b08082b,
0x0808190808080819,
0x0808190808081908,
0x0808190808190808,
0x08081908082b0819,
0x08081908082b1908,
0x0808190819080808,
0x080819081908082b,
0x0808190819082b08,
0x08081908192b0808,
0x080819082b080819,
0x080819082b081908,
0x080819082b190808,
0x080819082b2b1908,
0x0808191908080808,
0x080819190808082b,
0x0808191908082b08,
0x08081919082b0808,
0x080819191908192b,
0x08081919192b2b19,
0x080819192b080808,
0x080819192b190819,
0x0808192b08082b19,
0x0808192b08190808,
0x0808192b19080808,
0x0808192b2b081908,
0x0808192b2b2b1908,
0x08082b0808080808,
0x08082b0808081919,
0x08082b0808082b08,
0x08082b0808191908,
0x08082b08082b2b08,
0x08082b0819080819,
0x08082b0819081908,
0x08082b0819190808,
0x08082b081919082b,
0x08082b082b082b08,
0x08082b1908081908,
0x08082b1919080808,
0x08082b2b0808082b,
0x08082b2b08191908,
0x0819080808080819,
0x0819080808081908,
0x0819080808190808,
0x08190808082b0819,
0x0819080819080808,
0x08190808192b0808,
0x081908082b081908,
0x081908082b190808,
0x081908082b191919,
0x0819081908080808,
0x0819081908082b08,
0x08190819082b0808,
0x0819081919190808,
0x0819081919192b2b,
0x081908192b080808,
0x0819082b082b1908,
0x0819082b19081919,
0x0819190808080808,
0x0819190808082b08,
0x08191908082b0808,
0x08191908082b1919,
0x0819190819082b19,
0x081919082b080808,
0x0819191908192b08,
0x08191919192b082b,
0x0819192b08080808,
0x0819192b0819192b,
0x08192b0808080819,
0x08192b0808081908,
0x08192b0808190808,
0x08192b0819080808,
0x08192b082b080819,
0x08192b1908080808,
0x08192b1908081919,
0x08192b192b2b0808,
0x08192b2b19190819,
0x082b080808080808,
0x082b08080808082b,
0x082b080808082b2b,
0x082b080819081908,
0x082b0808192b0819,
0x082b08082b080808,
0x082b08082b08082b,
0x082b0819082b2b19,
0x082b081919082b08,
0x082b082b08080808,
0x082b082b0808082b,
0x082b190808080819,
0x082b190808081908,
0x082b190808190808,
0x082b190819080808,
0x082b19081919192b,
0x082b191908080808,
0x082b191919080819,
0x082b1919192b1908,
0x082b192b2b190808,
0x082b2b0808082b08,
0x082b2b08082b0808,
0x082b2b082b191908,
0x082b2b2b19081908,
0x1908080808080819,
0x1908080808081908,
0x1908080808190808,
0x1908080808192b08,
0x19080808082b0819,
0x19080808082b1908,
0x1908080819080808,
0x1908080819082b08,
0x190808081919192b,
0x19080808192b0808,
0x190808082b080819,
0x190808082b081908,
0x190808082b190808,
0x1908081908080808,
0x19080819082b0808,
0x19080819192b0819,
0x190808192b080808,
0x190808192b081919,
0x1908082b08080819,
0x1908082b08190808,
0x1908082b19082b08,
0x1908082b1919192b,
0x1908082b192b2b08,
0x1908190808080808,
0x1908190808082b08,
0x19081908082b0808,
0x190819082b080808,
0x190819082b192b19,
0x190819190819082b,
0x19081919082b1908,
0x1908192b08080808,
0x19082b0808080819,
0x19082b0808081908,
0x19082b0808190808,
0x19082b0819080808,
0x19082b0819081919,
0x19082b1908080808,
0x19082b1919192b08,
0x19082b19192b0819,
0x19082b192b08082b,
0x19082b2b19081919,
0x19082b2b2b190808,
0x1919080808080808,
0x1919080808082b08,
0x1919080808190819,
0x1919080808192b19,
0x19190808082b0808,
0x191908082b080808,
0x191908082b082b08,
0x1919081908081908,
0x191908191908082b,
0x191908192b2b1908,
0x1919082b2b190819,
0x191919082b190808,
0x191919082b19082b,
0x1919191908082b2b,
0x1919192b08080819,
0x1919192b19191908,
0x19192b0808080808,
0x19192b0808190819,
0x19192b0808192b19,
0x19192b08192b1908,
0x19192b1919080808,
0x19192b2b08082b08,
0x192b080808081908,
0x192b080808190808,
0x192b080819080808,
0x192b0808192b2b08,
0x192b081908080808,
0x192b081919191919,
0x192b082b08192b08,
0x192b082b192b0808,
0x192b190808080808,
0x192b190808081919,
0x192b191908190808,
0x192b19190819082b,
0x192b19192b081908,
0x192b2b081908082b,
0x2b08080808080808,
0x2b0808080808082b,
0x2b08080808082b2b,
0x2b08080819080819,
0x2b0808082b08082b,
0x2b08081908081908,
0x2b08081908192b08,
0x2b08081919080808,
0x2b08082b08190819,
0x2b08190808080819,
0x2b08190808081908,
0x2b08190808190808,
0x2b08190808191919,
0x2b08190819080808,
0x2b081908192b0808,
0x2b08191908080808,
0x2b0819191908192b,
0x2b0819192b191908,
0x2b08192b08082b19,
0x2b08192b19080808,
0x2b08192b192b0808,
0x2b082b080808082b,
0x2b082b1908081908,
0x2b082b2b08190819,
0x2b19080808081908,
0x2b19080808190808,
0x2b190808082b1908,
0x2b19080819080808,
0x2b1908082b2b0819,
0x2b1908190819192b,
0x2b1908192b080808,
0x2b19082b19081919,
0x2b19190808080808,
0x2b191908082b082b,
0x2b19190819081908,
0x2b19191919190819,
0x2b192b082b080819,
0x2b192b19082b0808,
0x2b2b08080808082b,
0x2b2b080819190808,
0x2b2b08082b081919,
0x2b2b081908082b19,
0x2b2b082b08080808,
0x2b2b190808192b08,
0x2b2b2b0819190808,
0x2b2b2b1908081908,
];
pub(super) const IQ2XS_GRID: [u64; 512] = [
0x0808080808080808,
0x080808080808082b,
0x0808080808081919,
0x0808080808082b08,
0x0808080808082b2b,
0x0808080808190819,
0x0808080808191908,
0x080808080819192b,
0x0808080808192b19,
0x08080808082b0808,
0x08080808082b082b,
0x08080808082b1919,
0x08080808082b2b08,
0x0808080819080819,
0x0808080819081908,
0x080808081908192b,
0x0808080819082b19,
0x0808080819190808,
0x080808081919082b,
0x0808080819191919,
0x0808080819192b08,
0x08080808192b0819,
0x08080808192b1908,
0x080808082b080808,
0x080808082b08082b,
0x080808082b081919,
0x080808082b082b08,
0x080808082b190819,
0x080808082b191908,
0x080808082b192b19,
0x080808082b2b0808,
0x0808081908080819,
0x0808081908081908,
0x080808190808192b,
0x0808081908082b19,
0x0808081908190808,
0x080808190819082b,
0x0808081908191919,
0x0808081908192b08,
0x0808081908192b2b,
0x08080819082b0819,
0x08080819082b1908,
0x0808081919080808,
0x080808191908082b,
0x0808081919081919,
0x0808081919082b08,
0x0808081919190819,
0x0808081919191908,
0x08080819192b0808,
0x08080819192b2b08,
0x080808192b080819,
0x080808192b081908,
0x080808192b190808,
0x0808082b08080808,
0x0808082b0808082b,
0x0808082b08081919,
0x0808082b08082b08,
0x0808082b08190819,
0x0808082b08191908,
0x0808082b082b0808,
0x0808082b19080819,
0x0808082b19081908,
0x0808082b19190808,
0x0808082b19191919,
0x0808082b2b080808,
0x0808082b2b082b2b,
0x0808190808080819,
0x0808190808081908,
0x080819080808192b,
0x0808190808082b19,
0x0808190808190808,
0x080819080819082b,
0x0808190808191919,
0x0808190808192b08,
0x08081908082b0819,
0x08081908082b1908,
0x0808190819080808,
0x080819081908082b,
0x0808190819081919,
0x0808190819082b08,
0x0808190819190819,
0x0808190819191908,
0x080819081919192b,
0x08081908192b0808,
0x080819082b080819,
0x080819082b081908,
0x080819082b190808,
0x0808191908080808,
0x080819190808082b,
0x0808191908081919,
0x0808191908082b08,
0x0808191908190819,
0x0808191908191908,
0x08081919082b0808,
0x0808191919080819,
0x0808191919081908,
0x0808191919190808,
0x08081919192b0819,
0x080819192b080808,
0x0808192b08080819,
0x0808192b08081908,
0x0808192b08190808,
0x0808192b082b192b,
0x0808192b19080808,
0x0808192b1908082b,
0x0808192b2b081908,
0x08082b0808080808,
0x08082b080808082b,
0x08082b0808081919,
0x08082b0808082b08,
0x08082b0808082b2b,
0x08082b0808190819,
0x08082b0808191908,
0x08082b08082b0808,
0x08082b08082b1919,
0x08082b0819080819,
0x08082b0819081908,
0x08082b0819190808,
0x08082b0819192b08,
0x08082b082b080808,
0x08082b082b2b0808,
0x08082b082b2b2b2b,
0x08082b1908080819,
0x08082b1908081908,
0x08082b1908190808,
0x08082b1919080808,
0x08082b192b080819,
0x08082b192b082b19,
0x08082b2b08080808,
0x08082b2b082b0808,
0x08082b2b082b2b08,
0x08082b2b2b19192b,
0x08082b2b2b2b0808,
0x0819080808080819,
0x0819080808081908,
0x081908080808192b,
0x0819080808082b19,
0x0819080808190808,
0x081908080819082b,
0x0819080808191919,
0x0819080808192b08,
0x08190808082b0819,
0x08190808082b1908,
0x0819080819080808,
0x081908081908082b,
0x0819080819081919,
0x0819080819082b08,
0x0819080819190819,
0x0819080819191908,
0x08190808192b0808,
0x08190808192b2b2b,
0x081908082b080819,
0x081908082b081908,
0x081908082b190808,
0x0819081908080808,
0x081908190808082b,
0x0819081908081919,
0x0819081908082b08,
0x0819081908190819,
0x0819081908191908,
0x08190819082b0808,
0x0819081919080819,
0x0819081919081908,
0x0819081919190808,
0x081908192b080808,
0x081908192b191908,
0x081908192b19192b,
0x0819082b08080819,
0x0819082b08081908,
0x0819082b0808192b,
0x0819082b08190808,
0x0819082b19080808,
0x0819082b192b0808,
0x0819190808080808,
0x081919080808082b,
0x0819190808081919,
0x0819190808082b08,
0x0819190808190819,
0x0819190808191908,
0x08191908082b0808,
0x0819190819080819,
0x0819190819081908,
0x0819190819082b19,
0x0819190819190808,
0x08191908192b1908,
0x081919082b080808,
0x0819191908080819,
0x0819191908081908,
0x0819191908190808,
0x0819191919080808,
0x0819192b08080808,
0x0819192b08191908,
0x0819192b19082b19,
0x08192b0808080819,
0x08192b0808081908,
0x08192b0808190808,
0x08192b080819082b,
0x08192b0819080808,
0x08192b0819191908,
0x08192b082b08192b,
0x08192b1908080808,
0x08192b1908081919,
0x08192b19192b192b,
0x08192b2b19190819,
0x08192b2b2b2b2b19,
0x082b080808080808,
0x082b08080808082b,
0x082b080808081919,
0x082b080808082b08,
0x082b080808082b2b,
0x082b080808190819,
0x082b080808191908,
0x082b0808082b0808,
0x082b080819080819,
0x082b080819081908,
0x082b080819190808,
0x082b08082b080808,
0x082b08082b2b0808,
0x082b081908080819,
0x082b081908081908,
0x082b081908190808,
0x082b081919080808,
0x082b081919082b08,
0x082b0819192b1919,
0x082b082b08080808,
0x082b082b082b082b,
0x082b082b2b080808,
0x082b082b2b2b2b08,
0x082b190808080819,
0x082b190808081908,
0x082b190808190808,
0x082b1908082b2b19,
0x082b190819080808,
0x082b191908080808,
0x082b191919080819,
0x082b19191919082b,
0x082b19192b192b19,
0x082b192b08080819,
0x082b192b08192b2b,
0x082b192b2b2b192b,
0x082b2b0808080808,
0x082b2b0808082b08,
0x082b2b0808082b2b,
0x082b2b08082b0808,
0x082b2b0819191919,
0x082b2b082b082b08,
0x082b2b082b2b082b,
0x082b2b19192b2b08,
0x082b2b192b190808,
0x082b2b2b08082b08,
0x082b2b2b082b0808,
0x082b2b2b2b08082b,
0x082b2b2b2b082b08,
0x082b2b2b2b082b2b,
0x1908080808080819,
0x1908080808081908,
0x190808080808192b,
0x1908080808082b19,
0x1908080808190808,
0x190808080819082b,
0x1908080808191919,
0x1908080808192b08,
0x19080808082b0819,
0x19080808082b1908,
0x1908080819080808,
0x190808081908082b,
0x1908080819081919,
0x1908080819082b08,
0x1908080819082b2b,
0x1908080819190819,
0x1908080819191908,
0x19080808192b0808,
0x19080808192b1919,
0x190808082b080819,
0x190808082b081908,
0x190808082b190808,
0x1908081908080808,
0x190808190808082b,
0x1908081908081919,
0x1908081908082b08,
0x1908081908190819,
0x1908081908191908,
0x19080819082b0808,
0x1908081919080819,
0x1908081919081908,
0x1908081919190808,
0x190808192b080808,
0x190808192b081919,
0x190808192b2b082b,
0x1908082b08080819,
0x1908082b08081908,
0x1908082b08190808,
0x1908082b0819082b,
0x1908082b082b2b19,
0x1908082b19080808,
0x1908190808080808,
0x190819080808082b,
0x1908190808081919,
0x1908190808082b08,
0x1908190808190819,
0x1908190808191908,
0x1908190808192b19,
0x19081908082b0808,
0x1908190819080819,
0x1908190819081908,
0x1908190819190808,
0x190819082b080808,
0x190819082b191908,
0x1908191908080819,
0x1908191908081908,
0x1908191908190808,
0x19081919082b1908,
0x1908191919080808,
0x190819192b192b2b,
0x1908192b08080808,
0x1908192b08082b2b,
0x1908192b19081908,
0x1908192b19190808,
0x19082b0808080819,
0x19082b0808081908,
0x19082b0808190808,
0x19082b0819080808,
0x19082b0819081919,
0x19082b0819191908,
0x19082b08192b082b,
0x19082b1908080808,
0x19082b1908190819,
0x19082b1919081908,
0x19082b1919190808,
0x19082b19192b2b19,
0x19082b2b08081908,
0x1919080808080808,
0x191908080808082b,
0x1919080808081919,
0x1919080808082b08,
0x1919080808190819,
0x1919080808191908,
0x19190808082b0808,
0x19190808082b2b08,
0x1919080819080819,
0x1919080819081908,
0x1919080819190808,
0x191908082b080808,
0x1919081908080819,
0x1919081908081908,
0x1919081908190808,
0x1919081908191919,
0x1919081919080808,
0x191908191908082b,
0x1919082b08080808,
0x1919082b19081908,
0x1919082b2b2b2b2b,
0x1919190808080819,
0x1919190808081908,
0x1919190808190808,
0x19191908082b0819,
0x1919190819080808,
0x19191908192b0808,
0x191919082b080819,
0x191919082b2b0819,
0x1919191908080808,
0x1919191908082b08,
0x191919192b080808,
0x191919192b082b08,
0x1919192b082b0819,
0x1919192b192b2b08,
0x1919192b2b2b0819,
0x19192b0808080808,
0x19192b0808191908,
0x19192b0819080819,
0x19192b0819190808,
0x19192b082b192b19,
0x19192b1908192b2b,
0x19192b1919080808,
0x19192b191908082b,
0x19192b2b2b081919,
0x192b080808080819,
0x192b080808081908,
0x192b080808190808,
0x192b080819080808,
0x192b080819191908,
0x192b0808192b082b,
0x192b08082b08192b,
0x192b08082b2b2b19,
0x192b081908080808,
0x192b082b082b1908,
0x192b082b19082b2b,
0x192b082b2b19082b,
0x192b190808080808,
0x192b19080819192b,
0x192b191908190808,
0x192b191919080808,
0x192b191919081919,
0x192b19192b2b1908,
0x192b2b0808080819,
0x192b2b08192b2b2b,
0x192b2b19082b1919,
0x192b2b2b0808192b,
0x192b2b2b19191908,
0x192b2b2b192b082b,
0x2b08080808080808,
0x2b0808080808082b,
0x2b08080808081919,
0x2b08080808082b08,
0x2b08080808190819,
0x2b08080808191908,
0x2b080808082b0808,
0x2b080808082b2b2b,
0x2b08080819080819,
0x2b08080819081908,
0x2b08080819190808,
0x2b0808082b080808,
0x2b0808082b08082b,
0x2b0808082b2b2b08,
0x2b0808082b2b2b2b,
0x2b08081908080819,
0x2b08081908081908,
0x2b0808190808192b,
0x2b08081908190808,
0x2b08081919080808,
0x2b08081919190819,
0x2b08081919192b19,
0x2b08082b08080808,
0x2b08082b082b0808,
0x2b08082b2b080808,
0x2b08082b2b08082b,
0x2b08082b2b2b0808,
0x2b08082b2b2b2b08,
0x2b08190808080819,
0x2b08190808081908,
0x2b08190808190808,
0x2b0819080819082b,
0x2b08190808191919,
0x2b08190819080808,
0x2b081908192b0808,
0x2b0819082b082b19,
0x2b08191908080808,
0x2b08191919081908,
0x2b0819192b2b1919,
0x2b08192b08192b08,
0x2b08192b192b2b2b,
0x2b082b0808080808,
0x2b082b0808082b08,
0x2b082b08082b1919,
0x2b082b0819192b2b,
0x2b082b082b080808,
0x2b082b082b08082b,
0x2b082b082b2b2b08,
0x2b082b190808192b,
0x2b082b2b082b082b,
0x2b082b2b2b080808,
0x2b082b2b2b082b08,
0x2b082b2b2b19192b,
0x2b082b2b2b2b2b08,
0x2b19080808080819,
0x2b19080808081908,
0x2b19080808190808,
0x2b19080819080808,
0x2b1908081919192b,
0x2b1908082b081908,
0x2b19081908080808,
0x2b190819082b082b,
0x2b190819192b1908,
0x2b19082b1919192b,
0x2b19082b2b082b19,
0x2b19190808080808,
0x2b19190808081919,
0x2b19190819081908,
0x2b19190819190808,
0x2b19190819192b08,
0x2b191919082b2b19,
0x2b1919192b190808,
0x2b1919192b19082b,
0x2b19192b19080819,
0x2b192b0819190819,
0x2b192b082b2b192b,
0x2b192b1919082b19,
0x2b192b2b08191919,
0x2b192b2b192b0808,
0x2b2b080808080808,
0x2b2b08080808082b,
0x2b2b080808082b08,
0x2b2b080808082b2b,
0x2b2b0808082b0808,
0x2b2b0808082b2b2b,
0x2b2b08082b2b0808,
0x2b2b081919190819,
0x2b2b081919192b19,
0x2b2b08192b2b192b,
0x2b2b082b08080808,
0x2b2b082b0808082b,
0x2b2b082b08082b08,
0x2b2b082b082b2b2b,
0x2b2b082b2b080808,
0x2b2b082b2b2b0808,
0x2b2b190819080808,
0x2b2b19082b191919,
0x2b2b192b192b1919,
0x2b2b192b2b192b08,
0x2b2b2b0808082b2b,
0x2b2b2b08082b0808,
0x2b2b2b08082b082b,
0x2b2b2b08082b2b08,
0x2b2b2b082b2b0808,
0x2b2b2b082b2b2b08,
0x2b2b2b1908081908,
0x2b2b2b192b081908,
0x2b2b2b192b08192b,
0x2b2b2b2b082b2b08,
0x2b2b2b2b082b2b2b,
0x2b2b2b2b2b190819,
0x2b2b2b2b2b2b2b2b,
];
pub(super) const IQ2S_GRID: [u64; 1024] = [
0x0808080808080808,
0x080808080808082b,
0x0808080808081919,
0x0808080808082b08,
0x0808080808082b2b,
0x0808080808190819,
0x0808080808191908,
0x080808080819192b,
0x0808080808192b19,
0x08080808082b0808,
0x08080808082b082b,
0x08080808082b1919,
0x08080808082b2b08,
0x0808080819080819,
0x0808080819081908,
0x080808081908192b,
0x0808080819082b19,
0x0808080819190808,
0x080808081919082b,
0x0808080819191919,
0x0808080819192b08,
0x08080808192b0819,
0x08080808192b1908,
0x08080808192b192b,
0x08080808192b2b19,
0x080808082b080808,
0x080808082b08082b,
0x080808082b081919,
0x080808082b082b08,
0x080808082b190819,
0x080808082b191908,
0x080808082b2b0808,
0x080808082b2b1919,
0x080808082b2b2b2b,
0x0808081908080819,
0x0808081908081908,
0x080808190808192b,
0x0808081908082b19,
0x0808081908190808,
0x080808190819082b,
0x0808081908191919,
0x0808081908192b08,
0x08080819082b0819,
0x08080819082b1908,
0x0808081919080808,
0x080808191908082b,
0x0808081919081919,
0x0808081919082b08,
0x0808081919190819,
0x0808081919191908,
0x080808191919192b,
0x0808081919192b19,
0x08080819192b0808,
0x08080819192b1919,
0x08080819192b2b08,
0x080808192b080819,
0x080808192b081908,
0x080808192b190808,
0x080808192b19082b,
0x080808192b191919,
0x080808192b2b0819,
0x080808192b2b1908,
0x0808082b08080808,
0x0808082b0808082b,
0x0808082b08081919,
0x0808082b08082b08,
0x0808082b08190819,
0x0808082b08191908,
0x0808082b082b0808,
0x0808082b082b2b2b,
0x0808082b19080819,
0x0808082b19081908,
0x0808082b1908192b,
0x0808082b19082b19,
0x0808082b19190808,
0x0808082b19191919,
0x0808082b2b080808,
0x0808082b2b081919,
0x0808082b2b082b2b,
0x0808082b2b191908,
0x0808082b2b2b082b,
0x0808190808080819,
0x0808190808081908,
0x080819080808192b,
0x0808190808082b19,
0x0808190808190808,
0x080819080819082b,
0x0808190808191919,
0x0808190808192b08,
0x08081908082b0819,
0x08081908082b1908,
0x08081908082b192b,
0x08081908082b2b19,
0x0808190819080808,
0x080819081908082b,
0x0808190819081919,
0x0808190819082b08,
0x0808190819082b2b,
0x0808190819190819,
0x0808190819191908,
0x080819081919192b,
0x0808190819192b19,
0x08081908192b0808,
0x08081908192b082b,
0x08081908192b1919,
0x080819082b080819,
0x080819082b081908,
0x080819082b08192b,
0x080819082b082b19,
0x080819082b190808,
0x080819082b191919,
0x080819082b192b08,
0x080819082b2b0819,
0x080819082b2b1908,
0x0808191908080808,
0x080819190808082b,
0x0808191908081919,
0x0808191908082b08,
0x0808191908082b2b,
0x0808191908190819,
0x0808191908191908,
0x080819190819192b,
0x0808191908192b19,
0x08081919082b0808,
0x08081919082b1919,
0x08081919082b2b08,
0x0808191919080819,
0x0808191919081908,
0x080819191908192b,
0x0808191919082b19,
0x0808191919190808,
0x080819191919082b,
0x0808191919191919,
0x0808191919192b08,
0x08081919192b0819,
0x08081919192b1908,
0x080819192b080808,
0x080819192b08082b,
0x080819192b081919,
0x080819192b082b08,
0x080819192b190819,
0x080819192b191908,
0x080819192b2b0808,
0x0808192b08080819,
0x0808192b08081908,
0x0808192b0808192b,
0x0808192b08082b19,
0x0808192b08190808,
0x0808192b08191919,
0x0808192b19080808,
0x0808192b19081919,
0x0808192b19082b08,
0x0808192b19190819,
0x0808192b19191908,
0x0808192b192b0808,
0x0808192b2b080819,
0x0808192b2b081908,
0x0808192b2b190808,
0x08082b0808080808,
0x08082b080808082b,
0x08082b0808081919,
0x08082b0808082b08,
0x08082b0808190819,
0x08082b0808191908,
0x08082b080819192b,
0x08082b0808192b19,
0x08082b08082b0808,
0x08082b08082b1919,
0x08082b08082b2b2b,
0x08082b0819080819,
0x08082b0819081908,
0x08082b081908192b,
0x08082b0819082b19,
0x08082b0819190808,
0x08082b081919082b,
0x08082b0819191919,
0x08082b0819192b08,
0x08082b08192b0819,
0x08082b08192b1908,
0x08082b082b080808,
0x08082b082b081919,
0x08082b082b191908,
0x08082b082b2b2b2b,
0x08082b1908080819,
0x08082b1908081908,
0x08082b1908190808,
0x08082b190819082b,
0x08082b1908191919,
0x08082b1908192b08,
0x08082b19082b0819,
0x08082b1919080808,
0x08082b1919081919,
0x08082b1919082b08,
0x08082b1919190819,
0x08082b1919191908,
0x08082b19192b0808,
0x08082b192b080819,
0x08082b192b190808,
0x08082b2b08080808,
0x08082b2b08190819,
0x08082b2b08191908,
0x08082b2b082b082b,
0x08082b2b082b2b08,
0x08082b2b082b2b2b,
0x08082b2b19190808,
0x08082b2b2b192b19,
0x0819080808080819,
0x0819080808081908,
0x081908080808192b,
0x0819080808082b19,
0x0819080808190808,
0x081908080819082b,
0x0819080808191919,
0x0819080808192b08,
0x08190808082b0819,
0x08190808082b1908,
0x08190808082b192b,
0x0819080819080808,
0x081908081908082b,
0x0819080819081919,
0x0819080819082b08,
0x0819080819190819,
0x0819080819191908,
0x081908081919192b,
0x0819080819192b19,
0x08190808192b0808,
0x08190808192b082b,
0x08190808192b1919,
0x08190808192b2b08,
0x081908082b080819,
0x081908082b081908,
0x081908082b08192b,
0x081908082b190808,
0x081908082b191919,
0x081908082b192b08,
0x081908082b2b0819,
0x081908082b2b1908,
0x0819081908080808,
0x081908190808082b,
0x0819081908081919,
0x0819081908082b08,
0x0819081908082b2b,
0x0819081908190819,
0x0819081908191908,
0x081908190819192b,
0x0819081908192b19,
0x08190819082b0808,
0x08190819082b082b,
0x08190819082b1919,
0x08190819082b2b08,
0x0819081919080819,
0x0819081919081908,
0x081908191908192b,
0x0819081919082b19,
0x0819081919190808,
0x081908191919082b,
0x0819081919191919,
0x0819081919192b08,
0x08190819192b0819,
0x08190819192b1908,
0x081908192b080808,
0x081908192b08082b,
0x081908192b081919,
0x081908192b082b08,
0x081908192b190819,
0x081908192b191908,
0x0819082b08080819,
0x0819082b08081908,
0x0819082b08082b19,
0x0819082b08190808,
0x0819082b08191919,
0x0819082b082b0819,
0x0819082b082b1908,
0x0819082b19080808,
0x0819082b19081919,
0x0819082b19190819,
0x0819082b19191908,
0x0819082b2b080819,
0x0819082b2b081908,
0x0819082b2b190808,
0x0819190808080808,
0x081919080808082b,
0x0819190808081919,
0x0819190808082b08,
0x0819190808190819,
0x0819190808191908,
0x081919080819192b,
0x0819190808192b19,
0x08191908082b0808,
0x08191908082b1919,
0x08191908082b2b08,
0x0819190819080819,
0x0819190819081908,
0x081919081908192b,
0x0819190819082b19,
0x0819190819190808,
0x081919081919082b,
0x0819190819191919,
0x0819190819192b08,
0x08191908192b0819,
0x08191908192b1908,
0x081919082b080808,
0x081919082b08082b,
0x081919082b081919,
0x081919082b082b08,
0x081919082b190819,
0x081919082b191908,
0x081919082b2b0808,
0x0819191908080819,
0x0819191908081908,
0x081919190808192b,
0x0819191908082b19,
0x0819191908190808,
0x081919190819082b,
0x0819191908191919,
0x0819191908192b08,
0x08191919082b0819,
0x08191919082b1908,
0x0819191919080808,
0x081919191908082b,
0x0819191919081919,
0x0819191919082b08,
0x0819191919190819,
0x0819191919191908,
0x08191919192b0808,
0x081919192b080819,
0x081919192b081908,
0x081919192b190808,
0x0819192b08080808,
0x0819192b08081919,
0x0819192b08082b08,
0x0819192b08190819,
0x0819192b08191908,
0x0819192b082b0808,
0x0819192b19080819,
0x0819192b19081908,
0x0819192b19190808,
0x0819192b2b080808,
0x0819192b2b2b2b2b,
0x08192b0808080819,
0x08192b0808081908,
0x08192b080808192b,
0x08192b0808082b19,
0x08192b0808190808,
0x08192b0808191919,
0x08192b0808192b08,
0x08192b08082b0819,
0x08192b0819080808,
0x08192b081908082b,
0x08192b0819081919,
0x08192b0819082b08,
0x08192b0819190819,
0x08192b0819191908,
0x08192b08192b0808,
0x08192b082b080819,
0x08192b082b081908,
0x08192b1908080808,
0x08192b190808082b,
0x08192b1908081919,
0x08192b1908082b08,
0x08192b1908190819,
0x08192b1908191908,
0x08192b19082b0808,
0x08192b1919080819,
0x08192b1919081908,
0x08192b1919190808,
0x08192b19192b2b19,
0x08192b192b2b082b,
0x08192b2b08081908,
0x08192b2b08190808,
0x08192b2b19080808,
0x08192b2b1919192b,
0x082b080808080808,
0x082b08080808082b,
0x082b080808081919,
0x082b080808082b08,
0x082b080808190819,
0x082b080808191908,
0x082b08080819192b,
0x082b080808192b19,
0x082b0808082b0808,
0x082b0808082b1919,
0x082b0808082b2b2b,
0x082b080819080819,
0x082b080819081908,
0x082b080819190808,
0x082b08081919082b,
0x082b080819191919,
0x082b0808192b1908,
0x082b08082b080808,
0x082b08082b082b2b,
0x082b08082b191908,
0x082b08082b2b2b2b,
0x082b081908080819,
0x082b081908081908,
0x082b081908190808,
0x082b08190819082b,
0x082b081908191919,
0x082b0819082b0819,
0x082b081919080808,
0x082b08191908082b,
0x082b081919081919,
0x082b081919190819,
0x082b081919191908,
0x082b0819192b0808,
0x082b08192b080819,
0x082b08192b081908,
0x082b08192b190808,
0x082b082b08080808,
0x082b082b08082b2b,
0x082b082b082b082b,
0x082b082b082b2b08,
0x082b082b082b2b2b,
0x082b082b19081908,
0x082b082b19190808,
0x082b082b2b082b08,
0x082b082b2b082b2b,
0x082b082b2b2b2b08,
0x082b190808080819,
0x082b190808081908,
0x082b19080808192b,
0x082b190808082b19,
0x082b190808190808,
0x082b190808191919,
0x082b190808192b08,
0x082b1908082b0819,
0x082b1908082b1908,
0x082b190819080808,
0x082b19081908082b,
0x082b190819081919,
0x082b190819082b08,
0x082b190819190819,
0x082b190819191908,
0x082b1908192b0808,
0x082b19082b080819,
0x082b19082b081908,
0x082b19082b190808,
0x082b191908080808,
0x082b191908081919,
0x082b191908082b08,
0x082b191908190819,
0x082b191908191908,
0x082b1919082b0808,
0x082b191919080819,
0x082b191919081908,
0x082b191919190808,
0x082b1919192b192b,
0x082b19192b080808,
0x082b192b08080819,
0x082b192b08081908,
0x082b192b08190808,
0x082b192b19080808,
0x082b192b19192b19,
0x082b2b0808080808,
0x082b2b0808081919,
0x082b2b0808190819,
0x082b2b0808191908,
0x082b2b0819080819,
0x082b2b0819081908,
0x082b2b0819190808,
0x082b2b082b082b2b,
0x082b2b082b2b2b2b,
0x082b2b1908080819,
0x082b2b1908081908,
0x082b2b1908190808,
0x082b2b192b191919,
0x082b2b2b08082b2b,
0x082b2b2b082b082b,
0x082b2b2b192b1908,
0x082b2b2b2b082b08,
0x082b2b2b2b082b2b,
0x1908080808080819,
0x1908080808081908,
0x190808080808192b,
0x1908080808082b19,
0x1908080808190808,
0x190808080819082b,
0x1908080808191919,
0x1908080808192b08,
0x1908080808192b2b,
0x19080808082b0819,
0x19080808082b1908,
0x19080808082b192b,
0x1908080819080808,
0x190808081908082b,
0x1908080819081919,
0x1908080819082b08,
0x1908080819082b2b,
0x1908080819190819,
0x1908080819191908,
0x190808081919192b,
0x1908080819192b19,
0x19080808192b0808,
0x19080808192b082b,
0x19080808192b1919,
0x190808082b080819,
0x190808082b081908,
0x190808082b190808,
0x190808082b191919,
0x190808082b192b08,
0x190808082b2b0819,
0x190808082b2b1908,
0x1908081908080808,
0x190808190808082b,
0x1908081908081919,
0x1908081908082b08,
0x1908081908190819,
0x1908081908191908,
0x190808190819192b,
0x1908081908192b19,
0x19080819082b0808,
0x19080819082b082b,
0x19080819082b1919,
0x1908081919080819,
0x1908081919081908,
0x190808191908192b,
0x1908081919082b19,
0x1908081919190808,
0x190808191919082b,
0x1908081919191919,
0x1908081919192b08,
0x19080819192b0819,
0x19080819192b1908,
0x190808192b080808,
0x190808192b08082b,
0x190808192b081919,
0x190808192b082b08,
0x190808192b190819,
0x190808192b191908,
0x190808192b2b0808,
0x1908082b08080819,
0x1908082b08081908,
0x1908082b08190808,
0x1908082b0819082b,
0x1908082b08191919,
0x1908082b08192b08,
0x1908082b082b1908,
0x1908082b19080808,
0x1908082b19081919,
0x1908082b19082b08,
0x1908082b19190819,
0x1908082b19191908,
0x1908082b192b0808,
0x1908082b2b080819,
0x1908082b2b081908,
0x1908190808080808,
0x190819080808082b,
0x1908190808081919,
0x1908190808082b08,
0x1908190808082b2b,
0x1908190808190819,
0x1908190808191908,
0x190819080819192b,
0x1908190808192b19,
0x19081908082b0808,
0x19081908082b082b,
0x19081908082b1919,
0x19081908082b2b08,
0x1908190819080819,
0x1908190819081908,
0x190819081908192b,
0x1908190819082b19,
0x1908190819190808,
0x190819081919082b,
0x1908190819191919,
0x1908190819192b08,
0x19081908192b0819,
0x19081908192b1908,
0x190819082b080808,
0x190819082b08082b,
0x190819082b081919,
0x190819082b082b08,
0x190819082b190819,
0x190819082b191908,
0x190819082b2b0808,
0x1908191908080819,
0x1908191908081908,
0x190819190808192b,
0x1908191908082b19,
0x1908191908190808,
0x190819190819082b,
0x1908191908191919,
0x1908191908192b08,
0x19081919082b0819,
0x19081919082b1908,
0x1908191919080808,
0x190819191908082b,
0x1908191919081919,
0x1908191919082b08,
0x1908191919190819,
0x1908191919191908,
0x19081919192b0808,
0x19081919192b2b2b,
0x190819192b080819,
0x190819192b081908,
0x190819192b190808,
0x1908192b08080808,
0x1908192b0808082b,
0x1908192b08081919,
0x1908192b08082b08,
0x1908192b08190819,
0x1908192b08191908,
0x1908192b082b0808,
0x1908192b19080819,
0x1908192b19081908,
0x1908192b19190808,
0x1908192b2b080808,
0x1908192b2b2b1919,
0x19082b0808080819,
0x19082b0808081908,
0x19082b0808082b19,
0x19082b0808190808,
0x19082b080819082b,
0x19082b0808191919,
0x19082b0808192b08,
0x19082b08082b0819,
0x19082b08082b1908,
0x19082b0819080808,
0x19082b081908082b,
0x19082b0819081919,
0x19082b0819082b08,
0x19082b0819190819,
0x19082b0819191908,
0x19082b08192b0808,
0x19082b082b081908,
0x19082b082b190808,
0x19082b1908080808,
0x19082b190808082b,
0x19082b1908081919,
0x19082b1908082b08,
0x19082b1908190819,
0x19082b1908191908,
0x19082b19082b0808,
0x19082b1919080819,
0x19082b1919081908,
0x19082b1919190808,
0x19082b192b080808,
0x19082b192b19192b,
0x19082b2b08080819,
0x19082b2b08081908,
0x19082b2b08190808,
0x19082b2b19080808,
0x1919080808080808,
0x191908080808082b,
0x1919080808081919,
0x1919080808082b08,
0x1919080808190819,
0x1919080808191908,
0x191908080819192b,
0x1919080808192b19,
0x19190808082b0808,
0x19190808082b082b,
0x19190808082b1919,
0x19190808082b2b08,
0x1919080819080819,
0x1919080819081908,
0x191908081908192b,
0x1919080819082b19,
0x1919080819190808,
0x191908081919082b,
0x1919080819191919,
0x1919080819192b08,
0x19190808192b0819,
0x19190808192b1908,
0x191908082b080808,
0x191908082b08082b,
0x191908082b081919,
0x191908082b082b08,
0x191908082b190819,
0x191908082b191908,
0x1919081908080819,
0x1919081908081908,
0x191908190808192b,
0x1919081908082b19,
0x1919081908190808,
0x191908190819082b,
0x1919081908191919,
0x1919081908192b08,
0x19190819082b0819,
0x19190819082b1908,
0x1919081919080808,
0x191908191908082b,
0x1919081919081919,
0x1919081919082b08,
0x1919081919190819,
0x1919081919191908,
0x19190819192b0808,
0x191908192b080819,
0x191908192b081908,
0x191908192b190808,
0x1919082b08080808,
0x1919082b08081919,
0x1919082b08082b08,
0x1919082b08190819,
0x1919082b08191908,
0x1919082b082b0808,
0x1919082b19080819,
0x1919082b19081908,
0x1919082b19190808,
0x1919082b192b2b19,
0x1919082b2b080808,
0x1919190808080819,
0x1919190808081908,
0x191919080808192b,
0x1919190808082b19,
0x1919190808190808,
0x191919080819082b,
0x1919190808191919,
0x1919190808192b08,
0x19191908082b0819,
0x19191908082b1908,
0x1919190819080808,
0x191919081908082b,
0x1919190819081919,
0x1919190819082b08,
0x1919190819190819,
0x1919190819191908,
0x19191908192b0808,
0x191919082b080819,
0x191919082b081908,
0x191919082b190808,
0x1919191908080808,
0x191919190808082b,
0x1919191908081919,
0x1919191908082b08,
0x1919191908190819,
0x1919191908191908,
0x19191919082b0808,
0x1919191919080819,
0x1919191919081908,
0x1919191919190808,
0x191919192b080808,
0x1919192b08080819,
0x1919192b08081908,
0x1919192b08190808,
0x1919192b082b192b,
0x1919192b19080808,
0x19192b0808080808,
0x19192b080808082b,
0x19192b0808081919,
0x19192b0808082b08,
0x19192b0808190819,
0x19192b0808191908,
0x19192b08082b0808,
0x19192b0819080819,
0x19192b0819081908,
0x19192b0819190808,
0x19192b0819192b2b,
0x19192b082b080808,
0x19192b1908080819,
0x19192b1908081908,
0x19192b1908190808,
0x19192b1919080808,
0x19192b2b08080808,
0x19192b2b08192b19,
0x19192b2b2b081919,
0x19192b2b2b2b2b08,
0x192b080808080819,
0x192b080808081908,
0x192b08080808192b,
0x192b080808190808,
0x192b08080819082b,
0x192b080808191919,
0x192b080808192b08,
0x192b0808082b0819,
0x192b0808082b1908,
0x192b080819080808,
0x192b080819081919,
0x192b080819082b08,
0x192b080819190819,
0x192b080819191908,
0x192b0808192b0808,
0x192b08082b081908,
0x192b08082b190808,
0x192b081908080808,
0x192b08190808082b,
0x192b081908081919,
0x192b081908082b08,
0x192b081908190819,
0x192b081908191908,
0x192b0819082b0808,
0x192b081919080819,
0x192b081919081908,
0x192b081919190808,
0x192b08192b080808,
0x192b08192b192b19,
0x192b082b08081908,
0x192b082b08190808,
0x192b082b19080808,
0x192b082b1919192b,
0x192b082b2b2b0819,
0x192b190808080808,
0x192b190808081919,
0x192b190808082b08,
0x192b190808190819,
0x192b190808191908,
0x192b1908082b0808,
0x192b190819080819,
0x192b190819081908,
0x192b190819190808,
0x192b19082b080808,
0x192b191908080819,
0x192b191908081908,
0x192b191908190808,
0x192b191919080808,
0x192b191919082b2b,
0x192b1919192b2b08,
0x192b19192b19082b,
0x192b192b08080808,
0x192b192b2b191908,
0x192b2b0808080819,
0x192b2b0808081908,
0x192b2b0808190808,
0x192b2b08192b1919,
0x192b2b082b192b08,
0x192b2b1908080808,
0x192b2b19082b2b2b,
0x192b2b2b1908082b,
0x192b2b2b2b2b0819,
0x2b08080808080808,
0x2b0808080808082b,
0x2b08080808081919,
0x2b08080808082b08,
0x2b08080808190819,
0x2b08080808191908,
0x2b08080808192b19,
0x2b080808082b0808,
0x2b080808082b1919,
0x2b08080819080819,
0x2b08080819081908,
0x2b08080819190808,
0x2b0808081919082b,
0x2b08080819191919,
0x2b08080819192b08,
0x2b080808192b0819,
0x2b0808082b080808,
0x2b0808082b081919,
0x2b0808082b190819,
0x2b0808082b191908,
0x2b08081908080819,
0x2b08081908081908,
0x2b08081908082b19,
0x2b08081908190808,
0x2b0808190819082b,
0x2b08081908191919,
0x2b08081908192b08,
0x2b080819082b0819,
0x2b080819082b1908,
0x2b08081919080808,
0x2b0808191908082b,
0x2b08081919081919,
0x2b08081919082b08,
0x2b08081919190819,
0x2b08081919191908,
0x2b0808192b080819,
0x2b0808192b081908,
0x2b0808192b190808,
0x2b0808192b2b2b19,
0x2b08082b08080808,
0x2b08082b08081919,
0x2b08082b08082b2b,
0x2b08082b08190819,
0x2b08082b08191908,
0x2b08082b19080819,
0x2b08082b19081908,
0x2b08082b19190808,
0x2b08190808080819,
0x2b08190808081908,
0x2b0819080808192b,
0x2b08190808082b19,
0x2b08190808190808,
0x2b0819080819082b,
0x2b08190808191919,
0x2b08190808192b08,
0x2b081908082b0819,
0x2b08190819080808,
0x2b0819081908082b,
0x2b08190819081919,
0x2b08190819082b08,
0x2b08190819190819,
0x2b08190819191908,
0x2b081908192b0808,
0x2b0819082b080819,
0x2b0819082b081908,
0x2b0819082b190808,
0x2b08191908080808,
0x2b0819190808082b,
0x2b08191908081919,
0x2b08191908082b08,
0x2b08191908190819,
0x2b08191908191908,
0x2b081919082b0808,
0x2b08191919080819,
0x2b08191919081908,
0x2b08191919190808,
0x2b0819192b080808,
0x2b0819192b082b2b,
0x2b08192b08080819,
0x2b08192b08081908,
0x2b08192b08190808,
0x2b08192b082b2b19,
0x2b08192b19080808,
0x2b082b0808080808,
0x2b082b0808081919,
0x2b082b0808190819,
0x2b082b0808191908,
0x2b082b0819080819,
0x2b082b0819081908,
0x2b082b0819190808,
0x2b082b082b2b082b,
0x2b082b1908080819,
0x2b082b1908081908,
0x2b082b1919080808,
0x2b082b19192b1919,
0x2b082b2b082b082b,
0x2b082b2b19192b08,
0x2b082b2b19192b2b,
0x2b082b2b2b08082b,
0x2b082b2b2b2b082b,
0x2b19080808080819,
0x2b19080808081908,
0x2b19080808082b19,
0x2b19080808190808,
0x2b1908080819082b,
0x2b19080808191919,
0x2b19080808192b08,
0x2b190808082b1908,
0x2b19080819080808,
0x2b1908081908082b,
0x2b19080819081919,
0x2b19080819082b08,
0x2b19080819190819,
0x2b19080819191908,
0x2b190808192b0808,
0x2b1908082b080819,
0x2b1908082b081908,
0x2b1908082b190808,
0x2b19081908080808,
0x2b19081908081919,
0x2b19081908190819,
0x2b19081908191908,
0x2b19081919080819,
0x2b19081919081908,
0x2b19081919190808,
0x2b19081919192b2b,
0x2b19082b08080819,
0x2b19082b08081908,
0x2b19082b08190808,
0x2b19082b19080808,
0x2b19082b2b2b192b,
0x2b19190808080808,
0x2b1919080808082b,
0x2b19190808081919,
0x2b19190808082b08,
0x2b19190808190819,
0x2b19190808191908,
0x2b191908082b0808,
0x2b19190819080819,
0x2b19190819081908,
0x2b19190819190808,
0x2b1919082b080808,
0x2b1919082b19192b,
0x2b19191908080819,
0x2b19191908081908,
0x2b19191908190808,
0x2b19191919080808,
0x2b1919192b192b08,
0x2b1919192b2b0819,
0x2b19192b08080808,
0x2b19192b1908192b,
0x2b19192b192b1908,
0x2b192b0808080819,
0x2b192b0808081908,
0x2b192b0808190808,
0x2b192b08082b192b,
0x2b192b0819080808,
0x2b192b082b2b2b19,
0x2b192b1908080808,
0x2b192b1919082b19,
0x2b192b191919082b,
0x2b192b2b2b190808,
0x2b2b080808080808,
0x2b2b080808081919,
0x2b2b080808082b2b,
0x2b2b080808191908,
0x2b2b0808082b082b,
0x2b2b0808082b2b2b,
0x2b2b080819080819,
0x2b2b080819081908,
0x2b2b080819190808,
0x2b2b08082b2b082b,
0x2b2b08082b2b2b2b,
0x2b2b081919080808,
0x2b2b0819192b1919,
0x2b2b082b0808082b,
0x2b2b082b08082b2b,
0x2b2b082b082b082b,
0x2b2b082b082b2b08,
0x2b2b082b082b2b2b,
0x2b2b082b2b08082b,
0x2b2b082b2b082b08,
0x2b2b082b2b082b2b,
0x2b2b082b2b2b2b08,
0x2b2b190808080819,
0x2b2b190808081908,
0x2b2b190808190808,
0x2b2b190819080808,
0x2b2b19082b082b19,
0x2b2b19082b2b1908,
0x2b2b191908080808,
0x2b2b191908192b19,
0x2b2b192b19190819,
0x2b2b2b0808082b2b,
0x2b2b2b08082b2b08,
0x2b2b2b082b2b082b,
0x2b2b2b1919191908,
0x2b2b2b192b08192b,
0x2b2b2b2b08082b08,
0x2b2b2b2b08082b2b,
0x2b2b2b2b082b0808,
0x2b2b2b2b082b082b,
0x2b2b2b2b082b2b08,
0x2b2b2b2b2b082b08,
0x2b2b2b2b2b2b2b2b,
];
pub(super) const IQ3XXS_GRID: [u32; 256] = [
0x04040404, 0x04040414, 0x04040424, 0x04040c0c, 0x04040c1c, 0x04040c3e, 0x04041404,
0x04041414, 0x04041c0c, 0x04042414, 0x04043e1c, 0x04043e2c, 0x040c040c, 0x040c041c,
0x040c0c04, 0x040c0c14, 0x040c140c, 0x040c142c, 0x040c1c04, 0x040c1c14, 0x040c240c,
0x040c2c24, 0x040c3e04, 0x04140404, 0x04140414, 0x04140424, 0x04140c0c, 0x04141404,
0x04141414, 0x04141c0c, 0x04141c1c, 0x04141c3e, 0x04142c0c, 0x04142c3e, 0x04143e2c,
0x041c040c, 0x041c043e, 0x041c0c04, 0x041c0c14, 0x041c142c, 0x041c3e04, 0x04240c1c,
0x04241c3e, 0x04242424, 0x04242c3e, 0x04243e1c, 0x04243e2c, 0x042c040c, 0x042c043e,
0x042c1c14, 0x042c2c14, 0x04341c2c, 0x04343424, 0x043e0c04, 0x043e0c24, 0x043e0c34,
0x043e241c, 0x043e340c, 0x0c04040c, 0x0c04041c, 0x0c040c04, 0x0c040c14, 0x0c04140c,
0x0c04141c, 0x0c041c04, 0x0c041c14, 0x0c041c24, 0x0c04243e, 0x0c042c04, 0x0c0c0404,
0x0c0c0414, 0x0c0c0c0c, 0x0c0c1404, 0x0c0c1414, 0x0c14040c, 0x0c14041c, 0x0c140c04,
0x0c140c14, 0x0c14140c, 0x0c141c04, 0x0c143e14, 0x0c1c0404, 0x0c1c0414, 0x0c1c1404,
0x0c1c1c0c, 0x0c1c2434, 0x0c1c3434, 0x0c24040c, 0x0c24042c, 0x0c242c04, 0x0c2c1404,
0x0c2c1424, 0x0c2c2434, 0x0c2c3e0c, 0x0c34042c, 0x0c3e1414, 0x0c3e2404, 0x14040404,
0x14040414, 0x14040c0c, 0x14040c1c, 0x14041404, 0x14041414, 0x14041434, 0x14041c0c,
0x14042414, 0x140c040c, 0x140c041c, 0x140c042c, 0x140c0c04, 0x140c0c14, 0x140c140c,
0x140c1c04, 0x140c341c, 0x140c343e, 0x140c3e04, 0x14140404, 0x14140414, 0x14140c0c,
0x14140c3e, 0x14141404, 0x14141414, 0x14141c3e, 0x14142404, 0x14142c2c, 0x141c040c,
0x141c0c04, 0x141c0c24, 0x141c3e04, 0x141c3e24, 0x14241c2c, 0x14242c1c, 0x142c041c,
0x142c143e, 0x142c240c, 0x142c3e24, 0x143e040c, 0x143e041c, 0x143e0c34, 0x143e242c,
0x1c04040c, 0x1c040c04, 0x1c040c14, 0x1c04140c, 0x1c04141c, 0x1c042c04, 0x1c04342c,
0x1c043e14, 0x1c0c0404, 0x1c0c0414, 0x1c0c1404, 0x1c0c1c0c, 0x1c0c2424, 0x1c0c2434,
0x1c14040c, 0x1c14041c, 0x1c140c04, 0x1c14142c, 0x1c142c14, 0x1c143e14, 0x1c1c0c0c,
0x1c1c1c1c, 0x1c241c04, 0x1c24243e, 0x1c243e14, 0x1c2c0404, 0x1c2c0434, 0x1c2c1414,
0x1c2c2c2c, 0x1c340c24, 0x1c341c34, 0x1c34341c, 0x1c3e1c1c, 0x1c3e3404, 0x24040424,
0x24040c3e, 0x24041c2c, 0x24041c3e, 0x24042c1c, 0x24042c3e, 0x240c3e24, 0x24141404,
0x24141c3e, 0x24142404, 0x24143404, 0x24143434, 0x241c043e, 0x241c242c, 0x24240424,
0x24242c0c, 0x24243424, 0x242c142c, 0x242c241c, 0x242c3e04, 0x243e042c, 0x243e0c04,
0x243e0c14, 0x243e1c04, 0x2c040c14, 0x2c04240c, 0x2c043e04, 0x2c0c0404, 0x2c0c0434,
0x2c0c1434, 0x2c0c2c2c, 0x2c140c24, 0x2c141c14, 0x2c143e14, 0x2c1c0414, 0x2c1c2c1c,
0x2c240c04, 0x2c24141c, 0x2c24143e, 0x2c243e14, 0x2c2c0414, 0x2c2c1c0c, 0x2c342c04,
0x2c3e1424, 0x2c3e2414, 0x34041424, 0x34042424, 0x34042434, 0x34043424, 0x340c140c,
0x340c340c, 0x34140c3e, 0x34143424, 0x341c1c04, 0x341c1c34, 0x34242424, 0x342c042c,
0x342c2c14, 0x34341c1c, 0x343e041c, 0x343e140c, 0x3e04041c, 0x3e04042c, 0x3e04043e,
0x3e040c04, 0x3e041c14, 0x3e042c14, 0x3e0c1434, 0x3e0c2404, 0x3e140c14, 0x3e14242c,
0x3e142c14, 0x3e1c0404, 0x3e1c0c2c, 0x3e1c1c1c, 0x3e1c3404, 0x3e24140c, 0x3e24240c,
0x3e2c0404, 0x3e2c0414, 0x3e2c1424, 0x3e341c04,
];
pub(super) const IQ3S_GRID: [u32; 512] = [
0x01010101, 0x01010103, 0x01010105, 0x0101010b, 0x0101010f, 0x01010301, 0x01010303,
0x01010305, 0x01010309, 0x0101030d, 0x01010501, 0x01010503, 0x0101050b, 0x01010707,
0x01010901, 0x01010905, 0x0101090b, 0x0101090f, 0x01010b03, 0x01010b07, 0x01010d01,
0x01010d05, 0x01010f03, 0x01010f09, 0x01010f0f, 0x01030101, 0x01030103, 0x01030105,
0x01030109, 0x01030301, 0x01030303, 0x0103030b, 0x01030501, 0x01030507, 0x0103050f,
0x01030703, 0x0103070b, 0x01030909, 0x01030d03, 0x01030d0b, 0x01030f05, 0x01050101,
0x01050103, 0x0105010b, 0x0105010f, 0x01050301, 0x01050307, 0x0105030d, 0x01050503,
0x0105050b, 0x01050701, 0x01050709, 0x01050905, 0x0105090b, 0x0105090f, 0x01050b03,
0x01050b07, 0x01050f01, 0x01050f07, 0x01070107, 0x01070303, 0x0107030b, 0x01070501,
0x01070505, 0x01070703, 0x01070707, 0x0107070d, 0x01070909, 0x01070b01, 0x01070b05,
0x01070d0f, 0x01070f03, 0x01070f0b, 0x01090101, 0x01090307, 0x0109030f, 0x01090503,
0x01090509, 0x01090705, 0x01090901, 0x01090907, 0x01090b03, 0x01090f01, 0x010b0105,
0x010b0109, 0x010b0501, 0x010b0505, 0x010b050d, 0x010b0707, 0x010b0903, 0x010b090b,
0x010b090f, 0x010b0d0d, 0x010b0f07, 0x010d010d, 0x010d0303, 0x010d0307, 0x010d0703,
0x010d0b05, 0x010d0f03, 0x010f0101, 0x010f0105, 0x010f0109, 0x010f0501, 0x010f0505,
0x010f050d, 0x010f0707, 0x010f0b01, 0x010f0b09, 0x03010101, 0x03010103, 0x03010105,
0x03010109, 0x03010301, 0x03010303, 0x03010307, 0x0301030b, 0x0301030f, 0x03010501,
0x03010505, 0x03010703, 0x03010709, 0x0301070d, 0x03010b09, 0x03010b0d, 0x03010d03,
0x03010f05, 0x03030101, 0x03030103, 0x03030107, 0x0303010d, 0x03030301, 0x03030309,
0x03030503, 0x03030701, 0x03030707, 0x03030903, 0x03030b01, 0x03030b05, 0x03030f01,
0x03030f0d, 0x03050101, 0x03050305, 0x0305030b, 0x0305030f, 0x03050501, 0x03050509,
0x03050705, 0x03050901, 0x03050907, 0x03050b0b, 0x03050d01, 0x03050f05, 0x03070103,
0x03070109, 0x0307010f, 0x03070301, 0x03070307, 0x03070503, 0x0307050f, 0x03070701,
0x03070709, 0x03070903, 0x03070d05, 0x03070f01, 0x03090107, 0x0309010b, 0x03090305,
0x03090309, 0x03090703, 0x03090707, 0x03090905, 0x0309090d, 0x03090b01, 0x03090b09,
0x030b0103, 0x030b0301, 0x030b0307, 0x030b0503, 0x030b0701, 0x030b0705, 0x030b0b03,
0x030d0501, 0x030d0509, 0x030d050f, 0x030d0909, 0x030d090d, 0x030f0103, 0x030f0107,
0x030f0301, 0x030f0305, 0x030f0503, 0x030f070b, 0x030f0903, 0x030f0d05, 0x030f0f01,
0x05010101, 0x05010103, 0x05010107, 0x0501010b, 0x0501010f, 0x05010301, 0x05010305,
0x05010309, 0x0501030d, 0x05010503, 0x05010507, 0x0501050f, 0x05010701, 0x05010705,
0x05010903, 0x05010907, 0x0501090b, 0x05010b01, 0x05010b05, 0x05010d0f, 0x05010f01,
0x05010f07, 0x05010f0b, 0x05030101, 0x05030105, 0x05030301, 0x05030307, 0x0503030f,
0x05030505, 0x0503050b, 0x05030703, 0x05030709, 0x05030905, 0x05030b03, 0x05050103,
0x05050109, 0x0505010f, 0x05050503, 0x05050507, 0x05050701, 0x0505070f, 0x05050903,
0x05050b07, 0x05050b0f, 0x05050f03, 0x05050f09, 0x05070101, 0x05070105, 0x0507010b,
0x05070303, 0x05070505, 0x05070509, 0x05070703, 0x05070707, 0x05070905, 0x05070b01,
0x05070d0d, 0x05090103, 0x0509010f, 0x05090501, 0x05090507, 0x05090705, 0x0509070b,
0x05090903, 0x05090f05, 0x05090f0b, 0x050b0109, 0x050b0303, 0x050b0505, 0x050b070f,
0x050b0901, 0x050b0b07, 0x050b0f01, 0x050d0101, 0x050d0105, 0x050d010f, 0x050d0503,
0x050d0b0b, 0x050d0d03, 0x050f010b, 0x050f0303, 0x050f050d, 0x050f0701, 0x050f0907,
0x050f0b01, 0x07010105, 0x07010303, 0x07010307, 0x0701030b, 0x0701030f, 0x07010505,
0x07010703, 0x07010707, 0x0701070b, 0x07010905, 0x07010909, 0x0701090f, 0x07010b03,
0x07010d07, 0x07010f03, 0x07030103, 0x07030107, 0x0703010b, 0x07030309, 0x07030503,
0x07030507, 0x07030901, 0x07030d01, 0x07030f05, 0x07030f0d, 0x07050101, 0x07050305,
0x07050501, 0x07050705, 0x07050709, 0x07050b01, 0x07070103, 0x07070301, 0x07070309,
0x07070503, 0x07070507, 0x0707050f, 0x07070701, 0x07070903, 0x07070907, 0x0707090f,
0x07070b0b, 0x07070f07, 0x07090107, 0x07090303, 0x0709030d, 0x07090505, 0x07090703,
0x07090b05, 0x07090d01, 0x07090d09, 0x070b0103, 0x070b0301, 0x070b0305, 0x070b050b,
0x070b0705, 0x070b0909, 0x070b0b0d, 0x070b0f07, 0x070d030d, 0x070d0903, 0x070f0103,
0x070f0107, 0x070f0501, 0x070f0505, 0x070f070b, 0x09010101, 0x09010109, 0x09010305,
0x09010501, 0x09010509, 0x0901050f, 0x09010705, 0x09010903, 0x09010b01, 0x09010f01,
0x09030105, 0x0903010f, 0x09030303, 0x09030307, 0x09030505, 0x09030701, 0x0903070b,
0x09030907, 0x09030b03, 0x09030b0b, 0x09050103, 0x09050107, 0x09050301, 0x0905030b,
0x09050503, 0x09050707, 0x09050901, 0x09050b0f, 0x09050d05, 0x09050f01, 0x09070109,
0x09070303, 0x09070307, 0x09070501, 0x09070505, 0x09070703, 0x0907070b, 0x09090101,
0x09090105, 0x09090509, 0x0909070f, 0x09090901, 0x09090f03, 0x090b010b, 0x090b010f,
0x090b0503, 0x090b0d05, 0x090d0307, 0x090d0709, 0x090d0d01, 0x090f0301, 0x090f030b,
0x090f0701, 0x090f0907, 0x090f0b03, 0x0b010105, 0x0b010301, 0x0b010309, 0x0b010505,
0x0b010901, 0x0b010909, 0x0b01090f, 0x0b010b05, 0x0b010d0d, 0x0b010f09, 0x0b030103,
0x0b030107, 0x0b03010b, 0x0b030305, 0x0b030503, 0x0b030705, 0x0b030f05, 0x0b050101,
0x0b050303, 0x0b050507, 0x0b050701, 0x0b05070d, 0x0b050b07, 0x0b070105, 0x0b07010f,
0x0b070301, 0x0b07050f, 0x0b070909, 0x0b070b03, 0x0b070d0b, 0x0b070f07, 0x0b090103,
0x0b090109, 0x0b090501, 0x0b090705, 0x0b09090d, 0x0b0b0305, 0x0b0b050d, 0x0b0b0b03,
0x0b0b0b07, 0x0b0d0905, 0x0b0f0105, 0x0b0f0109, 0x0b0f0505, 0x0d010303, 0x0d010307,
0x0d01030b, 0x0d010703, 0x0d010707, 0x0d010d01, 0x0d030101, 0x0d030501, 0x0d03050f,
0x0d030d09, 0x0d050305, 0x0d050709, 0x0d050905, 0x0d050b0b, 0x0d050d05, 0x0d050f01,
0x0d070101, 0x0d070309, 0x0d070503, 0x0d070901, 0x0d09050b, 0x0d090907, 0x0d090d05,
0x0d0b0101, 0x0d0b0107, 0x0d0b0709, 0x0d0b0d01, 0x0d0d010b, 0x0d0d0901, 0x0d0f0303,
0x0d0f0307, 0x0f010101, 0x0f010109, 0x0f01010f, 0x0f010501, 0x0f010505, 0x0f01070d,
0x0f010901, 0x0f010b09, 0x0f010d05, 0x0f030105, 0x0f030303, 0x0f030509, 0x0f030907,
0x0f03090b, 0x0f050103, 0x0f050109, 0x0f050301, 0x0f05030d, 0x0f050503, 0x0f050701,
0x0f050b03, 0x0f070105, 0x0f070705, 0x0f07070b, 0x0f070b07, 0x0f090103, 0x0f09010b,
0x0f090307, 0x0f090501, 0x0f090b01, 0x0f0b0505, 0x0f0b0905, 0x0f0d0105, 0x0f0d0703,
0x0f0f0101,
];
pub(super) const IQ1S_DELTA: f32 = 0.125;
pub(super) const IQ1S_GRID: [u64; 2048] = [
0xffffffffffffffff,
0xffffffffffffff01,
0xffffffffffff0000,
0xffffffffffff01ff,
0xffffffffffff0101,
0xffffffffff00ff00,
0xffffffffff000000,
0xffffffffff01ffff,
0xffffffffff01ff01,
0xffffffffff0101ff,
0xffffffffff010101,
0xffffffff00ff0000,
0xffffffff0000ff00,
0xffffffff000000ff,
0xffffffff00000001,
0xffffffff00010000,
0xffffffff01ffffff,
0xffffffff01ffff01,
0xffffffff01ff01ff,
0xffffffff01ff0101,
0xffffffff01000000,
0xffffffff0101ffff,
0xffffffff0101ff01,
0xffffffff010101ff,
0xffffffff01010101,
0xffffff00ffff00ff,
0xffffff00ffff0000,
0xffffff00ff00ff00,
0xffffff00ff0000ff,
0xffffff00ff000001,
0xffffff00ff000100,
0xffffff00ff000101,
0xffffff00ff010000,
0xffffff0000ffff00,
0xffffff0000ff0001,
0xffffff0000ff0100,
0xffffff000000ff01,
0xffffff0000000000,
0xffffff0000000101,
0xffffff000001ff00,
0xffffff00000100ff,
0xffffff0000010001,
0xffffff00000101ff,
0xffffff0001ff0000,
0xffffff000100ff00,
0xffffff00010000ff,
0xffffff0001000001,
0xffffff0001010000,
0xffffff01ffffffff,
0xffffff01ffffff01,
0xffffff01ffff01ff,
0xffffff01ffff0101,
0xffffff01ff000000,
0xffffff01ff01ffff,
0xffffff01ff01ff01,
0xffffff01ff0101ff,
0xffffff01ff010101,
0xffffff0100ff0000,
0xffffff010000ff00,
0xffffff0100000100,
0xffffff01000100ff,
0xffffff0100010100,
0xffffff0101ffffff,
0xffffff0101ffff01,
0xffffff0101ff01ff,
0xffffff0101ff0101,
0xffffff010100ff00,
0xffffff0101000000,
0xffffff0101000100,
0xffffff010101ffff,
0xffffff010101ff01,
0xffffff01010101ff,
0xffffff0101010101,
0xffff00ffff00ff00,
0xffff00ffff0000ff,
0xffff00ffff000001,
0xffff00ffff010000,
0xffff00ff00ffff00,
0xffff00ff00ff0100,
0xffff00ff00000000,
0xffff00ff00000101,
0xffff00ff000100ff,
0xffff00ff00010000,
0xffff00ff0100ff00,
0xffff00ff01000100,
0xffff00ff01010000,
0xffff0000ffffff00,
0xffff0000ffff00ff,
0xffff0000ffff0000,
0xffff0000ffff0001,
0xffff0000ff000000,
0xffff0000ff0001ff,
0xffff0000ff000101,
0xffff0000ff010100,
0xffff000000ffffff,
0xffff000000ff0000,
0xffff000000ff0101,
0xffff00000000ffff,
0xffff00000000ff00,
0xffff0000000000ff,
0xffff000000000000,
0xffff000000000001,
0xffff000000000100,
0xffff00000001ffff,
0xffff00000001ff01,
0xffff000000010000,
0xffff0000000101ff,
0xffff000000010101,
0xffff000001ffff00,
0xffff00000100ff00,
0xffff000001000000,
0xffff0000010001ff,
0xffff000001000101,
0xffff00000101ff00,
0xffff0000010100ff,
0xffff000001010000,
0xffff000001010001,
0xffff000001010100,
0xffff0001ff0000ff,
0xffff0001ff000100,
0xffff000100ffff00,
0xffff000100ff00ff,
0xffff00010000ffff,
0xffff00010000ff01,
0xffff000100000000,
0xffff0001000001ff,
0xffff00010001ffff,
0xffff00010001ff00,
0xffff000100010001,
0xffff000100010100,
0xffff000101ff0000,
0xffff00010100ff00,
0xffff0001010000ff,
0xffff000101000100,
0xffff01ffffffffff,
0xffff01ffffffff01,
0xffff01ffffff01ff,
0xffff01ffffff0101,
0xffff01ffff000000,
0xffff01ffff01ffff,
0xffff01ffff01ff01,
0xffff01ffff0101ff,
0xffff01ffff010101,
0xffff01ff00ff0000,
0xffff01ff0000ff00,
0xffff01ff00000001,
0xffff01ff00010000,
0xffff01ff01ffffff,
0xffff01ff01ffff01,
0xffff01ff01ff01ff,
0xffff01ff01ff0101,
0xffff01ff01000000,
0xffff01ff0101ffff,
0xffff01ff0101ff01,
0xffff01ff010101ff,
0xffff01ff01010101,
0xffff0100ffff0000,
0xffff0100ff00ff00,
0xffff0100ff0000ff,
0xffff0100ff000100,
0xffff0100ff0100ff,
0xffff0100ff010000,
0xffff010000ffff00,
0xffff01000000ffff,
0xffff01000000ff00,
0xffff010000000000,
0xffff01000001ff00,
0xffff0100000100ff,
0xffff010000010100,
0xffff01000100ff00,
0xffff0100010000ff,
0xffff010001000001,
0xffff010001000100,
0xffff010001010000,
0xffff0101ffffffff,
0xffff0101ffffff01,
0xffff0101ffff01ff,
0xffff0101ffff0101,
0xffff0101ff000000,
0xffff0101ff01ffff,
0xffff0101ff01ff01,
0xffff0101ff0101ff,
0xffff0101ff010101,
0xffff010100ff0000,
0xffff01010000ff00,
0xffff010100000100,
0xffff01010001ff00,
0xffff010100010000,
0xffff010101ffffff,
0xffff010101ffff01,
0xffff010101ff0000,
0xffff010101ff01ff,
0xffff010101ff0101,
0xffff010101000000,
0xffff01010101ffff,
0xffff01010101ff01,
0xffff0101010101ff,
0xffff010101010101,
0xff00ffffff00ffff,
0xff00ffffff00ff00,
0xff00ffffff0000ff,
0xff00ffffff000100,
0xff00ffffff0100ff,
0xff00ffffff010000,
0xff00ffff00ffff00,
0xff00ffff00ff00ff,
0xff00ffff0000ffff,
0xff00ffff00000000,
0xff00ffff000001ff,
0xff00ffff0001ff00,
0xff00ffff000100ff,
0xff00ffff00010000,
0xff00ffff00010100,
0xff00ffff0100ff00,
0xff00ffff010000ff,
0xff00ffff01000001,
0xff00ffff0101ff00,
0xff00ffff01010000,
0xff00ff00ffffff00,
0xff00ff00ffff00ff,
0xff00ff00ffff0001,
0xff00ff00ffff0100,
0xff00ff00ff00ffff,
0xff00ff00ff00ff01,
0xff00ff00ff000000,
0xff00ff00ff0001ff,
0xff00ff00ff01ff00,
0xff00ff00ff0100ff,
0xff00ff00ff010100,
0xff00ff0000ff0000,
0xff00ff0000ff0101,
0xff00ff000000ffff,
0xff00ff000000ff00,
0xff00ff000000ff01,
0xff00ff00000000ff,
0xff00ff0000000000,
0xff00ff0000000001,
0xff00ff0000000100,
0xff00ff000001ffff,
0xff00ff0000010000,
0xff00ff0001ff00ff,
0xff00ff000100ff01,
0xff00ff0001000000,
0xff00ff000101ff00,
0xff00ff00010100ff,
0xff00ff01ff00ff00,
0xff00ff01ff0000ff,
0xff00ff01ff000001,
0xff00ff01ff010000,
0xff00ff0100ffffff,
0xff00ff0100ff0001,
0xff00ff0100ff0100,
0xff00ff010000ff01,
0xff00ff0100000000,
0xff00ff01000001ff,
0xff00ff0100000101,
0xff00ff01000100ff,
0xff00ff0100010001,
0xff00ff0101ff0000,
0xff00ff010100ff00,
0xff00ff01010000ff,
0xff00ff0101000001,
0xff00ff0101010000,
0xff0000ffffffff00,
0xff0000ffffff0001,
0xff0000ffffff0100,
0xff0000ffff0000ff,
0xff0000ffff000000,
0xff0000ffff0001ff,
0xff0000ffff000100,
0xff0000ffff01ff00,
0xff0000ffff010001,
0xff0000ff00ffff00,
0xff0000ff00ff0000,
0xff0000ff00ff0001,
0xff0000ff00ff01ff,
0xff0000ff00ff0101,
0xff0000ff0000ff00,
0xff0000ff000000ff,
0xff0000ff00000000,
0xff0000ff00000001,
0xff0000ff00000100,
0xff0000ff0001ff01,
0xff0000ff00010000,
0xff0000ff000101ff,
0xff0000ff01ff00ff,
0xff0000ff01ff0100,
0xff0000ff0100ffff,
0xff0000ff010000ff,
0xff0000ff01000000,
0xff0000ff010001ff,
0xff0000ff01000100,
0xff0000ff01000101,
0xff0000ff0101ff00,
0xff0000ff010100ff,
0xff0000ff01010000,
0xff0000ff01010100,
0xff000000ffffff01,
0xff000000ffff0000,
0xff000000ffff0101,
0xff000000ff00ff00,
0xff000000ff0000ff,
0xff000000ff000000,
0xff000000ff000001,
0xff000000ff000100,
0xff000000ff01ffff,
0xff000000ff01ff01,
0xff000000ff010000,
0xff000000ff0101ff,
0xff000000ff010101,
0xff00000000ffff00,
0xff00000000ff00ff,
0xff00000000ff0000,
0xff00000000ff0001,
0xff0000000000ff00,
0xff0000000000ff01,
0xff000000000000ff,
0xff00000000000000,
0xff00000000000001,
0xff00000000000100,
0xff00000000000101,
0xff0000000001ff00,
0xff000000000100ff,
0xff00000000010000,
0xff00000000010001,
0xff00000000010100,
0xff00000001ffffff,
0xff00000001ffff01,
0xff00000001ff00ff,
0xff00000001ff0000,
0xff00000001ff01ff,
0xff00000001ff0101,
0xff0000000100ffff,
0xff0000000100ff00,
0xff000000010000ff,
0xff00000001000000,
0xff00000001000001,
0xff00000001000100,
0xff00000001000101,
0xff0000000101ffff,
0xff0000000101ff01,
0xff00000001010000,
0xff000001ffffff00,
0xff000001ffff00ff,
0xff000001ffff0000,
0xff000001ffff0001,
0xff000001ff000000,
0xff000001ff000001,
0xff000001ff0001ff,
0xff000001ff000101,
0xff000001ff01ff00,
0xff000001ff010001,
0xff00000100ffffff,
0xff00000100ffff01,
0xff00000100ff00ff,
0xff00000100ff0000,
0xff00000100ff01ff,
0xff00000100ff0101,
0xff0000010000ff00,
0xff00000100000000,
0xff00000100000001,
0xff000001000001ff,
0xff00000100000100,
0xff0000010001ff00,
0xff000001000100ff,
0xff00000100010000,
0xff000001000101ff,
0xff00000100010100,
0xff00000100010101,
0xff00000101ff0001,
0xff00000101ff0101,
0xff0000010100ff01,
0xff00000101000000,
0xff000001010100ff,
0xff00000101010100,
0xff0001ffff00ff00,
0xff0001ffff000001,
0xff0001ffff010000,
0xff0001ff00ffff00,
0xff0001ff00ff00ff,
0xff0001ff00ff0001,
0xff0001ff00ff0100,
0xff0001ff0000ffff,
0xff0001ff00000000,
0xff0001ff000001ff,
0xff0001ff00000101,
0xff0001ff0001ffff,
0xff0001ff0001ff00,
0xff0001ff000100ff,
0xff0001ff00010001,
0xff0001ff00010100,
0xff0001ff01ff0000,
0xff0001ff0100ff00,
0xff0001ff010000ff,
0xff0001ff01010000,
0xff000100ff00ffff,
0xff000100ff00ff01,
0xff000100ff000000,
0xff000100ff000101,
0xff000100ff01ff00,
0xff000100ff010000,
0xff00010000ffff01,
0xff00010000ff00ff,
0xff00010000ff0000,
0xff00010000ff01ff,
0xff0001000000ff00,
0xff000100000000ff,
0xff00010000000000,
0xff00010000000001,
0xff00010000000100,
0xff00010000000101,
0xff0001000001ffff,
0xff00010000010000,
0xff00010000010101,
0xff00010001ff0100,
0xff0001000100ff00,
0xff0001000100ff01,
0xff00010001000000,
0xff000100010001ff,
0xff0001000101ff00,
0xff00010001010001,
0xff00010001010100,
0xff000101ffff0100,
0xff000101ff000001,
0xff000101ff0100ff,
0xff000101ff010001,
0xff00010100ff00ff,
0xff00010100ff0001,
0xff00010100ff0100,
0xff0001010000ffff,
0xff0001010000ff01,
0xff00010100000000,
0xff000101000001ff,
0xff0001010001ff00,
0xff00010100010001,
0xff00010100010100,
0xff00010101ff0000,
0xff0001010100ff00,
0xff00010101000001,
0xff00010101000101,
0xff01ffffffffffff,
0xff01ffffffffff01,
0xff01ffffffff01ff,
0xff01ffffffff0101,
0xff01ffffff000000,
0xff01ffffff01ffff,
0xff01ffffff01ff01,
0xff01ffffff010000,
0xff01ffffff0101ff,
0xff01ffffff010101,
0xff01ffff00ff0000,
0xff01ffff0000ff00,
0xff01ffff00000100,
0xff01ffff0001ff00,
0xff01ffff00010000,
0xff01ffff01ffffff,
0xff01ffff01ffff01,
0xff01ffff01ff01ff,
0xff01ffff01ff0101,
0xff01ffff01000000,
0xff01ffff0101ffff,
0xff01ffff0101ff01,
0xff01ffff01010000,
0xff01ffff010101ff,
0xff01ffff01010101,
0xff01ff00ffff0000,
0xff01ff00ff00ff00,
0xff01ff00ff0000ff,
0xff01ff00ff000100,
0xff01ff00ff010000,
0xff01ff0000ffff01,
0xff01ff0000ff00ff,
0xff01ff0000ff0100,
0xff01ff0000000000,
0xff01ff00000001ff,
0xff01ff0000000101,
0xff01ff000001ff00,
0xff01ff00000100ff,
0xff01ff0000010000,
0xff01ff0000010001,
0xff01ff0001ff0000,
0xff01ff000100ffff,
0xff01ff0001000001,
0xff01ff0001000100,
0xff01ff0001010000,
0xff01ff01ffffff00,
0xff01ff01ffff01ff,
0xff01ff01ffff0101,
0xff01ff01ff00ff00,
0xff01ff01ff000000,
0xff01ff01ff01ffff,
0xff01ff01ff01ff01,
0xff01ff01ff0101ff,
0xff01ff01ff010101,
0xff01ff0100ff0000,
0xff01ff010000ff00,
0xff01ff0100000001,
0xff01ff0100000100,
0xff01ff0100010000,
0xff01ff0101ffff00,
0xff01ff0101ff01ff,
0xff01ff0101ff0101,
0xff01ff010100ff00,
0xff01ff0101000000,
0xff01ff010101ffff,
0xff01ff010101ff01,
0xff01ff01010101ff,
0xff01ff0101010101,
0xff0100ffffff0000,
0xff0100ffff0000ff,
0xff0100ffff000001,
0xff0100ffff000100,
0xff0100ffff010000,
0xff0100ff00ff00ff,
0xff0100ff00ff0000,
0xff0100ff00ff0001,
0xff0100ff00ff0100,
0xff0100ff0000ff01,
0xff0100ff00000000,
0xff0100ff000001ff,
0xff0100ff00000101,
0xff0100ff00010001,
0xff0100ff01ff0000,
0xff0100ff0100ff00,
0xff0100ff010000ff,
0xff0100ff01000100,
0xff0100ff0101ff00,
0xff0100ff01010000,
0xff010000ffff0100,
0xff010000ff000000,
0xff010000ff01ff00,
0xff010000ff010100,
0xff01000000ffffff,
0xff01000000ff0000,
0xff01000000ff01ff,
0xff0100000000ff00,
0xff010000000000ff,
0xff01000000000000,
0xff01000000000100,
0xff0100000001ff01,
0xff01000000010000,
0xff010000000101ff,
0xff01000001ff0100,
0xff0100000100ffff,
0xff010000010000ff,
0xff01000001000000,
0xff010000010001ff,
0xff01000001000101,
0xff0100000101ff00,
0xff010000010100ff,
0xff01000001010001,
0xff01000001010100,
0xff010001ffff0000,
0xff010001ff00ffff,
0xff010001ff00ff01,
0xff010001ff000100,
0xff010001ff010000,
0xff01000100ffff00,
0xff01000100ff0100,
0xff01000100000000,
0xff0100010001ffff,
0xff0100010001ff00,
0xff01000100010100,
0xff01000101ff00ff,
0xff01000101ff0001,
0xff0100010100ffff,
0xff01000101000101,
0xff0101ffffffffff,
0xff0101ffffffff01,
0xff0101ffffff01ff,
0xff0101ffffff0101,
0xff0101ffff000000,
0xff0101ffff01ffff,
0xff0101ffff01ff01,
0xff0101ffff0101ff,
0xff0101ffff010101,
0xff0101ff00ff0000,
0xff0101ff0000ff00,
0xff0101ff000000ff,
0xff0101ff00010000,
0xff0101ff01ffffff,
0xff0101ff01ffff01,
0xff0101ff01ff01ff,
0xff0101ff01ff0101,
0xff0101ff0101ffff,
0xff0101ff0101ff01,
0xff0101ff010101ff,
0xff0101ff01010101,
0xff010100ffff0100,
0xff010100ff00ff00,
0xff010100ff0000ff,
0xff010100ff000100,
0xff010100ff010000,
0xff01010000ff0001,
0xff01010000ff0100,
0xff0101000000ff01,
0xff01010000000000,
0xff0101000001ff00,
0xff010100000100ff,
0xff01010000010001,
0xff01010000010100,
0xff01010001ff0000,
0xff0101000100ffff,
0xff01010001000001,
0xff01010001000100,
0xff010100010100ff,
0xff01010001010000,
0xff010101ffffffff,
0xff010101ffffff01,
0xff010101ffff01ff,
0xff010101ffff0101,
0xff010101ff01ffff,
0xff010101ff01ff01,
0xff010101ff0101ff,
0xff010101ff010101,
0xff01010100ff0000,
0xff0101010000ff00,
0xff01010100000001,
0xff01010100000100,
0xff01010100010000,
0xff01010101ffffff,
0xff01010101ffff01,
0xff01010101ff01ff,
0xff01010101ff0101,
0xff01010101000000,
0xff0101010101ffff,
0xff0101010101ff01,
0xff010101010101ff,
0xff01010101010101,
0x00ffffffffff0000,
0x00ffffffff00ff00,
0x00ffffffff000001,
0x00ffffffff010000,
0x00ffffff00ff0100,
0x00ffffff0000ff01,
0x00ffffff00000000,
0x00ffffff000001ff,
0x00ffffff00000101,
0x00ffffff0001ff00,
0x00ffffff000100ff,
0x00ffffff00010001,
0x00ffffff010000ff,
0x00ffffff01000100,
0x00ffffff0101ff00,
0x00ffffff01010001,
0x00ffff00ffffffff,
0x00ffff00ffffff00,
0x00ffff00ffff00ff,
0x00ffff00ffff0001,
0x00ffff00ffff0100,
0x00ffff00ff00ff01,
0x00ffff00ff000000,
0x00ffff00ff000001,
0x00ffff00ff0001ff,
0x00ffff00ff000101,
0x00ffff00ff01ff00,
0x00ffff00ff010001,
0x00ffff00ff010100,
0x00ffff0000ff0000,
0x00ffff0000ff01ff,
0x00ffff0000ff0101,
0x00ffff000000ff00,
0x00ffff00000000ff,
0x00ffff0000000000,
0x00ffff0000000001,
0x00ffff0000000100,
0x00ffff0000000101,
0x00ffff0000010000,
0x00ffff00000101ff,
0x00ffff0000010101,
0x00ffff0001ffff00,
0x00ffff0001ff00ff,
0x00ffff0001ff0001,
0x00ffff000100ffff,
0x00ffff000100ff01,
0x00ffff0001000000,
0x00ffff000101ffff,
0x00ffff000101ff00,
0x00ffff000101ff01,
0x00ffff01ffff0000,
0x00ffff01ff00ff00,
0x00ffff01ff0000ff,
0x00ffff01ff000001,
0x00ffff01ff010000,
0x00ffff0100ffff00,
0x00ffff010000ff01,
0x00ffff0100000000,
0x00ffff0100000101,
0x00ffff01000100ff,
0x00ffff0100010100,
0x00ffff0101ff0100,
0x00ffff01010000ff,
0x00ffff0101010000,
0x00ff00ffffffff00,
0x00ff00ffff000000,
0x00ff00ffff000100,
0x00ff00ffff010100,
0x00ff00ff00ff0000,
0x00ff00ff00ff01ff,
0x00ff00ff00ff0101,
0x00ff00ff0000ff00,
0x00ff00ff000000ff,
0x00ff00ff00000000,
0x00ff00ff00000001,
0x00ff00ff0001ff00,
0x00ff00ff0001ff01,
0x00ff00ff00010000,
0x00ff00ff000101ff,
0x00ff00ff00010101,
0x00ff00ff01ffff00,
0x00ff00ff01ff0001,
0x00ff00ff01ff0100,
0x00ff00ff0100ffff,
0x00ff00ff0100ff01,
0x00ff00ff01000000,
0x00ff00ff0101ffff,
0x00ff00ff0101ff00,
0x00ff00ff01010100,
0x00ff0000ffffff00,
0x00ff0000ffffff01,
0x00ff0000ffff0000,
0x00ff0000ffff0101,
0x00ff0000ff00ff00,
0x00ff0000ff0000ff,
0x00ff0000ff000000,
0x00ff0000ff000001,
0x00ff0000ff000100,
0x00ff0000ff01ffff,
0x00ff0000ff010000,
0x00ff0000ff010101,
0x00ff000000ffff00,
0x00ff000000ff00ff,
0x00ff000000ff0000,
0x00ff000000ff0001,
0x00ff000000ff0100,
0x00ff00000000ffff,
0x00ff00000000ff00,
0x00ff0000000000ff,
0x00ff000000000000,
0x00ff000000000001,
0x00ff0000000001ff,
0x00ff000000000100,
0x00ff00000001ff00,
0x00ff0000000100ff,
0x00ff000000010000,
0x00ff000000010001,
0x00ff000000010100,
0x00ff000001ffff01,
0x00ff000001ff00ff,
0x00ff000001ff0000,
0x00ff000001ff01ff,
0x00ff00000100ff00,
0x00ff0000010000ff,
0x00ff000001000000,
0x00ff000001000001,
0x00ff000001000100,
0x00ff000001000101,
0x00ff000001010000,
0x00ff0000010101ff,
0x00ff000001010101,
0x00ff0001ffffff00,
0x00ff0001ffff0000,
0x00ff0001ffff0100,
0x00ff0001ff0000ff,
0x00ff0001ff000000,
0x00ff0001ff0001ff,
0x00ff0001ff000101,
0x00ff0001ff01ff00,
0x00ff0001ff0100ff,
0x00ff0001ff010100,
0x00ff000100ffffff,
0x00ff000100ffff01,
0x00ff000100ff0000,
0x00ff000100ff01ff,
0x00ff00010000ffff,
0x00ff00010000ff00,
0x00ff00010000ff01,
0x00ff000100000000,
0x00ff000100000001,
0x00ff000100000100,
0x00ff00010001ff01,
0x00ff000100010000,
0x00ff0001000101ff,
0x00ff000101ffff00,
0x00ff000101ff0000,
0x00ff000101ff0101,
0x00ff0001010000ff,
0x00ff000101000000,
0x00ff00010101ff00,
0x00ff0001010100ff,
0x00ff000101010001,
0x00ff01ffffff0000,
0x00ff01ffff00ff00,
0x00ff01ffff000000,
0x00ff01ffff000101,
0x00ff01ffff010000,
0x00ff01ff00ffff01,
0x00ff01ff00ff0100,
0x00ff01ff0000ffff,
0x00ff01ff00000000,
0x00ff01ff000001ff,
0x00ff01ff0001ff00,
0x00ff01ff000100ff,
0x00ff01ff00010001,
0x00ff01ff00010100,
0x00ff01ff01ff0000,
0x00ff01ff0100ff00,
0x00ff01ff010000ff,
0x00ff01ff01000001,
0x00ff01ff01000100,
0x00ff01ff01010000,
0x00ff0100ffffff00,
0x00ff0100ffff0000,
0x00ff0100ffff0001,
0x00ff0100ffff0101,
0x00ff0100ff00ffff,
0x00ff0100ff0000ff,
0x00ff0100ff000000,
0x00ff0100ff0001ff,
0x00ff0100ff01ff00,
0x00ff0100ff0100ff,
0x00ff0100ff010001,
0x00ff010000ffffff,
0x00ff010000ff0000,
0x00ff010000ff0101,
0x00ff01000000ff00,
0x00ff01000000ff01,
0x00ff0100000000ff,
0x00ff010000000000,
0x00ff010000000001,
0x00ff010000000100,
0x00ff01000001ffff,
0x00ff01000001ff01,
0x00ff010000010000,
0x00ff010000010001,
0x00ff010000010101,
0x00ff010001ff0001,
0x00ff010001ff0100,
0x00ff01000100ff01,
0x00ff010001000000,
0x00ff010001000001,
0x00ff0100010001ff,
0x00ff01000101ff00,
0x00ff0100010100ff,
0x00ff010001010001,
0x00ff010001010100,
0x00ff0101ff000001,
0x00ff010100ff00ff,
0x00ff010100ff0001,
0x00ff010100ff0100,
0x00ff010100000000,
0x00ff0101000001ff,
0x00ff010100000101,
0x00ff0101000100ff,
0x00ff010100010100,
0x00ff0101010000ff,
0x00ff010101010000,
0x0000ffffffffff00,
0x0000ffffffff00ff,
0x0000ffffffff0000,
0x0000ffffffff0001,
0x0000ffffffff0100,
0x0000ffffff00ff01,
0x0000ffffff000000,
0x0000ffffff000101,
0x0000ffffff01ff00,
0x0000ffffff0100ff,
0x0000ffffff010100,
0x0000ffff00ffffff,
0x0000ffff00ff0000,
0x0000ffff00ff01ff,
0x0000ffff0000ff00,
0x0000ffff000000ff,
0x0000ffff00000000,
0x0000ffff00000001,
0x0000ffff00000100,
0x0000ffff00010000,
0x0000ffff000101ff,
0x0000ffff01ff0001,
0x0000ffff01ff0100,
0x0000ffff01000000,
0x0000ffff010001ff,
0x0000ffff0101ffff,
0x0000ffff0101ff00,
0x0000ffff01010001,
0x0000ffff01010100,
0x0000ff00ffff0000,
0x0000ff00ffff01ff,
0x0000ff00ffff0100,
0x0000ff00ffff0101,
0x0000ff00ff00ff00,
0x0000ff00ff0000ff,
0x0000ff00ff000000,
0x0000ff00ff000001,
0x0000ff00ff0001ff,
0x0000ff00ff000100,
0x0000ff00ff01ffff,
0x0000ff00ff010000,
0x0000ff00ff010001,
0x0000ff00ff0101ff,
0x0000ff00ff010101,
0x0000ff0000ffff00,
0x0000ff0000ff00ff,
0x0000ff0000ff0000,
0x0000ff0000ff0001,
0x0000ff0000ff0100,
0x0000ff000000ffff,
0x0000ff000000ff00,
0x0000ff000000ff01,
0x0000ff00000000ff,
0x0000ff0000000000,
0x0000ff0000000001,
0x0000ff00000001ff,
0x0000ff0000000100,
0x0000ff0000000101,
0x0000ff000001ff00,
0x0000ff00000100ff,
0x0000ff0000010000,
0x0000ff0000010001,
0x0000ff0000010100,
0x0000ff0001ffff01,
0x0000ff0001ff0000,
0x0000ff000100ff00,
0x0000ff00010000ff,
0x0000ff0001000000,
0x0000ff0001000001,
0x0000ff0001000100,
0x0000ff000101ffff,
0x0000ff0001010000,
0x0000ff0001010101,
0x0000ff01ffffff00,
0x0000ff01ffff0001,
0x0000ff01ff00ff01,
0x0000ff01ff000000,
0x0000ff01ff000101,
0x0000ff01ff01ff00,
0x0000ff01ff0100ff,
0x0000ff0100ffff01,
0x0000ff0100ff0000,
0x0000ff0100ff0101,
0x0000ff010000ff00,
0x0000ff01000000ff,
0x0000ff0100000000,
0x0000ff0100000001,
0x0000ff0100000100,
0x0000ff010001ff01,
0x0000ff0100010000,
0x0000ff0101ff0000,
0x0000ff010100ffff,
0x0000ff010100ff01,
0x0000ff0101000000,
0x0000ff0101000100,
0x0000ff0101000101,
0x0000ff01010100ff,
0x000000ffffff00ff,
0x000000ffffff0000,
0x000000ffff00ff00,
0x000000ffff0000ff,
0x000000ffff000000,
0x000000ffff000001,
0x000000ffff0001ff,
0x000000ffff000100,
0x000000ffff01ff00,
0x000000ffff010000,
0x000000ffff0101ff,
0x000000ffff010101,
0x000000ff00ffff00,
0x000000ff00ff00ff,
0x000000ff00ff0000,
0x000000ff00ff0001,
0x000000ff00ff0100,
0x000000ff00ff0101,
0x000000ff0000ffff,
0x000000ff0000ff00,
0x000000ff000000ff,
0x000000ff00000000,
0x000000ff00000001,
0x000000ff000001ff,
0x000000ff00000100,
0x000000ff00000101,
0x000000ff0001ff00,
0x000000ff0001ff01,
0x000000ff000100ff,
0x000000ff00010000,
0x000000ff00010001,
0x000000ff00010100,
0x000000ff01ffffff,
0x000000ff01ff01ff,
0x000000ff01ff0101,
0x000000ff0100ff00,
0x000000ff010000ff,
0x000000ff01000000,
0x000000ff01000001,
0x000000ff01000100,
0x000000ff0101ff00,
0x000000ff010100ff,
0x000000ff01010000,
0x000000ff01010101,
0x00000000ffffff00,
0x00000000ffffff01,
0x00000000ffff00ff,
0x00000000ffff0000,
0x00000000ffff0001,
0x00000000ffff0100,
0x00000000ff00ffff,
0x00000000ff00ff00,
0x00000000ff00ff01,
0x00000000ff0000ff,
0x00000000ff000000,
0x00000000ff000001,
0x00000000ff000100,
0x00000000ff000101,
0x00000000ff01ff00,
0x00000000ff0100ff,
0x00000000ff010000,
0x00000000ff010001,
0x00000000ff010100,
0x0000000000ffffff,
0x0000000000ffff00,
0x0000000000ffff01,
0x0000000000ff00ff,
0x0000000000ff0000,
0x0000000000ff0001,
0x0000000000ff01ff,
0x0000000000ff0100,
0x000000000000ffff,
0x000000000000ff00,
0x000000000000ff01,
0x00000000000000ff,
0x0000000000000000,
0x0000000000000001,
0x00000000000001ff,
0x0000000000000100,
0x0000000000000101,
0x000000000001ffff,
0x000000000001ff00,
0x00000000000100ff,
0x0000000000010000,
0x0000000000010001,
0x00000000000101ff,
0x0000000000010100,
0x0000000000010101,
0x0000000001ffff00,
0x0000000001ff00ff,
0x0000000001ff0000,
0x0000000001ff0100,
0x0000000001ff0101,
0x000000000100ffff,
0x000000000100ff00,
0x00000000010000ff,
0x0000000001000000,
0x0000000001000001,
0x00000000010001ff,
0x0000000001000100,
0x000000000101ff00,
0x00000000010100ff,
0x0000000001010000,
0x0000000001010001,
0x0000000001010100,
0x00000001ffffffff,
0x00000001ffffff00,
0x00000001ffffff01,
0x00000001ffff00ff,
0x00000001ffff0001,
0x00000001ffff01ff,
0x00000001ffff0100,
0x00000001ff00ff00,
0x00000001ff0000ff,
0x00000001ff000000,
0x00000001ff0001ff,
0x00000001ff000100,
0x00000001ff01ffff,
0x00000001ff01ff00,
0x00000001ff01ff01,
0x00000001ff0100ff,
0x00000001ff010000,
0x00000001ff010001,
0x00000001ff0101ff,
0x00000001ff010100,
0x0000000100ffff00,
0x0000000100ff0000,
0x0000000100ff0001,
0x0000000100ff01ff,
0x0000000100ff0100,
0x0000000100ff0101,
0x000000010000ffff,
0x000000010000ff00,
0x000000010000ff01,
0x00000001000000ff,
0x0000000100000000,
0x0000000100000001,
0x00000001000001ff,
0x0000000100000100,
0x0000000100000101,
0x000000010001ff00,
0x00000001000100ff,
0x0000000100010000,
0x0000000100010100,
0x0000000101ffff01,
0x0000000101ff0000,
0x0000000101ff0001,
0x0000000101ff01ff,
0x0000000101ff0100,
0x0000000101ff0101,
0x000000010100ff00,
0x0000000101000000,
0x0000000101000101,
0x000000010101ff01,
0x0000000101010000,
0x0000000101010001,
0x00000001010101ff,
0x0000000101010100,
0x000001ffffff00ff,
0x000001ffffff0000,
0x000001ffffff0001,
0x000001ffffff0100,
0x000001ffff00ffff,
0x000001ffff000000,
0x000001ffff0001ff,
0x000001ffff01ff00,
0x000001ffff010101,
0x000001ff00ff0000,
0x000001ff00ff01ff,
0x000001ff00ff0101,
0x000001ff0000ff00,
0x000001ff000000ff,
0x000001ff00000000,
0x000001ff00000001,
0x000001ff000001ff,
0x000001ff00000100,
0x000001ff0001ffff,
0x000001ff0001ff01,
0x000001ff000100ff,
0x000001ff00010000,
0x000001ff01ffff01,
0x000001ff01ff0100,
0x000001ff0100ffff,
0x000001ff0100ff01,
0x000001ff01000000,
0x000001ff010001ff,
0x000001ff0101ff00,
0x000001ff01010100,
0x00000100ffffff00,
0x00000100ffffff01,
0x00000100ffff0000,
0x00000100ffff0101,
0x00000100ff00ff00,
0x00000100ff0000ff,
0x00000100ff000000,
0x00000100ff000001,
0x00000100ff000100,
0x00000100ff010000,
0x0000010000ffff00,
0x0000010000ff00ff,
0x0000010000ff0000,
0x0000010000ff0001,
0x0000010000ff0100,
0x000001000000ffff,
0x000001000000ff00,
0x000001000000ff01,
0x00000100000000ff,
0x0000010000000000,
0x0000010000000001,
0x00000100000001ff,
0x0000010000000100,
0x0000010000000101,
0x000001000001ff00,
0x00000100000100ff,
0x0000010000010000,
0x0000010000010001,
0x0000010000010100,
0x0000010001ffff00,
0x0000010001ff0000,
0x0000010001ff0100,
0x000001000100ff00,
0x00000100010000ff,
0x0000010001000000,
0x0000010001000001,
0x00000100010001ff,
0x0000010001000100,
0x0000010001010000,
0x00000101ffff00ff,
0x00000101ffff01ff,
0x00000101ff000000,
0x00000101ff000101,
0x00000101ff01ffff,
0x00000101ff010000,
0x00000101ff010001,
0x00000101ff010100,
0x0000010100ff0000,
0x0000010100ff01ff,
0x0000010100ff0100,
0x000001010000ff00,
0x0000010100000000,
0x0000010100000001,
0x00000101000001ff,
0x0000010100000100,
0x000001010001ff01,
0x0000010100010000,
0x00000101000101ff,
0x0000010100010101,
0x0000010101ffff00,
0x0000010101ff0101,
0x000001010100ff01,
0x0000010101000000,
0x0000010101000001,
0x00000101010001ff,
0x0000010101000101,
0x000001010101ff00,
0x0001ffffffff0000,
0x0001ffffff0000ff,
0x0001ffffff000001,
0x0001ffffff000100,
0x0001ffffff010000,
0x0001ffff00ff00ff,
0x0001ffff0000ffff,
0x0001ffff00000000,
0x0001ffff00000001,
0x0001ffff000001ff,
0x0001ffff00000101,
0x0001ffff0001ff00,
0x0001ffff000100ff,
0x0001ffff00010001,
0x0001ffff00010100,
0x0001ffff01ffff00,
0x0001ffff01000001,
0x0001ffff01010000,
0x0001ff00ffffff00,
0x0001ff00ffff00ff,
0x0001ff00ffff0001,
0x0001ff00ffff0100,
0x0001ff00ff00ff01,
0x0001ff00ff000000,
0x0001ff00ff01ff00,
0x0001ff00ff01ff01,
0x0001ff00ff010001,
0x0001ff00ff010100,
0x0001ff0000ff0000,
0x0001ff0000ff0100,
0x0001ff000000ff00,
0x0001ff0000000000,
0x0001ff0000000001,
0x0001ff0000000100,
0x0001ff0000010000,
0x0001ff0000010001,
0x0001ff0000010101,
0x0001ff0001ff00ff,
0x0001ff0001ff0101,
0x0001ff000100ff01,
0x0001ff0001000000,
0x0001ff000101ff00,
0x0001ff0001010001,
0x0001ff0001010100,
0x0001ff01ff00ff00,
0x0001ff01ff000001,
0x0001ff01ff000100,
0x0001ff0100ffffff,
0x0001ff0100ffff00,
0x0001ff0100ff0001,
0x0001ff0100000000,
0x0001ff0100000001,
0x0001ff01000001ff,
0x0001ff010001ffff,
0x0001ff0101ff0000,
0x0001ff010100ff00,
0x0001ff0101000001,
0x0001ff0101010000,
0x000100ffff00ff00,
0x000100ffff00ff01,
0x000100ffff000000,
0x000100ffff000001,
0x000100ffff000101,
0x000100ffff01ff00,
0x000100ffff010001,
0x000100ffff010100,
0x000100ff00ffffff,
0x000100ff00ffff01,
0x000100ff00ff0000,
0x000100ff00ff01ff,
0x000100ff00ff0101,
0x000100ff0000ff00,
0x000100ff000000ff,
0x000100ff00000000,
0x000100ff00000001,
0x000100ff00000100,
0x000100ff00000101,
0x000100ff0001ffff,
0x000100ff0001ff01,
0x000100ff00010000,
0x000100ff01ff00ff,
0x000100ff01ff0000,
0x000100ff01ff0100,
0x000100ff0100ffff,
0x000100ff0100ff01,
0x000100ff010000ff,
0x000100ff01000000,
0x000100ff01000001,
0x000100ff010001ff,
0x000100ff01000101,
0x000100ff0101ff00,
0x000100ff010100ff,
0x000100ff01010100,
0x00010000ffff0000,
0x00010000ffff01ff,
0x00010000ffff0101,
0x00010000ff00ff00,
0x00010000ff000000,
0x00010000ff000001,
0x00010000ff000100,
0x0001000000ff00ff,
0x0001000000ff0000,
0x0001000000ff0001,
0x0001000000ff0100,
0x000100000000ffff,
0x000100000000ff00,
0x00010000000000ff,
0x0001000000000000,
0x0001000000000001,
0x0001000000000100,
0x000100000001ff00,
0x00010000000100ff,
0x0001000000010000,
0x0001000000010001,
0x0001000000010100,
0x0001000001ff0001,
0x0001000001ff0100,
0x0001000001ff0101,
0x000100000100ff00,
0x0001000001000000,
0x0001000001000001,
0x0001000001000100,
0x0001000001000101,
0x000100000101ff01,
0x0001000001010000,
0x0001000001010001,
0x00010000010101ff,
0x00010001ffffff01,
0x00010001ffff0100,
0x00010001ff000000,
0x00010001ff01ffff,
0x00010001ff010001,
0x00010001ff0101ff,
0x00010001ff010100,
0x0001000100ffffff,
0x0001000100ff0000,
0x0001000100ff01ff,
0x0001000100ff0101,
0x000100010000ff00,
0x00010001000000ff,
0x0001000100000000,
0x0001000100000001,
0x00010001000001ff,
0x0001000100000101,
0x000100010001ffff,
0x0001000100010000,
0x00010001000101ff,
0x0001000101ffffff,
0x0001000101ffff01,
0x0001000101ff0000,
0x0001000101ff0101,
0x00010001010000ff,
0x0001000101000001,
0x00010001010001ff,
0x0001000101000100,
0x000100010101ffff,
0x00010001010100ff,
0x0001000101010001,
0x0001000101010101,
0x000101ffff000001,
0x000101ffff000100,
0x000101ffff010000,
0x000101ff00ffff00,
0x000101ff0000ff01,
0x000101ff00000000,
0x000101ff00000101,
0x000101ff0001ff00,
0x000101ff00010100,
0x000101ff01ff0000,
0x000101ff0100ff00,
0x000101ff010001ff,
0x000101ff01010001,
0x00010100ffffff00,
0x00010100ffff00ff,
0x00010100ff00ffff,
0x00010100ff000000,
0x00010100ff01ff00,
0x00010100ff0100ff,
0x00010100ff010001,
0x00010100ff010100,
0x0001010000ffffff,
0x0001010000ffff00,
0x0001010000ff0000,
0x0001010000ff0001,
0x0001010000ff01ff,
0x000101000000ff00,
0x00010100000000ff,
0x0001010000000000,
0x0001010000000001,
0x0001010000000100,
0x000101000001ffff,
0x0001010000010000,
0x0001010000010101,
0x0001010001ffff01,
0x0001010001ff00ff,
0x0001010001ff0101,
0x0001010001000000,
0x000101000101ff00,
0x00010100010100ff,
0x0001010001010000,
0x0001010001010100,
0x00010101ff00ff00,
0x00010101ff000001,
0x00010101ff0001ff,
0x0001010100ffff00,
0x0001010100ff00ff,
0x0001010100ff0100,
0x000101010000ffff,
0x0001010100000000,
0x00010101000001ff,
0x0001010100000101,
0x00010101000100ff,
0x0001010100010000,
0x0001010100010100,
0x0001010101ff0001,
0x00010101010000ff,
0x00010101010001ff,
0x0001010101000101,
0x0001010101010001,
0x01ffffffffffffff,
0x01ffffffffffff01,
0x01ffffffffff01ff,
0x01ffffffffff0101,
0x01ffffffff01ffff,
0x01ffffffff01ff01,
0x01ffffffff0101ff,
0x01ffffffff010101,
0x01ffffff00ff0000,
0x01ffffff0000ffff,
0x01ffffff0000ff00,
0x01ffffff000000ff,
0x01ffffff00000001,
0x01ffffff00000100,
0x01ffffff00010000,
0x01ffffff01ffffff,
0x01ffffff01ffff01,
0x01ffffff01ff01ff,
0x01ffffff01ff0101,
0x01ffffff01000000,
0x01ffffff0101ffff,
0x01ffffff0101ff01,
0x01ffffff010101ff,
0x01ffffff01010101,
0x01ffff00ffff0000,
0x01ffff00ff00ff00,
0x01ffff00ff0000ff,
0x01ffff00ff000001,
0x01ffff00ff000100,
0x01ffff00ff010000,
0x01ffff0000ffff00,
0x01ffff0000ff00ff,
0x01ffff0000ff0100,
0x01ffff000000ffff,
0x01ffff000000ff01,
0x01ffff0000000000,
0x01ffff0000000001,
0x01ffff00000001ff,
0x01ffff0000000100,
0x01ffff00000100ff,
0x01ffff0000010001,
0x01ffff0000010100,
0x01ffff0001ff0000,
0x01ffff0001ff0100,
0x01ffff00010000ff,
0x01ffff0001000001,
0x01ffff0001000100,
0x01ffff0001010000,
0x01ffff01ffffffff,
0x01ffff01ffffff01,
0x01ffff01ffff01ff,
0x01ffff01ffff0101,
0x01ffff01ff000000,
0x01ffff01ff01ffff,
0x01ffff01ff01ff01,
0x01ffff01ff0101ff,
0x01ffff01ff010101,
0x01ffff010000ff00,
0x01ffff01000000ff,
0x01ffff0100000100,
0x01ffff0100010000,
0x01ffff0101ffffff,
0x01ffff0101ffff01,
0x01ffff0101ff01ff,
0x01ffff0101ff0101,
0x01ffff0101000000,
0x01ffff010101ffff,
0x01ffff010101ff01,
0x01ffff01010101ff,
0x01ffff0101010101,
0x01ff00ffff0000ff,
0x01ff00ffff000100,
0x01ff00ff00ffff00,
0x01ff00ff00ff00ff,
0x01ff00ff0000ff00,
0x01ff00ff00000000,
0x01ff00ff00000101,
0x01ff00ff0001ff00,
0x01ff00ff000100ff,
0x01ff00ff00010100,
0x01ff00ff010000ff,
0x01ff00ff01000100,
0x01ff0000ffffff00,
0x01ff0000ffff0100,
0x01ff0000ff00ff01,
0x01ff0000ff000000,
0x01ff0000ff000101,
0x01ff0000ff010001,
0x01ff0000ff010100,
0x01ff000000ffffff,
0x01ff000000ffff00,
0x01ff000000ff0000,
0x01ff000000ff01ff,
0x01ff00000000ff00,
0x01ff0000000000ff,
0x01ff000000000000,
0x01ff000000000001,
0x01ff000000000100,
0x01ff000000000101,
0x01ff000000010000,
0x01ff000000010001,
0x01ff0000000101ff,
0x01ff000000010101,
0x01ff000001ffff00,
0x01ff000001ff00ff,
0x01ff000001ff0001,
0x01ff000001ff0100,
0x01ff00000100ffff,
0x01ff00000100ff01,
0x01ff000001000000,
0x01ff0000010001ff,
0x01ff000001010001,
0x01ff0001ff00ff00,
0x01ff0001ff000001,
0x01ff0001ff000100,
0x01ff0001ff010000,
0x01ff000100ffff00,
0x01ff000100ff00ff,
0x01ff000100ff0100,
0x01ff000100ff0101,
0x01ff00010000ffff,
0x01ff000100000000,
0x01ff000100000100,
0x01ff000100000101,
0x01ff00010001ff00,
0x01ff000100010001,
0x01ff000100010101,
0x01ff000101ff0000,
0x01ff00010100ff00,
0x01ff000101000101,
0x01ff0001010100ff,
0x01ff01ffffffffff,
0x01ff01ffffffff01,
0x01ff01ffffff01ff,
0x01ff01ffffff0101,
0x01ff01ffff000000,
0x01ff01ffff01ffff,
0x01ff01ffff01ff01,
0x01ff01ffff0101ff,
0x01ff01ffff010101,
0x01ff01ff00ffff00,
0x01ff01ff00ff0000,
0x01ff01ff0000ff00,
0x01ff01ff000000ff,
0x01ff01ff00000100,
0x01ff01ff00010000,
0x01ff01ff00010100,
0x01ff01ff01ffffff,
0x01ff01ff01ffff01,
0x01ff01ff01ff01ff,
0x01ff01ff01ff0101,
0x01ff01ff01000000,
0x01ff01ff0101ffff,
0x01ff01ff0101ff01,
0x01ff01ff010101ff,
0x01ff01ff01010101,
0x01ff0100ffff0000,
0x01ff0100ffff0001,
0x01ff0100ff00ff00,
0x01ff0100ff0000ff,
0x01ff0100ff000001,
0x01ff0100ff010000,
0x01ff010000ffff00,
0x01ff010000ff00ff,
0x01ff010000ff0001,
0x01ff010000ff0100,
0x01ff01000000ffff,
0x01ff01000000ff01,
0x01ff010000000000,
0x01ff010000000101,
0x01ff01000001ff00,
0x01ff0100000100ff,
0x01ff010001ff0000,
0x01ff010001000001,
0x01ff010001000100,
0x01ff010001010000,
0x01ff0101ffffffff,
0x01ff0101ffffff01,
0x01ff0101ffff01ff,
0x01ff0101ffff0101,
0x01ff0101ff000000,
0x01ff0101ff01ffff,
0x01ff0101ff01ff01,
0x01ff0101ff0101ff,
0x01ff0101ff010101,
0x01ff010100ff0000,
0x01ff01010000ff00,
0x01ff0101000000ff,
0x01ff010100000001,
0x01ff010101ffffff,
0x01ff010101ffff01,
0x01ff010101ff01ff,
0x01ff010101ff0101,
0x01ff010101000000,
0x01ff01010101ffff,
0x01ff01010101ff01,
0x01ff0101010101ff,
0x01ff010101010101,
0x0100ffffffff0000,
0x0100ffffff00ff00,
0x0100ffffff000001,
0x0100ffffff0001ff,
0x0100ffffff000100,
0x0100ffffff010000,
0x0100ffff00ffff00,
0x0100ffff00ff0001,
0x0100ffff00ff0100,
0x0100ffff00000000,
0x0100ffff000001ff,
0x0100ffff00000101,
0x0100ffff00010100,
0x0100ffff00010101,
0x0100ffff01ff0000,
0x0100ffff0100ff00,
0x0100ffff010000ff,
0x0100ffff01000001,
0x0100ffff01000100,
0x0100ffff01010000,
0x0100ff00ffffff00,
0x0100ff00ffff00ff,
0x0100ff00ffff0001,
0x0100ff00ffff0100,
0x0100ff00ff00ffff,
0x0100ff00ff000000,
0x0100ff00ff0001ff,
0x0100ff00ff000101,
0x0100ff00ff01ff00,
0x0100ff00ff0100ff,
0x0100ff00ff010001,
0x0100ff00ff010100,
0x0100ff0000ffffff,
0x0100ff0000ff0000,
0x0100ff000000ffff,
0x0100ff000000ff00,
0x0100ff00000000ff,
0x0100ff0000000000,
0x0100ff0000000001,
0x0100ff0000000100,
0x0100ff000001ff01,
0x0100ff0000010000,
0x0100ff0001ff00ff,
0x0100ff0001ff0001,
0x0100ff000100ff01,
0x0100ff0001000000,
0x0100ff00010001ff,
0x0100ff000101ff00,
0x0100ff00010100ff,
0x0100ff0001010001,
0x0100ff0001010100,
0x0100ff01ffff0000,
0x0100ff01ff00ff00,
0x0100ff01ff0000ff,
0x0100ff01ff000100,
0x0100ff01ff010000,
0x0100ff0100ff00ff,
0x0100ff0100ff0001,
0x0100ff0100ff0100,
0x0100ff010000ffff,
0x0100ff010000ff01,
0x0100ff0100000000,
0x0100ff01000001ff,
0x0100ff0100010001,
0x0100ff0100010100,
0x0100ff0101ff0000,
0x0100ff01010000ff,
0x0100ff0101000001,
0x0100ff0101010100,
0x010000ffffffff00,
0x010000ffffff00ff,
0x010000ffffff0001,
0x010000ffff00ffff,
0x010000ffff000000,
0x010000ffff0001ff,
0x010000ffff010001,
0x010000ff00ffffff,
0x010000ff00ff0101,
0x010000ff0000ff00,
0x010000ff000000ff,
0x010000ff00000000,
0x010000ff00000001,
0x010000ff000001ff,
0x010000ff00000100,
0x010000ff0001ffff,
0x010000ff0001ff00,
0x010000ff0001ff01,
0x010000ff00010000,
0x010000ff01ff00ff,
0x010000ff01ff0001,
0x010000ff0100ff01,
0x010000ff010000ff,
0x010000ff01000000,
0x010000ff010001ff,
0x010000ff0101ff00,
0x010000ff01010100,
0x01000000ffffffff,
0x01000000ffff0000,
0x01000000ffff01ff,
0x01000000ffff0101,
0x01000000ff00ffff,
0x01000000ff00ff00,
0x01000000ff0000ff,
0x01000000ff000000,
0x01000000ff000001,
0x01000000ff000100,
0x01000000ff01ff00,
0x01000000ff010000,
0x01000000ff010100,
0x01000000ff010101,
0x0100000000ffff00,
0x0100000000ff00ff,
0x0100000000ff0000,
0x0100000000ff0001,
0x0100000000ff0100,
0x010000000000ffff,
0x010000000000ff00,
0x010000000000ff01,
0x01000000000000ff,
0x0100000000000000,
0x0100000000000001,
0x01000000000001ff,
0x0100000000000100,
0x0100000000000101,
0x010000000001ff00,
0x01000000000100ff,
0x0100000000010000,
0x0100000000010001,
0x0100000000010100,
0x0100000001ffff00,
0x0100000001ff0000,
0x0100000001ff01ff,
0x010000000100ff00,
0x010000000100ff01,
0x01000000010000ff,
0x0100000001000000,
0x0100000001000001,
0x0100000001000100,
0x0100000001000101,
0x010000000101ffff,
0x010000000101ff01,
0x0100000001010000,
0x01000000010101ff,
0x0100000001010101,
0x01000001ffffff00,
0x01000001ffff00ff,
0x01000001ff00ffff,
0x01000001ff000000,
0x01000001ff000100,
0x01000001ff01ffff,
0x01000001ff010001,
0x01000001ff010100,
0x0100000100ff0000,
0x0100000100ff01ff,
0x0100000100ff0100,
0x010000010000ff00,
0x010000010000ff01,
0x0100000100000000,
0x0100000100000001,
0x0100000100000100,
0x0100000100010000,
0x01000001000101ff,
0x0100000101ffff01,
0x0100000101ff00ff,
0x0100000101ff0100,
0x0100000101ff0101,
0x010000010100ff01,
0x01000001010000ff,
0x0100000101000000,
0x01000001010100ff,
0x0100000101010001,
0x0100000101010100,
0x010001ffffff0000,
0x010001ffff000001,
0x010001ffff000100,
0x010001ffff010000,
0x010001ff00ffff00,
0x010001ff00ff0001,
0x010001ff0000ffff,
0x010001ff0000ff01,
0x010001ff00000000,
0x010001ff00000001,
0x010001ff00000101,
0x010001ff000100ff,
0x010001ff00010000,
0x010001ff01ff0000,
0x010001ff0100ff00,
0x010001ff01000001,
0x010001ff01000100,
0x010001ff01010000,
0x01000100ffff00ff,
0x01000100ffff0001,
0x01000100ffff0100,
0x01000100ff00ffff,
0x01000100ff00ff01,
0x01000100ff000000,
0x01000100ff0001ff,
0x01000100ff000101,
0x01000100ff01ffff,
0x01000100ff01ff00,
0x01000100ff0100ff,
0x01000100ff010001,
0x0100010000ffffff,
0x0100010000ffff01,
0x0100010000ff0000,
0x0100010000ff01ff,
0x0100010000ff0101,
0x010001000000ff00,
0x01000100000000ff,
0x0100010000000000,
0x0100010000000001,
0x0100010000000100,
0x010001000001ff01,
0x0100010000010000,
0x0100010000010001,
0x0100010000010101,
0x0100010001ffff00,
0x0100010001ff00ff,
0x010001000100ffff,
0x010001000100ff01,
0x0100010001000000,
0x0100010001000101,
0x010001000101ff00,
0x0100010001010001,
0x01000101ffff0000,
0x01000101ff000000,
0x01000101ff010000,
0x0100010100ff00ff,
0x0100010100ff0001,
0x0100010100ff0100,
0x010001010000ffff,
0x0100010100000000,
0x01000101000001ff,
0x010001010001ff00,
0x0100010101ff0000,
0x010001010100ff00,
0x01000101010000ff,
0x0100010101000000,
0x0100010101000001,
0x0101ffffffffffff,
0x0101ffffffffff01,
0x0101ffffffff01ff,
0x0101ffffffff0101,
0x0101ffffff000000,
0x0101ffffff01ffff,
0x0101ffffff01ff01,
0x0101ffffff0101ff,
0x0101ffffff010101,
0x0101ffff00ff0000,
0x0101ffff0000ff00,
0x0101ffff000000ff,
0x0101ffff00000001,
0x0101ffff00000100,
0x0101ffff01ffffff,
0x0101ffff01ffff01,
0x0101ffff01ff01ff,
0x0101ffff01ff0101,
0x0101ffff01000000,
0x0101ffff0101ffff,
0x0101ffff0101ff01,
0x0101ffff010101ff,
0x0101ffff01010101,
0x0101ff00ffff0000,
0x0101ff00ffff0100,
0x0101ff00ff00ff00,
0x0101ff00ff0000ff,
0x0101ff00ff000001,
0x0101ff00ff000100,
0x0101ff00ff000101,
0x0101ff0000ff0001,
0x0101ff0000ff0100,
0x0101ff000000ff00,
0x0101ff0000000000,
0x0101ff00000001ff,
0x0101ff0000000101,
0x0101ff000001ff00,
0x0101ff00000100ff,
0x0101ff0001ff0000,
0x0101ff000100ffff,
0x0101ff000100ff01,
0x0101ff0001000001,
0x0101ff0001000100,
0x0101ff01ffffff01,
0x0101ff01ffff01ff,
0x0101ff01ffff0101,
0x0101ff01ff00ffff,
0x0101ff01ff000100,
0x0101ff01ff01ff01,
0x0101ff01ff0101ff,
0x0101ff01ff010101,
0x0101ff0100ff0000,
0x0101ff010000ff00,
0x0101ff0100000001,
0x0101ff0100000100,
0x0101ff0100010000,
0x0101ff0101ffffff,
0x0101ff0101ffff01,
0x0101ff0101ff01ff,
0x0101ff0101ff0101,
0x0101ff0101000000,
0x0101ff010101ffff,
0x0101ff010101ff01,
0x0101ff01010101ff,
0x0101ff0101010101,
0x010100ffff000100,
0x010100ffff010000,
0x010100ff00ffff00,
0x010100ff00ff00ff,
0x010100ff0000ffff,
0x010100ff000000ff,
0x010100ff00000000,
0x010100ff000001ff,
0x010100ff00000101,
0x010100ff0001ff00,
0x010100ff00010000,
0x010100ff00010001,
0x010100ff000101ff,
0x010100ff00010100,
0x010100ff01ff0000,
0x01010000ffff0001,
0x01010000ffff0100,
0x01010000ff00ffff,
0x01010000ff00ff01,
0x01010000ff000000,
0x01010000ff0001ff,
0x01010000ff010001,
0x01010000ff010100,
0x0101000000ffff01,
0x0101000000ff0000,
0x010100000000ff00,
0x01010000000000ff,
0x0101000000000000,
0x0101000000000001,
0x0101000000000100,
0x0101000000010000,
0x0101000000010101,
0x0101000001ffff00,
0x0101000001ff00ff,
0x0101000001ff0000,
0x0101000001ff0001,
0x0101000001ff0100,
0x010100000100ff01,
0x0101000001000000,
0x01010000010001ff,
0x01010001ffff0000,
0x01010001ff00ff00,
0x01010001ff000001,
0x01010001ff000101,
0x01010001ff01ff00,
0x01010001ff010000,
0x0101000100ff00ff,
0x0101000100ff0001,
0x0101000100ff0101,
0x010100010000ff01,
0x0101000100000000,
0x0101000100000001,
0x01010001000001ff,
0x010100010001ffff,
0x010100010001ff01,
0x0101000101ff0001,
0x010100010100ffff,
0x0101000101000000,
0x0101000101000001,
0x0101000101000100,
0x010100010101ff00,
0x01010001010100ff,
0x0101000101010001,
0x010101ffffffffff,
0x010101ffffffff01,
0x010101ffffff01ff,
0x010101ffffff0101,
0x010101ffff01ffff,
0x010101ffff01ff01,
0x010101ffff0101ff,
0x010101ffff010101,
0x010101ff0000ff00,
0x010101ff000000ff,
0x010101ff00000001,
0x010101ff00000100,
0x010101ff01ffffff,
0x010101ff01ffff01,
0x010101ff01ff01ff,
0x010101ff01ff0101,
0x010101ff01000000,
0x010101ff0101ffff,
0x010101ff0101ff01,
0x010101ff010101ff,
0x010101ff01010101,
0x01010100ffff0000,
0x01010100ff0000ff,
0x01010100ff000100,
0x01010100ff01ff00,
0x01010100ff010000,
0x0101010000ffff00,
0x010101000000ffff,
0x0101010000000000,
0x0101010000000101,
0x010101000001ff00,
0x0101010000010001,
0x0101010000010100,
0x010101000100ffff,
0x0101010001000001,
0x01010101ffffffff,
0x01010101ffffff01,
0x01010101ffff01ff,
0x01010101ffff0101,
0x01010101ff01ffff,
0x01010101ff01ff01,
0x01010101ff0101ff,
0x01010101ff010101,
0x010101010000ff00,
0x01010101000000ff,
0x0101010100000001,
0x0101010101ffffff,
0x0101010101ffff01,
0x0101010101ff01ff,
0x0101010101ff0101,
0x0101010101000000,
0x010101010101ffff,
0x010101010101ff01,
0x01010101010101ff,
0x0101010101010101,
];
}