chainwayxyz / citrea

Citrea, Bitcoin's First ZK Rollup 🍊🍋
https://citrea.xyz
GNU General Public License v3.0
125 stars 26 forks source link

R&D: Typed StateDiff + compression #1132

Open kpp opened 2 months ago

kpp commented 2 months ago

Follow-up of https://github.com/chainwayxyz/citrea/issues/711.

This is how one can deserialize the current state diff:

use std::{
    io::{Error, Write},
    ops::Range,
};

use alloy_primitives::{Address, BlockNumber, Bloom, Bytes, B256, U256};
use borsh::BorshSerialize;
use serde::{Deserialize, Serialize};

// #[derive(Default, Serialize, BorshSerialize, Debug, Clone)]
// struct PlainAccountInfo {
//     balance: [u8; 32], // U256
//     nonce: u64,
//     code_hash: Option<[u8; 32]>, // Option<B256>
// }

// impl From<DbAccountInfo> for PlainAccountInfo {
//     fn from(v: DbAccountInfo) -> Self {
//         Self {
//             balance: v.balance.to_be_bytes::<32>(),
//             nonce: v.nonce,
//             code_hash: v.code_hash.map(|x| x.0),
//         }
//     }
// }

fn borsh_ser_address<W: Write>(x: &Address, writer: &mut W) -> Result<(), Error> {
    let t = x.0 .0;
    BorshSerialize::serialize(&t, writer)
}

fn borsh_ser_u256<W: Write>(x: &U256, writer: &mut W) -> Result<(), Error> {
    let t = x.to_be_bytes::<32>();
    BorshSerialize::serialize(&t, writer)
}

fn borsh_ser_option_u256<W: Write>(x: &Option<U256>, writer: &mut W) -> Result<(), Error> {
    let t = x.map(|x| x.to_be_bytes::<32>());
    BorshSerialize::serialize(&t, writer)
}

fn borsh_ser_b256<W: Write>(x: &B256, writer: &mut W) -> Result<(), Error> {
    let t = x.0;
    BorshSerialize::serialize(&t, writer)
}

fn borsh_ser_option_b256<W: Write>(x: &Option<B256>, writer: &mut W) -> Result<(), Error> {
    let t = x.map(|x| x.0);
    BorshSerialize::serialize(&t, writer)
}

fn borsh_ser_bytes<W: Write>(x: &Bytes, writer: &mut W) -> Result<(), Error> {
    let t = &x.0;
    BorshSerialize::serialize(&t, writer)
}

fn borsh_ser_bloom<W: Write>(x: &Bloom, writer: &mut W) -> Result<(), Error> {
    let t = x.0 .0;
    BorshSerialize::serialize(&t, writer)
}

#[derive(Debug, BorshSerialize, Serialize)]
enum DiffKey {
    // Accounts
    AccountInfo(AccountInfo),
    StorageKeyIndex(StorageKeyIndex),
    StorageKeyLength(StorageKeyLength),
    StorageValue(StorageValue),
    // Evm info
    L1Hash(L1Hash),
    Untyped(Vec<u8>, Option<Vec<u8>>),
    LatestBlockHash(LatestBlockHash),
    Head(Block),
    // System info
    ScreData(RuleEnforcerData),
    SovAccountPublicKey(SovAccountPublicKey),
    SovAccount(SovAccount),
}

// EVM ACCOUNT
#[derive(Default, BorshSerialize, Deserialize, Serialize, Debug, Clone)]
struct DbAccountInfo {
    #[borsh(serialize_with = "borsh_ser_u256")]
    balance: U256,
    nonce: u64,
    #[borsh(serialize_with = "borsh_ser_option_b256")]
    code_hash: Option<B256>,
}
#[derive(Debug, Serialize, BorshSerialize)]
struct AccountInfo(
    #[borsh(serialize_with = "borsh_ser_address")] Address,
    Option<DbAccountInfo>,
);
#[derive(Debug, Serialize, BorshSerialize)]
struct StorageKeyIndex(
    #[borsh(serialize_with = "borsh_ser_address")] Address,
    usize,
    #[borsh(serialize_with = "borsh_ser_option_u256")] Option<U256>,
);
#[derive(Debug, Serialize, BorshSerialize)]
struct StorageKeyLength(
    #[borsh(serialize_with = "borsh_ser_address")] Address,
    Option<usize>,
);
#[derive(Debug, Serialize, BorshSerialize)]
struct StorageValue(
    #[borsh(serialize_with = "borsh_ser_address")] Address,
    #[borsh(serialize_with = "borsh_ser_u256")] U256,
    #[borsh(serialize_with = "borsh_ser_option_u256")] Option<U256>,
);
// EVM SYSTEM INFO
#[derive(Debug, Serialize, BorshSerialize)]
struct L1Hash(#[borsh(serialize_with = "borsh_ser_b256")] B256);
#[derive(Debug, Serialize, BorshSerialize)]
struct LatestBlockHash(
    #[borsh(serialize_with = "borsh_ser_u256")] U256,
    #[borsh(serialize_with = "borsh_ser_option_b256")] Option<B256>,
);
#[derive(Debug, PartialEq, Clone, BorshSerialize, Serialize, Deserialize)]
struct Block {
    header: Header,
    l1_fee_rate: u128,
    #[borsh(serialize_with = "borsh_ser_b256")]
    l1_hash: B256,
    transactions: Range<u64>,
}
#[derive(Debug, Clone, PartialEq, BorshSerialize, Serialize, Deserialize)]
struct Header {
    #[borsh(serialize_with = "borsh_ser_b256")]
    parent_hash: B256,
    #[borsh(serialize_with = "borsh_ser_b256")]
    ommers_hash: B256,
    #[borsh(serialize_with = "borsh_ser_address")]
    beneficiary: Address,
    #[borsh(serialize_with = "borsh_ser_b256")]
    state_root: B256,
    #[borsh(serialize_with = "borsh_ser_b256")]
    transactions_root: B256,
    #[borsh(serialize_with = "borsh_ser_b256")]
    receipts_root: B256,
    #[borsh(serialize_with = "borsh_ser_option_b256")]
    withdrawals_root: Option<B256>,
    #[borsh(serialize_with = "borsh_ser_bloom")]
    logs_bloom: Bloom,
    #[borsh(serialize_with = "borsh_ser_u256")]
    difficulty: U256,
    number: BlockNumber,
    gas_limit: u64,
    gas_used: u64,
    timestamp: u64,
    #[borsh(serialize_with = "borsh_ser_b256")]
    mix_hash: B256,
    nonce: u64,
    base_fee_per_gas: Option<u64>,
    blob_gas_used: Option<u64>,
    excess_blob_gas: Option<u64>,
    #[borsh(serialize_with = "borsh_ser_option_b256")]
    parent_beacon_block_root: Option<B256>,
    #[borsh(serialize_with = "borsh_ser_option_b256")]
    requests_root: Option<B256>,
    #[borsh(serialize_with = "borsh_ser_bytes")]
    extra_data: Bytes,
}
// SYSTEM INFO
#[derive(Clone, Debug, Serialize, Deserialize, BorshSerialize)]
struct RuleEnforcerData {
    max_l2_blocks_per_l1: u32,
    last_da_root_hash: [u8; 32],
    counter: u32,
    last_timestamp: u64,
}
#[derive(Clone, Debug, Serialize, Deserialize, BorshSerialize)]
struct SovAccountPublicKey {
    address: [u8; 32],
    public_key: Option<[u8; 32]>,
}

#[derive(Copy, Clone, Debug, Serialize, Deserialize, BorshSerialize)]
pub struct SovAccount {
    public_key: [u8; 32],
    account: Option<SovAcc>,
}

#[derive(Copy, Clone, Debug, Serialize, Deserialize, BorshSerialize)]
pub struct SovAcc {
    pub address: [u8; 32],
    pub nonce: u64,
}

let mut tdiff = vec![];
for (k, v) in &diff {
    match &k[..6] {
        _account @ b"Evm/a/" => {
            let address: Address = bcs::from_bytes(&k[6..]).unwrap();
            let info: Option<DbAccountInfo> = v.as_ref().map(|v| bcs::from_bytes(v).unwrap());
            tdiff.push(DiffKey::AccountInfo(AccountInfo(address, info)));
        }
        _keys @ b"Evm/k/" => {
            let address = Address::from_slice(&k[6..(6 + 20)]);
            match k[26] {
                b'e' => {
                    let idx: usize = bcs::from_bytes(&k[27..]).unwrap();
                    let key: Option<U256> = v.as_ref().map(|v| bcs::from_bytes(v).unwrap());
                    tdiff.push(DiffKey::StorageKeyIndex(StorageKeyIndex(address, idx, key)));
                }
                b'l' => {
                    let len: Option<usize> = v.as_ref().map(|v| bcs::from_bytes(v).unwrap());
                    tdiff.push(DiffKey::StorageKeyLength(StorageKeyLength(address, len)));
                }
                _ => {
                    unreachable!("StateVec is either e or l")
                }
            }
        }
        _storage @ b"Evm/s/" => {
            let address = Address::from_slice(&k[6..(6 + 20)]);
            let key: U256 = bcs::from_bytes(&k[26..]).unwrap();
            let value: Option<U256> = v.as_ref().map(|v| bcs::from_bytes(v).unwrap());
            tdiff.push(DiffKey::StorageValue(StorageValue(address, key, value)));
        }
        _last_l1_hash @ b"Evm/l/" => {
            let v = v.clone().unwrap();
            let value: B256 = B256::from_slice(&v[1..]);
            tdiff.push(DiffKey::L1Hash(L1Hash(value)));
        }
        _latest_block_hashes @ b"Evm/h/" => {
            let index: U256 = bcs::from_bytes(&k[6..]).unwrap();
            let value: Option<B256> = v.as_ref().map(|v| bcs::from_bytes(v).unwrap());
            tdiff.push(DiffKey::LatestBlockHash(LatestBlockHash(index, value)));
        }
        _head @ _ if k == b"Evm/head/" => {
            let value: Block = bcs::from_bytes(v.as_ref().unwrap()).unwrap();
            tdiff.push(DiffKey::Head(value));
        }
        _scredata @ _ if k.starts_with(b"SoftConfirmationRuleEnforcer/data/") => {
            let value: RuleEnforcerData = bcs::from_bytes(v.as_ref().unwrap()).unwrap();
            tdiff.push(DiffKey::ScreData(value));
        }
        _sovaccpk @ _ if k.starts_with(b"Accounts/public_keys/") => {
            let address = bcs::from_bytes(&k[21..]).unwrap();
            let public_key: Option<[u8; 32]> = v.as_ref().map(|v| bcs::from_bytes(v).unwrap());
            tdiff.push(DiffKey::SovAccountPublicKey(SovAccountPublicKey {
                address,
                public_key,
            }));
        }
        _sovaccounts @ _ if k.starts_with(b"Accounts/accounts/") => {
            let public_key = bcs::from_bytes(&k[18..]).unwrap();
            let account: Option<SovAcc> = v.as_ref().map(|v| bcs::from_bytes(v).unwrap());
            tdiff.push(DiffKey::SovAccount(SovAccount {
                public_key,
                account,
            }));
        }
        _ => {
            let key = hex::encode(k);
            let value = v.as_ref().map(|v| hex::encode(v));
            dbg!(key, value);
            tdiff.push(DiffKey::Untyped(k.to_owned(), v.to_owned()));
        }
    }
}
dbg!(&tdiff);

Research how we can optimize the structure of state diff for better compression.

kpp commented 2 months ago

100tx with eth send in 10 L2 blocks with L2 N1:

current state diff with Vec, Option<Vec>:

[src/main.rs:433:5] len = 10509
[src/main.rs:433:5] compressed.len() = 3363

parsed typed state diff with Vec<ParsedEnum>:

[src/main.rs:437:5] borshed_typed.len() = 9612
[src/main.rs:437:5] compressed_typed.len() = 3226

parsed typed aggregated-by-evm-acc-address state diff:

[src/main.rs:442:5] borshed_typed_aggr.len() = 9551
[src/main.rs:442:5] compressed_typed_aggr.len() = 3207

110tx.typed.txt

main.rs.txt

kpp commented 1 month ago
use std::{
    collections::BTreeMap,
    fs::File,
    io::{Error, ErrorKind, Read, Write},
    ops::Range,
};

use alloy_primitives::{address, keccak256, Address, BlockNumber, Bloom, Bytes, B256, U256};
use borsh::BorshSerialize;
use serde::{Deserialize, Serialize};

// #[derive(Default, Serialize, BorshSerialize, Debug, Clone)]
// struct PlainAccountInfo {
//     balance: [u8; 32], // U256
//     nonce: u64,
//     code_hash: Option<[u8; 32]>, // Option<B256>
// }

// impl From<DbAccountInfo> for PlainAccountInfo {
//     fn from(v: DbAccountInfo) -> Self {
//         Self {
//             balance: v.balance.to_be_bytes::<32>(),
//             nonce: v.nonce,
//             code_hash: v.code_hash.map(|x| x.0),
//         }
//     }
// }

fn borsh_ser_address<W: Write>(x: &Address, writer: &mut W) -> Result<(), Error> {
    let t = x.0 .0;
    BorshSerialize::serialize(&t, writer)
}

fn borsh_ser_u256<W: Write>(x: &U256, writer: &mut W) -> Result<(), Error> {
    let t = x.to_be_bytes::<32>();
    BorshSerialize::serialize(&t, writer)
}

// fn borsh_ser_option_u256<W: Write>(x: &Option<U256>, writer: &mut W) -> Result<(), Error> {
//     let t = x.map(|x| x.to_be_bytes::<32>());
//     BorshSerialize::serialize(&t, writer)
// }

fn borsh_ser_b256<W: Write>(x: &B256, writer: &mut W) -> Result<(), Error> {
    let t = x.0;
    BorshSerialize::serialize(&t, writer)
}

fn borsh_ser_vec_b256<W: Write>(x: &Vec<B256>, writer: &mut W) -> Result<(), Error> {
    let t: Vec<_> = x.into_iter().map(|x| x.0).collect();
    BorshSerialize::serialize(&t, writer)
}

fn borsh_ser_option_b256<W: Write>(x: &Option<B256>, writer: &mut W) -> Result<(), Error> {
    let t = x.map(|x| x.0);
    BorshSerialize::serialize(&t, writer)
}

fn borsh_ser_bytes<W: Write>(x: &Bytes, writer: &mut W) -> Result<(), Error> {
    let t = &x.0;
    BorshSerialize::serialize(&t, writer)
}

fn borsh_ser_bloom<W: Write>(x: &Bloom, writer: &mut W) -> Result<(), Error> {
    let t = x.0 .0;
    BorshSerialize::serialize(&t, writer)
}

fn borsh_ser_btree_address<V: BorshSerialize, W: Write>(
    x: &BTreeMap<Address, V>,
    writer: &mut W,
) -> Result<(), Error> {
    let len = u32::try_from(x.len()).map_err(|_| ErrorKind::InvalidData)?;
    BorshSerialize::serialize(&len, writer)?;
    for (key, value) in x {
        BorshSerialize::serialize(&(key.0 .0), writer)?;
        BorshSerialize::serialize(value, writer)?;
    }
    Ok(())
}

// Preimage path for a slot
#[derive(Debug, Copy, Clone, BorshSerialize, Serialize)]
enum V {
    A(u32),
    B(u32, u8),
    C(u32, u8),
    D(u32, u8, u8),
    E(u32, u8, u8),
    F(u8, u32),
}

#[derive(Debug, BorshSerialize, Serialize)]
struct TypedDiff {
    #[borsh(serialize_with = "borsh_ser_btree_address")]
    evm_accounts: BTreeMap<Address, Vec<EvmAccountChanges>>,
    system_events: Vec<SystemEvent>,
    rest: Vec<Untyped>,
}

#[derive(Debug, BorshSerialize, Serialize)]
enum EvmAccountChanges {
    SetAccountInfo(DbAccountInfo),
    RemoveAccountInfo,
    SetKeyStorageLength(usize),
    RemoveKeyStorageLength,
    SetNewStartingStorageKey(usize),
    NewStorageValue(
        #[borsh(serialize_with = "borsh_ser_u256")] U256,
        #[borsh(serialize_with = "borsh_ser_u256")] U256,
    ),
    NewPreimageValue(V, #[borsh(serialize_with = "borsh_ser_u256")] U256),
    NewStorageZero(#[borsh(serialize_with = "borsh_ser_u256")] U256),
    UpdateStorageValue(
        #[borsh(serialize_with = "borsh_ser_u256")] U256,
        #[borsh(serialize_with = "borsh_ser_u256")] U256,
    ),
    UpdateStorageZero(#[borsh(serialize_with = "borsh_ser_u256")] U256),
    RemoveStorageKey(usize),
    RemoveStorageValue(#[borsh(serialize_with = "borsh_ser_u256")] U256),
}

#[derive(Debug, BorshSerialize, Serialize)]
enum SystemEvent {
    // Evm info
    SetL1Hash(#[borsh(serialize_with = "borsh_ser_b256")] B256),
    // Should be only one
    SetLatestBlockHash(
        #[borsh(serialize_with = "borsh_ser_u256")] U256,
        #[borsh(serialize_with = "borsh_ser_vec_b256")] Vec<B256>,
    ),
    RemoveLatestBlockHashRange(#[borsh(serialize_with = "borsh_ser_u256")] U256, u32),
    SetHead(Block),
    SetScreData(RuleEnforcerData),
    SetSovAccountPublicKey([u8; 32], [u8; 32]),
    RemoveSovAccountPublicKey([u8; 32]),
    SetSovAccount([u8; 32], SovAcc),
    RemoveSovAccount([u8; 32]),
}

#[derive(Debug, BorshSerialize, Serialize)]
struct Untyped {
    key: Vec<u8>,
    value: Option<Vec<u8>>,
}

// EVM ACCOUNT

#[derive(Default, BorshSerialize, Deserialize, Serialize, Debug, Clone)]
struct DbAccountInfo {
    #[borsh(serialize_with = "borsh_ser_u256")]
    balance: U256,
    nonce: u64,
    #[borsh(serialize_with = "borsh_ser_option_b256")]
    code_hash: Option<B256>,
}

// // There are only 8 possible values, permutation of balance, nonce, code_hash
// // given there is a special value 0 and the rest is non-zero:
// #[derive(Default, BorshSerialize, Deserialize, Serialize, Debug, Clone)]
// enum AccountChanges {
//     // 0, 0, 0
//     #[default]
//     Clear,

//     // x, 0, 0
//     Balance(#[borsh(serialize_with = "borsh_ser_u256")] U256),

//     // 0, x, 0
//     Nonce(u64),

//     // 0, 0, x
//     Code(#[borsh(serialize_with = "borsh_ser_b256")] B256),

//     // x, x, 0
//     BalanceNonce(#[borsh(serialize_with = "borsh_ser_u256")] U256, u64),

//     // x, 0, x
//     BalanceCode(
//         #[borsh(serialize_with = "borsh_ser_u256")] U256,
//         #[borsh(serialize_with = "borsh_ser_b256")] B256,
//     ),

//     // 0, x, x
//     NonceCode(u64, #[borsh(serialize_with = "borsh_ser_b256")] B256),

//     // x, x, x
//     All(
//         #[borsh(serialize_with = "borsh_ser_u256")] U256,
//         u64,
//         #[borsh(serialize_with = "borsh_ser_b256")] B256,
//     ),
// }

// impl From<DbAccountInfo> for AccountChanges {
//     fn from(v: DbAccountInfo) -> Self {
//         if v.balance.is_zero() {
//             if v.nonce == 0 {
//                 if let Some(code) = v.code_hash {
//                     Self::Code(code)
//                 } else {
//                     Self::Clear
//                 }
//             } else {
//                 if let Some(code) = v.code_hash {
//                     Self::NonceCode(v.nonce, code)
//                 } else {
//                     Self::Nonce(v.nonce)
//                 }
//             }
//         } else {
//             if v.nonce == 0 {
//                 if let Some(code) = v.code_hash {
//                     Self::BalanceCode(v.balance, code)
//                 } else {
//                     Self::Balance(v.balance)
//                 }
//             } else {
//                 if let Some(code) = v.code_hash {
//                     Self::All(v.balance, v.nonce, code)
//                 } else {
//                     Self::BalanceNonce(v.balance, v.nonce)
//                 }
//             }
//         }
//     }
// }

#[derive(Debug, PartialEq, Clone, BorshSerialize, Serialize, Deserialize)]
struct Block {
    header: Header,
    l1_fee_rate: u128,
    #[borsh(serialize_with = "borsh_ser_b256")]
    l1_hash: B256,
    transactions: Range<u64>,
}
#[derive(Debug, Clone, PartialEq, BorshSerialize, Serialize, Deserialize)]
struct Header {
    #[borsh(serialize_with = "borsh_ser_b256")]
    parent_hash: B256,
    #[borsh(serialize_with = "borsh_ser_b256")]
    ommers_hash: B256,
    #[borsh(serialize_with = "borsh_ser_address")]
    beneficiary: Address,
    #[borsh(serialize_with = "borsh_ser_b256")]
    state_root: B256,
    #[borsh(serialize_with = "borsh_ser_b256")]
    transactions_root: B256,
    #[borsh(serialize_with = "borsh_ser_b256")]
    receipts_root: B256,
    #[borsh(serialize_with = "borsh_ser_option_b256")]
    withdrawals_root: Option<B256>,
    #[borsh(serialize_with = "borsh_ser_bloom")]
    logs_bloom: Bloom,
    #[borsh(serialize_with = "borsh_ser_u256")]
    difficulty: U256,
    number: BlockNumber,
    gas_limit: u64,
    gas_used: u64,
    timestamp: u64,
    #[borsh(serialize_with = "borsh_ser_b256")]
    mix_hash: B256,
    nonce: u64,
    base_fee_per_gas: Option<u64>,
    blob_gas_used: Option<u64>,
    excess_blob_gas: Option<u64>,
    #[borsh(serialize_with = "borsh_ser_option_b256")]
    parent_beacon_block_root: Option<B256>,
    #[borsh(serialize_with = "borsh_ser_option_b256")]
    requests_root: Option<B256>,
    #[borsh(serialize_with = "borsh_ser_bytes")]
    extra_data: Bytes,
}
// SYSTEM INFO
#[derive(Clone, Copy, Debug, Serialize, Deserialize, BorshSerialize)]
struct RuleEnforcerData {
    max_l2_blocks_per_l1: u32,
    last_da_root_hash: [u8; 32],
    counter: u32,
    last_timestamp: u64,
}
#[derive(Clone, Debug, Serialize, Deserialize, BorshSerialize)]
struct SovAccountPublicKey {
    address: [u8; 32],
    public_key: Option<[u8; 32]>,
}

#[derive(Copy, Clone, Debug, Serialize, Deserialize, BorshSerialize)]
pub struct SovAccount {
    public_key: [u8; 32],
    account: Option<SovAcc>,
}

#[derive(Copy, Clone, Debug, Serialize, Deserialize, BorshSerialize)]
pub struct SovAcc {
    pub address: [u8; 32],
    pub nonce: u64,
}

macro_rules! map {
    ($($k:expr => $v:expr),*) => {
        {
        use std::collections::BTreeMap;
        let mut x = BTreeMap::new();
        $(
            x.insert($k, $v);
        )*
        x
        }
    }
}

#[derive(Deserialize)]
struct JsonResponse {
    // id: u64,
    result: JsonResponseResult,
}

#[derive(Deserialize)]
struct JsonResponseResult {
    proof: JsonProof,
}

#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
struct JsonProof {
    state_transition: JsonStateTransition,
}

#[derive(Deserialize, BorshSerialize)]
#[serde(rename_all = "camelCase")]
struct JsonStateTransition {
    state_diff: BTreeMap<String, Option<String>>,
}

fn main() {
    let genesis_transfers_diff = {
        let diff = map! {vec![65, 99, 99, 111, 117, 110, 116, 115, 47, 97, 99, 99, 111, 117, 110, 116, 115, 47, 32, 64, 64, 227, 100, 193, 15, 43, 236, 156, 31, 229, 0, 161, 205, 76, 36, 124, 137, 214, 80, 160, 30, 215, 232, 44, 171, 168, 103, 135, 124, 33]=> Some(vec![176, 6, 99, 89, 214, 79, 151, 235, 39, 153, 71, 254, 235, 8, 58, 150, 52, 61, 95, 90, 10, 44, 156, 248, 40, 66, 246, 244, 116, 159, 245, 52, 10, 0, 0, 0, 0, 0, 0, 0]), vec![65, 99, 99, 111, 117, 110, 116, 115, 47, 112, 117, 98, 108, 105, 99, 95, 107, 101, 121, 115, 47, 176, 6, 99, 89, 214, 79, 151, 235, 39, 153, 71, 254, 235, 8, 58, 150, 52, 61, 95, 90, 10, 44, 156, 248, 40, 66, 246, 244, 116, 159, 245, 52]=> Some(vec![32, 64, 64, 227, 100, 193, 15, 43, 236, 156, 31, 229, 0, 161, 205, 76, 36, 124, 137, 214, 80, 160, 30, 215, 232, 44, 171, 168, 103, 135, 124, 33]), vec![69, 118, 109, 47, 97, 47, 20, 0, 95, 217, 87, 74, 25, 201, 172, 162, 58, 202, 145, 237, 102, 178, 221, 42, 106, 181, 210]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 0, 96, 94, 108, 37, 43, 220, 93, 4, 249, 205, 228, 176, 83, 166, 129, 212, 209, 34, 137]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 1, 188, 137, 7, 68, 42, 58, 185, 127, 250, 177, 99, 187, 131, 61, 63, 146, 109, 104, 59]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 6, 11, 58, 123, 31, 35, 64, 95, 98, 66, 75, 5, 164, 234, 161, 45, 28, 192, 120, 160]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 12, 144, 67, 89, 51, 190, 96, 141, 225, 134, 49, 238, 198, 47, 108, 128, 98, 176, 143, 180]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 12, 150, 43, 35, 249, 198, 210, 8, 104, 249, 109, 16, 153, 14, 92, 107, 86, 187, 168, 20]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 14, 156, 162, 208, 53, 18, 170, 170, 192, 191, 241, 116, 24, 235, 217, 108, 103, 216, 246, 95]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 16, 239, 159, 146, 247, 58, 93, 48, 30, 37, 251, 135, 126, 100, 161, 84, 60, 248, 204, 190]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 17, 133, 184, 151, 71, 224, 100, 163, 156, 248, 47, 82, 104, 104, 214, 154, 40, 69, 51, 62]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 21, 55, 45, 163, 163, 237, 168, 184, 80, 164, 241, 119, 121, 97, 235, 192, 117, 129, 110, 145]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 21, 83, 75, 241, 245, 171, 193, 186, 209, 234, 95, 199, 156, 239, 32, 39, 130, 165, 78, 32]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 23, 136, 124, 182, 212, 154, 211, 41, 190, 58, 43, 184, 20, 206, 49, 53, 83, 79, 150, 225]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 25, 64, 34, 81, 179, 223, 82, 204, 34, 187, 178, 236, 150, 159, 37, 214, 150, 162, 118, 96]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 27, 32, 142, 1, 41, 205, 92, 64, 13, 119, 180, 3, 251, 242, 103, 107, 214, 146, 162, 127]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 28, 81, 177, 25, 219, 109, 190, 195, 109, 236, 229, 146, 154, 132, 124, 230, 58, 18, 84, 213]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 30, 102, 147, 155, 61, 34, 186, 151, 49, 12, 98, 196, 44, 175, 155, 180, 155, 253, 22, 187]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 36, 62, 175, 70, 82, 12, 3, 188, 52, 68, 194, 17, 172, 60, 186, 185, 70, 213, 62, 116]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 37, 142, 228, 5, 37, 232, 243, 42, 68, 50, 88, 134, 206, 125, 124, 213, 56, 210, 32, 125]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 44, 108, 49, 234, 80, 201, 39, 87, 130, 199, 66, 249, 147, 39, 0, 41, 173, 233, 54, 22]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 44, 139, 43, 136, 84, 25, 19, 254, 246, 12, 4, 21, 121, 26, 29, 248, 53, 101, 218, 149]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 44, 146, 9, 176, 4, 38, 48, 23, 119, 213, 164, 121, 54, 16, 201, 77, 11, 61, 245, 175]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 48, 33, 223, 83, 48, 138, 251, 149, 133, 242, 247, 155, 79, 72, 151, 223, 90, 47, 141, 37]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 226, 57, 142, 190, 110, 112, 1, 0, 0, 0, 0, 0, 0, 0, 1, 32, 51, 91, 99, 89, 20, 53, 213, 205, 162, 12, 66, 48, 44, 42, 157, 244, 143, 102, 140, 81, 150, 66, 227, 95, 7, 9, 143, 205, 101, 91, 91, 130]), vec![69, 118, 109, 47, 97, 47, 20, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 189, 231, 54, 64, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 32, 51, 91, 99, 89, 20, 53, 213, 205, 162, 12, 66, 48, 44, 42, 157, 244, 143, 102, 140, 81, 150, 66, 227, 95, 7, 9, 143, 205, 101, 91, 91, 130]), vec![69, 118, 109, 47, 97, 47, 20, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 111, 64, 1, 0, 0, 0, 0, 0, 0, 0, 1, 32, 51, 91, 99, 89, 20, 53, 213, 205, 162, 12, 66, 48, 44, 42, 157, 244, 143, 102, 140, 81, 150, 66, 227, 95, 7, 9, 143, 205, 101, 91, 91, 130]), vec![69, 118, 109, 47, 97, 47, 20, 51, 144, 113, 116, 36, 60, 119, 250, 31, 172, 222, 108, 124, 207, 86, 220, 241, 217, 71, 50]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 57, 190, 105, 165, 176, 176, 1, 247, 127, 212, 44, 72, 137, 185, 245, 249, 178, 40, 101, 165]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 74, 83, 24, 170, 118, 84, 137, 212, 244, 135, 156, 112, 203, 51, 37, 230, 196, 246, 24, 106]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 76, 138, 124, 172, 33, 59, 215, 81, 37, 219, 90, 79, 229, 68, 2, 187, 5, 152, 231, 97]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 77, 191, 101, 247, 158, 9, 217, 31, 1, 132, 64, 17, 252, 39, 8, 253, 247, 168, 55, 118]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 78, 62, 149, 172, 115, 226, 216, 99, 74, 20, 248, 218, 220, 101, 153, 53, 27, 187, 9, 147]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 79, 224, 21, 52, 43, 119, 172, 59, 78, 90, 14, 82, 27, 92, 80, 144, 232, 0, 176, 140]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 82, 77, 245, 33, 211, 211, 204, 207, 200, 157, 28, 181, 178, 100, 206, 47, 108, 170, 193, 54]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 84, 90, 10, 100, 197, 181, 7, 185, 98, 151, 26, 21, 1, 155, 139, 37, 3, 208, 69, 238]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 85, 140, 18, 147, 47, 246, 40, 194, 32, 127, 58, 76, 102, 29, 19, 132, 211, 149, 49, 224]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 87, 90, 163, 254, 151, 73, 241, 229, 153, 75, 219, 156, 1, 234, 138, 73, 89, 53, 191, 129]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 88, 15, 6, 62, 155, 105, 184, 156, 164, 124, 173, 196, 92, 173, 69, 87, 202, 234, 206, 220]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 91, 249, 190, 82, 79, 56, 201, 36, 221, 65, 127, 82, 39, 22, 18, 189, 166, 158, 166, 117]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 93, 107, 24, 107, 251, 42, 249, 240, 136, 55, 79, 245, 146, 244, 176, 104, 55, 150, 184, 90]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 96, 20, 25, 19, 234, 13, 56, 32, 20, 242, 202, 117, 200, 77, 180, 124, 189, 56, 97, 174]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 97, 60, 66, 215, 159, 7, 177, 181, 230, 82, 204, 233, 197, 224, 114, 14, 189, 166, 63, 120]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 97, 220, 12, 83, 240, 82, 246, 121, 65, 143, 219, 140, 49, 212, 178, 254, 150, 140, 142, 162]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 101, 244, 244, 61, 216, 11, 190, 218, 145, 117, 64, 199, 5, 176, 120, 85, 217, 189, 102, 228]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 106, 93, 169, 4, 116, 99, 232, 213, 3, 165, 66, 47, 221, 148, 149, 142, 208, 96, 179, 206]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 107, 7, 29, 84, 45, 93, 253, 103, 36, 161, 62, 185, 96, 90, 78, 131, 37, 204, 215, 83]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 108, 79, 122, 44, 23, 141, 42, 142, 187, 204, 37, 2, 227, 226, 90, 252, 82, 219, 52, 109]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 108, 101, 67, 244, 65, 233, 155, 164, 198, 149, 233, 39, 237, 201, 178, 243, 84, 55, 120, 81]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 108, 105, 111, 76, 86, 161, 166, 131, 152, 169, 17, 2, 244, 54, 154, 141, 31, 136, 94, 156]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 113, 73, 66, 177, 97, 226, 23, 251, 249, 167, 106, 221, 234, 149, 221, 31, 135, 109, 40, 179]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 116, 158, 162, 118, 82, 191, 250, 31, 233, 137, 40, 69, 187, 84, 181, 180, 227, 183, 120, 126]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 118, 34, 255, 164, 133, 235, 130, 224, 209, 136, 126, 244, 81, 116, 6, 201, 155, 145, 183, 199]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 122, 144, 16, 158, 181, 119, 22, 124, 7, 242, 56, 172, 145, 67, 77, 26, 226, 56, 189, 113]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 122, 147, 27, 139, 154, 247, 83, 86, 46, 13, 38, 190, 132, 224, 139, 91, 135, 107, 126, 145]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 130, 47, 90, 152, 19, 32, 169, 87, 112, 56, 212, 50, 146, 170, 17, 143, 19, 110, 30, 77]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 132, 75, 100, 80, 176, 206, 160, 105, 13, 51, 203, 246, 97, 168, 123, 156, 23, 54, 107, 194]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 132, 249, 11, 137, 223, 17, 82, 57, 58, 128, 115, 206, 114, 106, 247, 234, 166, 53, 121, 62]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 133, 99, 234, 201, 54, 41, 189, 60, 254, 106, 79, 247, 253, 244, 198, 243, 90, 72, 127, 212]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 142, 170, 53, 55, 85, 187, 83, 232, 231, 171, 9, 111, 94, 93, 239, 131, 179, 158, 220, 33]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 150, 101, 55, 15, 235, 12, 134, 138, 42, 61, 141, 241, 206, 205, 47, 219, 205, 32, 18, 208]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 151, 126, 34, 119, 36, 181, 94, 83, 226, 31, 11, 94, 71, 245, 239, 253, 84, 147, 85, 187]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 153, 53, 185, 154, 254, 158, 35, 12, 219, 60, 196, 76, 17, 240, 37, 124, 207, 0, 151, 44]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 157, 111, 187, 163, 5, 212, 107, 0, 208, 42, 27, 62, 40, 105, 225, 39, 195, 128, 56, 192]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 160, 135, 164, 155, 39, 109, 177, 26, 165, 225, 220, 198, 67, 191, 0, 127, 1, 152, 92, 103]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 163, 131, 243, 85, 181, 254, 196, 4, 26, 102, 15, 220, 174, 196, 172, 58, 84, 119, 162, 78]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 168, 28, 133, 16, 244, 48, 47, 158, 24, 53, 76, 188, 150, 33, 71, 47, 114, 218, 166, 148]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 169, 151, 165, 221, 168, 240, 74, 146, 217, 252, 56, 102, 37, 171, 45, 182, 203, 224, 172, 112]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 170, 51, 153, 84, 202, 170, 215, 28, 83, 206, 97, 80, 142, 57, 100, 246, 143, 148, 62, 108]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 170, 222, 106, 68, 27, 197, 100, 218, 145, 169, 211, 190, 165, 87, 150, 50, 77, 90, 14, 100]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 170, 233, 13, 228, 36, 25, 185, 254, 83, 54, 216, 57, 223, 192, 115, 93, 5, 211, 72, 1]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 173, 128, 155, 229, 143, 34, 243, 248, 215, 106, 249, 12, 176, 239, 143, 192, 28, 21, 12, 101]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 177, 27, 200, 193, 71, 54, 186, 137, 1, 186, 83, 116, 186, 79, 19, 171, 2, 37, 97, 225]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 177, 37, 120, 162, 44, 52, 54, 61, 83, 209, 128, 233, 43, 14, 223, 253, 151, 188, 23, 97]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 177, 199, 147, 43, 252, 76, 205, 200, 178, 237, 241, 62, 144, 186, 27, 247, 57, 103, 147, 81]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 178, 120, 195, 233, 231, 223, 255, 240, 205, 13, 169, 234, 37, 11, 215, 43, 218, 54, 31, 82]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 179, 71, 245, 233, 35, 231, 231, 199, 132, 75, 175, 208, 2, 224, 29, 245, 95, 249, 131, 135]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 182, 181, 255, 83, 73, 200, 5, 217, 65, 129, 48, 121, 162, 129, 9, 98, 231, 145, 159, 178]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 185, 68, 37, 180, 165, 153, 220, 148, 123, 221, 57, 202, 210, 50, 24, 245, 123, 70, 211, 23]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 186, 186, 159, 45, 187, 239, 242, 164, 30, 191, 12, 252, 231, 111, 80, 53, 25, 71, 247, 152]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 193, 82, 26, 229, 236, 82, 149, 15, 189, 249, 123, 180, 43, 43, 11, 215, 180, 15, 67, 74]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 194, 201, 14, 94, 202, 144, 224, 115, 0, 43, 217, 63, 7, 152, 130, 19, 27, 135, 98, 88]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 195, 81, 161, 57, 100, 42, 227, 203, 153, 12, 176, 115, 234, 25, 82, 134, 98, 200, 229, 92]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 200, 39, 21, 232, 191, 136, 241, 230, 240, 99, 181, 221, 34, 207, 63, 235, 50, 97, 60, 217]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 200, 127, 248, 75, 236, 106, 11, 146, 109, 35, 71, 49, 23, 35, 191, 151, 208, 139, 83, 90]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 204, 114, 7, 62, 157, 153, 28, 191, 224, 217, 201, 205, 22, 135, 142, 161, 119, 133, 23, 221]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 205, 145, 96, 249, 27, 196, 73, 252, 160, 217, 227, 83, 66, 165, 22, 111, 158, 213, 228, 8]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 211, 111, 140, 26, 36, 137, 19, 66, 84, 253, 83, 63, 198, 153, 169, 68, 91, 232, 42, 247]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 212, 100, 219, 41, 42, 118, 112, 115, 164, 29, 63, 232, 66, 228, 111, 26, 30, 101, 240, 119]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 214, 168, 165, 233, 103, 30, 30, 238, 26, 149, 1, 19, 63, 151, 2, 131, 164, 216, 88, 32]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 216, 158, 76, 28, 124, 78, 249, 19, 124, 233, 183, 13, 201, 51, 181, 143, 55, 36, 216, 190]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 217, 22, 155, 53, 19, 99, 106, 122, 103, 61, 209, 255, 32, 102, 190, 131, 172, 92, 165, 112]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 217, 64, 89, 77, 12, 174, 12, 46, 176, 104, 38, 73, 153, 131, 10, 231, 128, 100, 73, 33]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 222, 137, 154, 65, 149, 186, 200, 98, 236, 33, 74, 213, 86, 221, 55, 227, 64, 50, 71, 244]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 222, 173, 222, 173, 222, 173, 222, 173, 222, 173, 222, 173, 222, 173, 222, 173, 222, 173, 222, 173]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 227, 121, 15, 55, 144, 177, 178, 249, 217, 121, 7, 250, 127, 176, 224, 195, 106, 147, 209, 157]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 228, 81, 40, 241, 183, 84, 62, 120, 84, 222, 203, 134, 5, 26, 247, 138, 39, 244, 36, 142]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 228, 227, 12, 187, 154, 223, 83, 227, 98, 44, 123, 74, 13, 123, 175, 249, 110, 218, 204, 138]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 232, 120, 171, 88, 235, 132, 205, 125, 55, 221, 210, 46, 54, 98, 232, 72, 133, 95, 41, 47]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 233, 98, 84, 163, 255, 220, 98, 168, 144, 134, 139, 12, 45, 190, 156, 254, 251, 173, 86, 13]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 240, 163, 168, 181, 80, 193, 80, 228, 242, 179, 197, 69, 190, 181, 172, 0, 75, 199, 74, 16]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 242, 193, 151, 77, 171, 221, 93, 57, 85, 247, 24, 254, 178, 182, 227, 177, 107, 213, 96, 175]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 243, 159, 214, 229, 26, 173, 136, 246, 244, 206, 106, 184, 130, 114, 121, 207, 255, 185, 34, 102]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 251, 253, 8, 136, 202, 225, 235, 100, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 244, 72, 205, 36, 83, 109, 78, 100, 133, 232, 97, 54, 159, 154, 173, 84, 42, 7, 125, 245]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 246, 62, 139, 96, 54, 149, 146, 141, 73, 173, 67, 131, 232, 252, 191, 241, 248, 146, 218, 42]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 247, 144, 37, 147, 83, 14, 175, 95, 151, 133, 118, 186, 64, 85, 50, 220, 116, 94, 238, 106]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 97, 47, 20, 255, 160, 241, 43, 202, 148, 149, 25, 140, 95, 44, 196, 252, 34, 243, 79, 250, 255, 64, 90]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 104, 47, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]=> Some(vec![32, 182, 13, 2, 48, 179, 216, 252, 241, 12, 166, 129, 36, 42, 44, 19, 178, 229, 225, 208, 122, 47, 1, 79, 163, 154, 104, 48, 179, 211, 61, 136, 219]), vec![69, 118, 109, 47, 104, 47, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]=> Some(vec![32, 187, 89, 80, 19, 6, 236, 187, 148, 12, 48, 5, 79, 228, 103, 90, 12, 56, 25, 51, 187, 251, 233, 235, 146, 165, 65, 47, 198, 171, 75, 151, 158]), vec![69, 118, 109, 47, 104, 47, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]=> Some(vec![32, 11, 169, 138, 100, 194, 201, 194, 188, 142, 15, 159, 249, 106, 160, 15, 200, 165, 206, 131, 5, 35, 219, 225, 105, 254, 92, 138, 135, 54, 100, 159, 107]), vec![69, 118, 109, 47, 104, 47, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3]=> Some(vec![32, 222, 247, 133, 0, 61, 131, 254, 7, 128, 196, 127, 136, 251, 246, 26, 239, 93, 255, 111, 151, 91, 130, 240, 120, 185, 24, 45, 125, 181, 212, 183, 191]), vec![69, 118, 109, 47, 104, 47, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4]=> Some(vec![32, 58, 17, 62, 242, 9, 161, 103, 88, 222, 69, 59, 128, 129, 28, 82, 8, 167, 190, 152, 128, 52, 142, 133, 165, 237, 134, 157, 218, 226, 14, 8, 247]), vec![69, 118, 109, 47, 104, 47, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5]=> Some(vec![32, 26, 253, 131, 209, 75, 128, 229, 210, 237, 24, 178, 81, 241, 79, 218, 110, 206, 84, 253, 93, 143, 215, 87, 102, 236, 61, 251, 156, 208, 114, 239, 25]), vec![69, 118, 109, 47, 104, 47, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6]=> Some(vec![32, 199, 98, 137, 152, 197, 239, 37, 38, 1, 1, 121, 197, 117, 195, 128, 144, 194, 12, 229, 10, 3, 127, 106, 76, 27, 174, 79, 247, 146, 189, 113, 52]), vec![69, 118, 109, 47, 104, 47, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7]=> Some(vec![32, 79, 20, 17, 194, 209, 122, 209, 157, 153, 95, 221, 23, 73, 34, 160, 197, 131, 75, 132, 140, 147, 29, 24, 40, 187, 174, 201, 249, 30, 206, 36, 196]), vec![69, 118, 109, 47, 104, 47, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8]=> Some(vec![32, 140, 99, 78, 122, 176, 240, 45, 112, 14, 181, 164, 30, 59, 209, 79, 181, 130, 47, 94, 108, 30, 14, 24, 51, 66, 184, 93, 224, 172, 191, 223, 0]), vec![69, 118, 109, 47, 104, 47, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9]=> Some(vec![32, 225, 203, 215, 251, 215, 24, 59, 53, 194, 148, 165, 50, 54, 10, 167, 136, 242, 192, 29, 154, 13, 178, 89, 219, 26, 214, 59, 122, 53, 47, 191, 118]), vec![69, 118, 109, 47, 104, 101, 97, 100, 47]=> Some(vec![32, 225, 203, 215, 251, 215, 24, 59, 53, 194, 148, 165, 50, 54, 10, 167, 136, 242, 192, 29, 154, 13, 178, 89, 219, 26, 214, 59, 122, 53, 47, 191, 118, 32, 29, 204, 77, 232, 222, 199, 93, 122, 171, 133, 181, 103, 182, 204, 212, 26, 211, 18, 69, 27, 148, 138, 116, 19, 240, 161, 66, 253, 64, 212, 147, 71, 20, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 32, 197, 210, 70, 1, 134, 247, 35, 60, 146, 126, 125, 178, 220, 199, 3, 192, 229, 0, 182, 83, 202, 130, 39, 59, 123, 250, 216, 4, 93, 133, 164, 112, 32, 223, 232, 101, 213, 33, 254, 144, 158, 19, 69, 58, 226, 251, 69, 39, 14, 236, 71, 39, 193, 141, 101, 178, 28, 45, 171, 221, 234, 246, 60, 53, 95, 32, 179, 74, 41, 228, 163, 10, 181, 211, 47, 219, 192, 41, 42, 151, 172, 28, 241, 2, 140, 8, 95, 83, 141, 236, 45, 145, 217, 28, 109, 11, 5, 98, 0, 128, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 128, 195, 201, 1, 0, 0, 0, 0, 80, 52, 3, 0, 0, 0, 0, 0, 232, 121, 221, 102, 0, 0, 0, 0, 32, 135, 73, 158, 141, 158, 48, 83, 135, 126, 189, 231, 163, 46, 244, 94, 194, 235, 191, 174, 20, 195, 38, 152, 217, 46, 187, 27, 37, 197, 107, 249, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 39, 241, 1, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 2, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 135, 73, 158, 141, 158, 48, 83, 135, 126, 189, 231, 163, 46, 244, 94, 194, 235, 191, 174, 20, 195, 38, 152, 217, 46, 187, 27, 37, 197, 107, 249, 51, 93, 0, 0, 0, 0, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 107, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 101, 0, 0, 0, 0, 0, 0, 0, 0]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 107, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 101, 1, 0, 0, 0, 0, 0, 0, 0]=> Some(vec![32, 93, 7, 193, 189, 8, 44, 216, 1, 96, 242, 164, 109, 143, 102, 77, 156, 150, 137, 253, 224, 214, 141, 44, 228, 39, 233, 160, 105, 58, 0, 122, 129]), vec![69, 118, 109, 47, 107, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 101, 2, 0, 0, 0, 0, 0, 0, 0]=> Some(vec![32, 142, 128, 235, 222, 47, 167, 174, 166, 156, 165, 216, 130, 156, 74, 207, 141, 28, 250, 214, 210, 10, 91, 167, 128, 114, 57, 17, 115, 25, 126, 122, 153]), vec![69, 118, 109, 47, 107, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 108]=> Some(vec![3, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 107, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 101, 0, 0, 0, 0, 0, 0, 0, 0]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 107, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 101, 1, 0, 0, 0, 0, 0, 0, 0]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33]), vec![69, 118, 109, 47, 107, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 101, 2, 0, 0, 0, 0, 0, 0, 0]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35]), vec![69, 118, 109, 47, 107, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 101, 3, 0, 0, 0, 0, 0, 0, 0]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36]), vec![69, 118, 109, 47, 107, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 101, 4, 0, 0, 0, 0, 0, 0, 0]=> Some(vec![32, 213, 123, 43, 81, 102, 71, 143, 212, 49, 141, 42, 204, 108, 194, 199, 4, 88, 67, 18, 189, 216, 120, 27, 50, 213, 208, 106, 189, 165, 127, 66, 48]), vec![69, 118, 109, 47, 107, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 101, 5, 0, 0, 0, 0, 0, 0, 0]=> Some(vec![32, 213, 123, 43, 81, 102, 71, 143, 212, 49, 141, 42, 204, 108, 194, 199, 4, 88, 67, 18, 189, 216, 120, 27, 50, 213, 208, 106, 189, 165, 127, 66, 49]), vec![69, 118, 109, 47, 107, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 108]=> Some(vec![6, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 108, 47]=> Some(vec![32, 135, 73, 158, 141, 158, 48, 83, 135, 126, 189, 231, 163, 46, 244, 94, 194, 235, 191, 174, 20, 195, 38, 152, 217, 46, 187, 27, 37, 197, 107, 249, 51]), vec![69, 118, 109, 47, 115, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 11]), vec![69, 118, 109, 47, 115, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 32, 93, 7, 193, 189, 8, 44, 216, 1, 96, 242, 164, 109, 143, 102, 77, 156, 150, 137, 253, 224, 214, 141, 44, 228, 39, 233, 160, 105, 58, 0, 122, 129]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![69, 118, 109, 47, 115, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 32, 142, 128, 235, 222, 47, 167, 174, 166, 156, 165, 216, 130, 156, 74, 207, 141, 28, 250, 214, 210, 10, 91, 167, 128, 114, 57, 17, 115, 25, 126, 122, 153]=> Some(vec![32, 135, 73, 158, 141, 158, 48, 83, 135, 126, 189, 231, 163, 46, 244, 94, 194, 235, 191, 174, 20, 195, 38, 152, 217, 46, 187, 27, 37, 197, 107, 249, 51]), vec![69, 118, 109, 47, 115, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 173, 222, 173, 222, 173, 222, 173, 222, 173, 222, 173, 222, 173, 222, 173, 222, 173, 222, 173, 1]), vec![69, 118, 109, 47, 115, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 199, 35, 4, 137, 232, 0, 0]), vec![69, 118, 109, 47, 115, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35]=> Some(vec![32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91]), vec![69, 118, 109, 47, 115, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36]=> Some(vec![32, 8, 0, 0, 0, 0, 59, 154, 202, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20]), vec![69, 118, 109, 47, 115, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 32, 213, 123, 43, 81, 102, 71, 143, 212, 49, 141, 42, 204, 108, 194, 199, 4, 88, 67, 18, 189, 216, 120, 27, 50, 213, 208, 106, 189, 165, 127, 66, 48]=> Some(vec![32, 74, 32, 124, 72, 3, 66, 25, 86, 219, 83, 238, 210, 158, 228, 91, 221, 190, 96, 209, 110, 102, 86, 15, 145, 138, 148, 39, 14, 165, 39, 43, 43]), vec![69, 118, 109, 47, 115, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 32, 213, 123, 43, 81, 102, 71, 143, 212, 49, 141, 42, 204, 108, 194, 199, 4, 88, 67, 18, 189, 216, 120, 27, 50, 213, 208, 106, 189, 165, 127, 66, 49]=> Some(vec![32, 78, 144, 172, 0, 99, 6, 99, 105, 116, 114, 101, 97, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), vec![83, 111, 102, 116, 67, 111, 110, 102, 105, 114, 109, 97, 116, 105, 111, 110, 82, 117, 108, 101, 69, 110, 102, 111, 114, 99, 101, 114, 47, 100, 97, 116, 97, 47]=> Some(vec![128, 81, 1, 0, 135, 73, 158, 141, 158, 48, 83, 135, 126, 189, 231, 163, 46, 244, 94, 194, 235, 191, 174, 20, 195, 38, 152, 217, 46, 187, 27, 37, 197, 107, 249, 51, 10, 0, 0, 0, 232, 121, 221, 102, 0, 0, 0, 0])};
        diff
    };

    let mut diffs = vec![];
    {
        let mut f = File::open("./data-12-proofs.json").unwrap();

        let mut raw = String::new();
        f.read_to_string(&mut raw).unwrap();

        #[derive(Deserialize)]
        struct TmpStateTrans {
            state_transition: String,
        }

        let r: Vec<TmpStateTrans> = serde_json::from_slice(raw.as_bytes()).unwrap();

        for r in r {
            let d = r.state_transition.as_bytes();
            let j: JsonStateTransition = serde_json::from_slice(d).unwrap();

            let sdiff = j.state_diff;

            let mut diff = BTreeMap::<Vec<u8>, Option<Vec<u8>>>::new();

            for (k, v) in sdiff {
                let k = hex::decode(&k).unwrap();
                let v = v.map(|v| hex::decode(&v).unwrap());
                diff.insert(k, v);
            }
            diffs.push(diff.clone());

            // let borshed = borsh::to_vec(&diff).unwrap();
            // let compressed = compress_blob(&borshed);
            // dbg!(
            //     "Borshed len {}, compressed {}",
            //     borshed.len(),
            //     compressed.len()
            // );
            break;
        }
    }

    let mut diffs2 = vec![];
    {
        let mut f = File::open("./csvjson.json").unwrap();

        let mut raw = String::new();
        f.read_to_string(&mut raw).unwrap();

        #[derive(Deserialize)]
        struct TmpStateTrans {
            state_transition: String,
        }

        let r: Vec<TmpStateTrans> = serde_json::from_slice(raw.as_bytes()).unwrap();

        for r in r.into_iter().rev() {
            let s = r.state_transition.replace('\\', "");
            let d = s.as_bytes();
            let j: JsonStateTransition = serde_json::from_slice(d).unwrap();

            let sdiff = j.state_diff;

            let mut diff = BTreeMap::<Vec<u8>, Option<Vec<u8>>>::new();

            for (k, v) in sdiff {
                let k = hex::decode(&k).unwrap();
                let v = v.map(|v| hex::decode(&v).unwrap());
                diff.insert(k, v);
            }
            diffs2.push(diff.clone());
            break;
        }
    }

    let idle_diff = {
        let mut f = File::open("./response.json").unwrap();

        let mut raw = String::new();
        f.read_to_string(&mut raw).unwrap();

        let r: JsonResponse = serde_json::from_slice(raw.as_bytes()).unwrap();
        let sdiff = r.result.proof.state_transition.state_diff;

        let mut diff = BTreeMap::<Vec<u8>, Option<Vec<u8>>>::new();

        for (k, v) in sdiff {
            let k = hex::decode(&k).unwrap();
            let v = v.map(|v| hex::decode(&v).unwrap());
            diff.insert(k, v);
        }
        diff
    };

    println!("\n Genesis + Transfers:");
    postprocess_diff(genesis_transfers_diff);

    // // // return;

    println!("\n Idle:");
    postprocess_diff(idle_diff);

    println!("\n Big storage:");
    for diff in diffs {
        postprocess_diff(diff);
    }

    // println!("\n Natural storage:");
    // for diff in diffs2 {
    //     postprocess_diff(diff);
    // }
}

fn postprocess_diff(diff: BTreeMap<Vec<u8>, Option<Vec<u8>>>) {
    let mut evm_acc_diff: BTreeMap<_, _> = Default::default();
    let mut system_diff: Vec<SystemEvent> = Default::default();
    let mut untyped_diff: Vec<Untyped> = Default::default();
    let mut set_last_block_hash = vec![];
    let mut remove_last_block_hash = vec![];
    let mut account_new_keys: BTreeMap<Address, BTreeMap<U256, usize>> = BTreeMap::new();
    let mut account_new_storage: BTreeMap<Address, BTreeMap<usize, (U256, U256)>> = BTreeMap::new();

    let mut keccak_storage_map = BTreeMap::new();
    for _i in 0..50 {
        let i = U256::from(_i);
        let hash: U256 = keccak256(i.to_be_bytes::<32>()).into();
        keccak_storage_map.insert(hash, V::A(_i));

        for _o in 1..10u8 {
            let o = U256::from(_o);
            keccak_storage_map.insert(hash + o, V::C(_i, _o));
        }

        for _j in 0..10u8 {
            let j = U256::from(_j);
            let mut v = vec![];
            v.extend(i.to_be_bytes::<32>());
            v.extend(j.to_be_bytes::<32>());
            let hash: U256 = keccak256(v).into();
            keccak_storage_map.insert(hash, V::B(_i, _j));
            for _o in 1..10u8 {
                let o = U256::from(_o);
                keccak_storage_map.insert(hash + o, V::D(_i, _j, _o));
            }
            for _o in 1..10u8 {
                let o = U256::from(_o);
                let mut v = vec![];
                v.extend(o.to_be_bytes::<32>());
                v.extend(hash.to_be_bytes::<32>());
                keccak_storage_map.insert(hash + o, V::E(_i, _j, _o));
            }
        }
    }
    for _i in 0..255 {
        let i = U256::from(_i);
        let hash: U256 = keccak256(i.to_be_bytes::<32>()).into();
        for _o in 100000..110000 {
            let o = U256::from(_o);
            keccak_storage_map.insert(hash + o, V::F(_i, _o));
        }
    }

    fn lookup_storage_preimage(s: &mut BTreeMap<U256, V>, idx: usize, key: U256) -> Option<V> {
        if let Some(preimage) = s.get(&key) {
            return Some(*preimage);
        }
        let idx: Result<u32, _> = idx.try_into();
        if let Ok(idx) = idx {
            let idx: u32 = idx;
            let i = U256::from(idx);
            for _j in 0..10u8 {
                let j = U256::from(_j);
                let mut v = vec![];
                v.extend(i.to_be_bytes::<32>());
                v.extend(j.to_be_bytes::<32>());
                let hash: U256 = keccak256(v).into();
                s.insert(hash, V::B(idx, _j));
            }
            return s.get(&key).copied();
        }

        None
    }

    // Heruistics for LightClient:: blockHashes[_blockNumber] = _blockHash;
    fn update_lightclient_preimage(s: &mut BTreeMap<U256, V>, idx: U256) {
        let idx: Result<u32, _> = idx.try_into();
        if let Ok(idx) = idx {
            for _i in idx.saturating_sub(1000)..idx {
                let i = U256::from(_i);
                let j = U256::from(1);
                let mut v = vec![];
                v.extend(i.to_be_bytes::<32>());
                v.extend(j.to_be_bytes::<32>());
                let hash: U256 = keccak256(v).into();
                s.insert(hash, V::B(_i, 1));
            }
        }
    }

    for (k, v) in &diff {
        match &k[..6] {
            _account @ b"Evm/a/" => {
                let address: Address = bcs::from_bytes(&k[6..]).unwrap();
                let info: Option<DbAccountInfo> = v.as_ref().map(|v| bcs::from_bytes(v).unwrap());

                let changes: &mut Vec<EvmAccountChanges> = evm_acc_diff.entry(address).or_default();
                if let Some(info) = info {
                    changes.push(EvmAccountChanges::SetAccountInfo(info));
                } else {
                    changes.push(EvmAccountChanges::RemoveAccountInfo);
                }
            }
            _keys @ b"Evm/k/" => {
                let address = Address::from_slice(&k[6..(6 + 20)]);
                match k[26] {
                    b'e' => {
                        let idx: usize = bcs::from_bytes(&k[27..]).unwrap();
                        let key: Option<U256> = v.as_ref().map(|v| bcs::from_bytes(v).unwrap());

                        let changes: &mut Vec<EvmAccountChanges> =
                            evm_acc_diff.entry(address).or_default();
                        if let Some(key) = key {
                            // Optimization for a case when there are a lot of account.storage.new(idx, key, value)
                            let new_keys = account_new_keys.entry(address).or_default();
                            new_keys.insert(key, idx);
                        } else {
                            dbg!("remove storage key");
                            changes.push(EvmAccountChanges::RemoveStorageKey(idx));
                        }
                    }
                    b'l' => {
                        let len: Option<usize> = v.as_ref().map(|v| bcs::from_bytes(v).unwrap());

                        let changes: &mut Vec<EvmAccountChanges> =
                            evm_acc_diff.entry(address).or_default();
                        if let Some(len) = len {
                            changes.push(EvmAccountChanges::SetKeyStorageLength(len));
                        } else {
                            changes.push(EvmAccountChanges::RemoveKeyStorageLength);
                        }
                    }
                    _ => {
                        unreachable!("StateVec is either e or l")
                    }
                }
            }
            _storage @ b"Evm/s/" => {
                let address = Address::from_slice(&k[6..(6 + 20)]);
                let key: U256 = bcs::from_bytes(&k[26..]).unwrap();
                let value: Option<U256> = v.as_ref().map(|v| bcs::from_bytes(v).unwrap());

                let changes: &mut Vec<EvmAccountChanges> = evm_acc_diff.entry(address).or_default();
                if let Some(value) = value {
                    let new_keys = account_new_keys.entry(address).or_default();
                    let new_storage = account_new_storage.entry(address).or_default();

                    if address == address!("3100000000000000000000000000000000000001")
                        && key.is_zero()
                    {
                        dbg!(value);
                        update_lightclient_preimage(&mut keccak_storage_map, value);
                    }

                    if let Some(idx) = new_keys.get(&key) {
                        // Optimization for a case when there are a lot of account.storage.new(idx, key, value)
                        new_storage.insert(*idx, (key, value));
                    } else {
                        if value.is_zero() {
                            changes.push(EvmAccountChanges::UpdateStorageZero(key));
                        } else {
                            changes.push(EvmAccountChanges::UpdateStorageValue(key, value));
                        }
                    }
                } else {
                    dbg!("remove storage value");
                    changes.push(EvmAccountChanges::RemoveStorageValue(key));
                }
            }
            _last_l1_hash @ b"Evm/l/" => {
                let v = v.clone().unwrap();
                let value: B256 = bcs::from_bytes(&v).unwrap();
                system_diff.push(SystemEvent::SetL1Hash(value));
            }
            _latest_block_hashes @ b"Evm/h/" => {
                let index: U256 = bcs::from_bytes(&k[6..]).unwrap();
                let value: Option<B256> = v.as_ref().map(|v| bcs::from_bytes(v).unwrap());

                if let Some(value) = value {
                    // Optimization for a case when there are a lot of new block hashes
                    set_last_block_hash.push((index, value));
                } else {
                    // Optimization for a case when there are a lot of removed block hashes
                    remove_last_block_hash.push(index);
                }
            }
            _head @ _ if k == b"Evm/head/" => {
                let value: Block = bcs::from_bytes(v.as_ref().unwrap()).unwrap();
                system_diff.push(SystemEvent::SetHead(value.clone()));
            }
            _scredata @ _ if k.starts_with(b"SoftConfirmationRuleEnforcer/data/") => {
                let value: Option<RuleEnforcerData> =
                    v.as_ref().map(|v| bcs::from_bytes(v).unwrap());

                system_diff.push(SystemEvent::SetScreData(value.clone().unwrap()));
            }
            _sovaccpk @ _ if k.starts_with(b"Accounts/public_keys/") => {
                let address = bcs::from_bytes(&k[21..]).unwrap();
                let public_key: Option<[u8; 32]> = v.as_ref().map(|v| bcs::from_bytes(v).unwrap());

                if let Some(public_key) = public_key {
                    system_diff.push(SystemEvent::SetSovAccountPublicKey(address, public_key));
                } else {
                    system_diff.push(SystemEvent::RemoveSovAccountPublicKey(address));
                }
            }
            _sovaccounts @ _ if k.starts_with(b"Accounts/accounts/") => {
                let public_key = bcs::from_bytes(&k[18..]).unwrap();
                let account: Option<SovAcc> = v.as_ref().map(|v| bcs::from_bytes(v).unwrap());

                if let Some(account) = account {
                    system_diff.push(SystemEvent::SetSovAccount(public_key, account));
                } else {
                    system_diff.push(SystemEvent::RemoveSovAccount(public_key));
                }
            }
            _ => {
                let key = hex::encode(k);
                let value = v.as_ref().map(|v| hex::encode(v));
                dbg!(key, value);
                untyped_diff.push(Untyped {
                    key: k.to_owned(),
                    value: v.to_owned(),
                });
            }
        }
    }

    // Optimization for a case when there are a lot of account.storage.new(idx, key, value)
    for (address, mut new_storage) in account_new_storage {
        if let Some(starting) = new_storage.first_entry() {
            let changes: &mut Vec<EvmAccountChanges> = evm_acc_diff.entry(address).or_default();
            changes.push(EvmAccountChanges::SetNewStartingStorageKey(*starting.key()));
            for (_idx, (key, value)) in new_storage {
                if value.is_zero() {
                    changes.push(EvmAccountChanges::NewStorageZero(key));
                } else {
                    if let Some(preimage) =
                        lookup_storage_preimage(&mut keccak_storage_map, _idx, key)
                    {
                        // println!("{}, {:?}, {}", address, preimage, _idx);
                        changes.push(EvmAccountChanges::NewPreimageValue(preimage, value));
                    } else {
                        changes.push(EvmAccountChanges::NewStorageValue(key, value));
                    }
                }
            }
        }
    }

    // Optimization for a case when there are a lot of new block hashes
    if !set_last_block_hash.is_empty() {
        set_last_block_hash.sort_by_key(|x| x.0);
        let starting_index = set_last_block_hash[0].0;
        let hashes: Vec<_> = set_last_block_hash.into_iter().map(|x| x.1).collect();
        system_diff.push(SystemEvent::SetLatestBlockHash(starting_index, hashes));
    }

    // Optimization for a case when there are a lot of removed block hashes
    if !remove_last_block_hash.is_empty() {
        remove_last_block_hash.sort();
        let start = remove_last_block_hash[0];
        let len = remove_last_block_hash.len();
        system_diff.push(SystemEvent::RemoveLatestBlockHashRange(start, len as u32));
    }

    // let x = borsh::to_vec(&system_diff).unwrap();
    // let s = hex::encode(&x);
    // println!("{s}");
    // dbg!(&system_diff);
    // dbg!(&evm_acc_diff);

    let typed_diff = TypedDiff {
        evm_accounts: evm_acc_diff,
        system_events: system_diff,
        rest: untyped_diff,
    };
    // println!("{:?}", &typed_diff);
    // let s = serde_json::to_string(&typed_diff).unwrap();
    // println!("{s}");
    // return;

    // for (k, v) in &diff {
    //     let k = hex::encode(k);
    //     let v = if let Some(v) = v {
    //         hex::encode(v)
    //     } else {
    //         "".into()
    //     };
    //     println!("{k} {v}");
    // }

    let borshed = borsh::to_vec(&diff).unwrap();

    fn compress_blob(blob: &[u8]) -> Vec<u8> {
        use brotli::CompressorWriter;
        use std::io::Write;
        let mut writer = CompressorWriter::new(Vec::new(), 4096, 11, 22);
        writer.write_all(blob).unwrap();
        writer.into_inner()
    }

    let compressed = compress_blob(&borshed);

    let len: usize = diff
        .into_iter()
        .map(|(k, v)| k.len() + v.unwrap_or_default().len())
        .sum();

    dbg!(len, compressed.len());

    let borshed_typed_aggr = borsh::to_vec(&typed_diff).unwrap();
    let compressed_typed_aggr = compress_blob(&borshed_typed_aggr);
    dbg!(borshed_typed_aggr.len(), compressed_typed_aggr.len());
}
kpp commented 1 month ago
 Genesis + Transfers:
[src/main.rs:765:5] len = 10509
[src/main.rs:765:5] compressed.len() = 3363
[src/main.rs:769:5] borshed_typed_aggr.len() = 8796
[src/main.rs:769:5] compressed_typed_aggr.len() = 3080

 Idle:
[src/main.rs:765:5] len = 62548
[src/main.rs:765:5] compressed.len() = 12422
[src/main.rs:769:5] borshed_typed_aggr.len() = 10412
[src/main.rs:769:5] compressed_typed_aggr.len() = 9635

 Big storage:
[src/main.rs:765:5] len = 290117
[src/main.rs:765:5] compressed.len() = 66458
[src/main.rs:769:5] borshed_typed_aggr.len() = 71822
[src/main.rs:769:5] compressed_typed_aggr.len() = 61159