initial commit
Georgios Konstantopoulos me@gakonst.com
Mon, 26 Jul 2021 12:45:07 +0300
46 files changed,
4299 insertions(+),
0 deletions(-)
jump to
A
.github/workflows/ci.yml
@@ -0,0 +1,54 @@
+on: [pull_request, push] + +name: Tests + +jobs: + tests: + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v2 + - name: Install stable toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + + - name: Install node + uses: actions/setup-node@v1 + with: + node-version: 10 + + - name: Install ganache + run: npm install -g ganache-cli + + - name: Install Solc + run: | + mkdir -p "$HOME/bin" + wget -q https://github.com/ethereum/solidity/releases/download/v0.7.6/solc-static-linux -O $HOME/bin/solc + chmod u+x "$HOME/bin/solc" + export PATH=$HOME/bin:$PATH + solc --version + + - name: cargo test + run: | + export PATH=$HOME/bin:$PATH + cargo test + + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v2 + - name: Install stable toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + components: rustfmt, clippy + - name: cargo fmt + run: cargo fmt --all -- --check + - name: cargo clippy + run: cargo clippy -- -D warnings
A
Cargo.toml
@@ -0,0 +1,39 @@
+[package] +name = "ark-circom" +version = "0.1.0" +edition = "2018" + +[dependencies] +# WASM operations +wasmer = "1.0.1" +fnv = "1.0.3" +num-traits = "0.2.0" +num-bigint = { version = "0.4", features = ["rand"] } + + +color-eyre = "0.5" + +# ZKP Generation +ark-ec = "0.3.0" +ark-ff = "0.3.0" +ark-std = "0.3.0" +ark-bn254 = "0.3.0" +ark-r1cs-std = "0.3.1" +ark-groth16 = { git = "https://github.com/kobigurk/groth16", version = "0.3.0", branch = "feat/customizable-r1cs-to-qap" } +ark-poly = { version = "^0.3.0", default-features = false } +ark-relations = "0.3.0" + +hex = "0.4.3" +byteorder = "1.4.3" + +ethers = { git = "https://github.com/gakonst/ethers-rs", features = ["abigen"] } +serde_json = "1.0.64" +serde = "1.0.126" +thiserror = "1.0.26" +memmap = "0.7.0" +ark-serialize = "0.3.0" + +[dev-dependencies] +hex-literal = "0.2.1" +tokio = { version = "1.7.1", features = ["macros"] } +
A
src/circom_qap.rs
@@ -0,0 +1,115 @@
+use ark_ff::PrimeField; +use ark_groth16::r1cs_to_qap::{evaluate_constraint, QAPCalculator, R1CStoQAP}; +use ark_poly::EvaluationDomain; +use ark_relations::r1cs::{ConstraintSystemRef, SynthesisError}; +use ark_std::{cfg_into_iter, cfg_iter, cfg_iter_mut, vec}; +use core::ops::Deref; + +/// Implements the witness map used by snarkjs. The arkworks witness map calculates the +/// coefficients of H through computing (AB-C)/Z in the evaluation domain and going back to the +/// coefficients domain. snarkjs instead precomputes the Lagrange form of the powers of tau bases +/// in a domain twice as large and the witness map is computed as the odd coefficients of (AB-C) +/// in that domain. This serves as HZ when computing the C proof element. +pub struct R1CStoQAPCircom; + +impl QAPCalculator for R1CStoQAPCircom { + #[allow(clippy::type_complexity)] + fn instance_map_with_evaluation<F: PrimeField, D: EvaluationDomain<F>>( + cs: ConstraintSystemRef<F>, + t: &F, + ) -> Result<(Vec<F>, Vec<F>, Vec<F>, F, usize, usize), SynthesisError> { + R1CStoQAP::instance_map_with_evaluation::<F, D>(cs, t) + } + + fn witness_map<F: PrimeField, D: EvaluationDomain<F>>( + prover: ConstraintSystemRef<F>, + ) -> Result<Vec<F>, SynthesisError> { + let matrices = prover.to_matrices().unwrap(); + let zero = F::zero(); + let num_inputs = prover.num_instance_variables(); + let num_constraints = prover.num_constraints(); + let cs = prover.borrow().unwrap(); + let prover = cs.deref(); + + let full_assignment = [ + prover.instance_assignment.as_slice(), + prover.witness_assignment.as_slice(), + ] + .concat(); + + let domain = + D::new(num_constraints + num_inputs).ok_or(SynthesisError::PolynomialDegreeTooLarge)?; + let domain_size = domain.size(); + + let mut a = vec![zero; domain_size]; + let mut b = vec![zero; domain_size]; + + cfg_iter_mut!(a[..num_constraints]) + .zip(cfg_iter_mut!(b[..num_constraints])) + .zip(cfg_iter!(&matrices.a)) + .zip(cfg_iter!(&matrices.b)) + .for_each(|(((a, b), at_i), bt_i)| { + *a = evaluate_constraint(&at_i, &full_assignment); + *b = evaluate_constraint(&bt_i, &full_assignment); + }); + + { + let start = num_constraints; + let end = start + num_inputs; + a[start..end].clone_from_slice(&full_assignment[..num_inputs]); + } + + domain.ifft_in_place(&mut a); + domain.ifft_in_place(&mut b); + + let root_of_unity = { + let domain_size_double = 2 * domain_size; + let domain_double = + D::new(domain_size_double).ok_or(SynthesisError::PolynomialDegreeTooLarge)?; + domain_double.element(1) + }; + D::distribute_powers_and_mul_by_const(&mut a, root_of_unity, F::one()); + D::distribute_powers_and_mul_by_const(&mut b, root_of_unity, F::one()); + + domain.fft_in_place(&mut a); + domain.fft_in_place(&mut b); + + let mut ab = domain.mul_polynomials_in_evaluation_domain(&a, &b); + drop(a); + drop(b); + + let mut c = vec![zero; domain_size]; + cfg_iter_mut!(c[..prover.num_constraints]) + .enumerate() + .for_each(|(i, c)| { + *c = evaluate_constraint(&matrices.c[i], &full_assignment); + }); + + domain.ifft_in_place(&mut c); + D::distribute_powers_and_mul_by_const(&mut c, root_of_unity, F::one()); + domain.fft_in_place(&mut c); + + cfg_iter_mut!(ab) + .zip(c) + .for_each(|(ab_i, c_i)| *ab_i -= &c_i); + + Ok(ab) + } + + fn h_query_scalars<F: PrimeField, D: EvaluationDomain<F>>( + max_power: usize, + t: F, + _: F, + delta_inverse: F, + ) -> Result<Vec<F>, SynthesisError> { + // the usual H query has domain-1 powers. Z has domain powers. So HZ has 2*domain-1 powers. + let mut scalars = cfg_into_iter!(0..2 * max_power + 1) + .map(|i| delta_inverse * t.pow([i as u64])) + .collect::<Vec<_>>(); + let domain_size = scalars.len(); + let domain = D::new(domain_size).ok_or(SynthesisError::PolynomialDegreeTooLarge)?; + // generate the lagrange coefficients + domain.ifft_in_place(&mut scalars); + Ok(cfg_into_iter!(scalars).skip(1).step_by(2).collect()) + } +}
A
src/circom_wasm/circom.rs
@@ -0,0 +1,79 @@
+use color_eyre::Result; +use wasmer::{Function, Instance, Value}; + +#[derive(Clone, Debug)] +pub struct CircomInstance(Instance); + +// binds to the circom functions +impl CircomInstance { + pub fn new(instance: Instance) -> Self { + CircomInstance(instance) + } + + pub fn init(&self, sanity_check: bool) -> Result<()> { + let func = self.func("init"); + func.call(&[Value::I32(sanity_check as i32)])?; + Ok(()) + } + + pub fn get_fr_len(&self) -> Result<i32> { + self.get_i32("getFrLen") + } + + pub fn get_ptr_raw_prime(&self) -> Result<i32> { + self.get_i32("getPRawPrime") + } + + pub fn get_n_vars(&self) -> Result<i32> { + self.get_i32("getNVars") + } + + pub fn get_ptr_witness_buffer(&self) -> Result<i32> { + self.get_i32("getWitnessBuffer") + } + + pub fn get_ptr_witness(&self, w: i32) -> Result<i32> { + let func = self.func("getPWitness"); + let res = func.call(&[w.into()])?; + + Ok(res[0].unwrap_i32()) + } + + pub fn get_signal_offset32( + &self, + p_sig_offset: u32, + component: u32, + hash_msb: u32, + hash_lsb: u32, + ) -> Result<()> { + let func = self.func("getSignalOffset32"); + func.call(&[ + p_sig_offset.into(), + component.into(), + hash_msb.into(), + hash_lsb.into(), + ])?; + + Ok(()) + } + + pub fn set_signal(&self, c_idx: i32, component: i32, signal: i32, p_val: i32) -> Result<()> { + let func = self.func("setSignal"); + func.call(&[c_idx.into(), component.into(), signal.into(), p_val.into()])?; + + Ok(()) + } + + fn get_i32(&self, name: &str) -> Result<i32> { + let func = self.func(name); + let result = func.call(&[])?; + Ok(result[0].unwrap_i32()) + } + + fn func(&self, name: &str) -> &Function { + self.0 + .exports + .get_function(name) + .unwrap_or_else(|_| panic!("function {} not found", name)) + } +}
A
src/circom_wasm/memory.rs
@@ -0,0 +1,271 @@
+//! Safe-ish interface for reading and writing specific types to the WASM runtime's memory +use num_traits::ToPrimitive; +use wasmer::{Memory, MemoryView}; + +// TODO: Decide whether we want Ark here or if it should use a generic BigInt package +use ark_bn254::FrParameters; +use ark_ff::{BigInteger, BigInteger256, FpParameters, FromBytes, Zero}; + +use num_bigint::{BigInt, BigUint}; + +use color_eyre::Result; +use std::str::FromStr; +use std::{convert::TryFrom, ops::Deref}; + +#[derive(Clone, Debug)] +pub struct SafeMemory { + pub memory: Memory, + pub prime: BigInt, + + short_max: BigInt, + short_min: BigInt, + r_inv: BigInt, + n32: usize, +} + +impl Deref for SafeMemory { + type Target = Memory; + + fn deref(&self) -> &Self::Target { + &self.memory + } +} + +impl SafeMemory { + /// Creates a new SafeMemory + pub fn new(memory: Memory, n32: usize, prime: BigInt) -> Self { + // TODO: Figure out a better way to calculate these + let short_max = BigInt::from(0x8000_0000u64); + let short_min = BigInt::from_biguint( + num_bigint::Sign::NoSign, + BigUint::try_from(FrParameters::MODULUS).unwrap(), + ) - &short_max; + let r_inv = BigInt::from_str( + "9915499612839321149637521777990102151350674507940716049588462388200839649614", + ) + .unwrap(); + + Self { + memory, + prime, + + short_max, + short_min, + r_inv, + n32, + } + } + + /// Gets an immutable view to the memory in 32 byte chunks + pub fn view(&self) -> MemoryView<u32> { + self.memory.view() + } + + /// Returns the next free position in the memory + pub fn free_pos(&self) -> u32 { + self.view()[0].get() + } + + /// Sets the next free position in the memory + pub fn set_free_pos(&mut self, ptr: u32) { + self.write_u32(0, ptr); + } + + /// Allocates a U32 in memory + pub fn alloc_u32(&mut self) -> u32 { + let p = self.free_pos(); + self.set_free_pos(p + 8); + p + } + + /// Writes a u32 to the specified memory offset + pub fn write_u32(&mut self, ptr: usize, num: u32) { + let buf = unsafe { self.memory.data_unchecked_mut() }; + buf[ptr..ptr + std::mem::size_of::<u32>()].copy_from_slice(&num.to_le_bytes()); + } + + /// Reads a u32 from the specified memory offset + pub fn read_u32(&self, ptr: usize) -> u32 { + let buf = unsafe { self.memory.data_unchecked() }; + + let mut bytes = [0; 4]; + bytes.copy_from_slice(&buf[ptr..ptr + std::mem::size_of::<u32>()]); + + u32::from_le_bytes(bytes) + } + + /// Allocates `self.n32 * 4 + 8` bytes in the memory + pub fn alloc_fr(&mut self) -> u32 { + let p = self.free_pos(); + self.set_free_pos(p + self.n32 as u32 * 4 + 8); + p + } + + /// Writes a Field Element to memory at the specified offset, truncating + /// to smaller u32 types if needed and adjusting the sign via 2s complement + pub fn write_fr(&mut self, ptr: usize, fr: &BigInt) -> Result<()> { + if fr < &self.short_max && fr > &self.short_min { + if fr >= &BigInt::zero() { + self.write_short_positive(ptr, fr)?; + } else { + self.write_short_negative(ptr, fr)?; + } + } else { + self.write_long_normal(ptr, fr)?; + } + + Ok(()) + } + + /// Reads a Field Element from the memory at the specified offset + pub fn read_fr(&self, ptr: usize) -> Result<BigInt> { + let view = self.memory.view::<u8>(); + + let res = if view[ptr + 4 + 3].get() & 0x80 != 0 { + let mut num = self.read_big(ptr + 8, self.n32)?; + if view[ptr + 4 + 3].get() & 0x40 != 0 { + num = (num * &self.r_inv) % &self.prime + } + num + } else if view[ptr + 3].get() & 0x40 != 0 { + let mut num = self.read_u32(ptr).into(); + // handle small negative + num -= BigInt::from(0x100000000i64); + num + } else { + self.read_u32(ptr).into() + }; + + Ok(res) + } + + fn write_short_positive(&mut self, ptr: usize, fr: &BigInt) -> Result<()> { + let num = fr.to_i32().expect("not a short positive"); + self.write_u32(ptr, num as u32); + self.write_u32(ptr + 4, 0); + Ok(()) + } + + fn write_short_negative(&mut self, ptr: usize, fr: &BigInt) -> Result<()> { + // 2s complement + let num = fr - &self.short_min; + let num = num - &self.short_max; + let num = num + BigInt::from(0x0001_0000_0000i64); + + let num = num + .to_u32() + .expect("could not cast as u32 (should never happen)"); + + self.write_u32(ptr, num); + self.write_u32(ptr + 4, 0); + Ok(()) + } + + fn write_long_normal(&mut self, ptr: usize, fr: &BigInt) -> Result<()> { + self.write_u32(ptr, 0); + self.write_u32(ptr + 4, i32::MIN as u32); // 0x80000000 + self.write_big(ptr + 8, fr)?; + Ok(()) + } + + fn write_big(&self, ptr: usize, num: &BigInt) -> Result<()> { + let buf = unsafe { self.memory.data_unchecked_mut() }; + + // TODO: How do we handle negative bignums? + let (_, num) = num.clone().into_parts(); + let num = BigInteger256::try_from(num).unwrap(); + + let bytes = num.to_bytes_le(); + let len = bytes.len(); + buf[ptr..ptr + len].copy_from_slice(&bytes); + + Ok(()) + } + + /// Reads `num_bytes * 32` from the specified memory offset in a Big Integer + pub fn read_big(&self, ptr: usize, num_bytes: usize) -> Result<BigInt> { + let buf = unsafe { self.memory.data_unchecked() }; + let buf = &buf[ptr..ptr + num_bytes * 32]; + + // TODO: Is there a better way to read big integers? + let big = BigInteger256::read(buf).unwrap(); + let big = BigUint::try_from(big).unwrap(); + Ok(big.into()) + } +} + +// TODO: Figure out how to read / write numbers > u32 +// circom-witness-calculator: Wasm + Memory -> expose BigInts so that they can be consumed by any proof system +// ark-circom: +// 1. can read zkey +// 2. can generate witness from inputs +// 3. can generate proofs +// 4. can serialize proofs in the desired format +#[cfg(test)] +mod tests { + use super::*; + use num_traits::ToPrimitive; + use std::str::FromStr; + use wasmer::{MemoryType, Store}; + + fn new() -> SafeMemory { + SafeMemory::new( + Memory::new(&Store::default(), MemoryType::new(1, None, false)).unwrap(), + 2, + BigInt::from_str( + "21888242871839275222246405745257275088548364400416034343698204186575808495617", + ) + .unwrap(), + ) + } + + #[test] + fn i32_bounds() { + let mem = new(); + let i32_max = i32::MAX as i64 + 1; + assert_eq!(mem.short_min.to_i64().unwrap(), -i32_max); + assert_eq!(mem.short_max.to_i64().unwrap(), i32_max); + } + + #[test] + fn read_write_32() { + let mut mem = new(); + let num = u32::MAX; + + let inp = mem.read_u32(0); + assert_eq!(inp, 0); + + mem.write_u32(0, num); + let inp = mem.read_u32(0); + assert_eq!(inp, num); + } + + #[test] + fn read_write_fr_small_positive() { + read_write_fr(BigInt::from(1_000_000)); + } + + #[test] + fn read_write_fr_small_negative() { + read_write_fr(BigInt::from(-1_000_000)); + } + + #[test] + fn read_write_fr_big_positive() { + read_write_fr(BigInt::from(500000000000i64)); + } + + // TODO: How should this be handled? + #[test] + #[ignore] + fn read_write_fr_big_negative() { + read_write_fr(BigInt::from_str("-500000000000").unwrap()) + } + + fn read_write_fr(num: BigInt) { + let mut mem = new(); + mem.write_fr(0, &num).unwrap(); + let res = mem.read_fr(0).unwrap(); + assert_eq!(res, num); + } +}
A
src/circom_wasm/mod.rs
@@ -0,0 +1,21 @@
+mod wasm; +pub use wasm::WitnessCalculator; + +mod memory; +pub use memory::SafeMemory; + +mod circom; +pub use circom::CircomInstance; + +use fnv::FnvHasher; +use std::hash::Hasher; + +pub use num_bigint::BigInt; + +pub(crate) fn fnv(inp: &str) -> (u32, u32) { + let mut hasher = FnvHasher::default(); + hasher.write(inp.as_bytes()); + let h = hasher.finish(); + + ((h >> 32) as u32, h as u32) +}
A
src/circom_wasm/wasm.rs
@@ -0,0 +1,274 @@
+use color_eyre::Result; +use num_bigint::BigInt; +use num_traits::Zero; +use std::cell::Cell; +use wasmer::{imports, Function, Instance, Memory, MemoryType, Module, Store}; + +use super::{fnv, CircomInstance, SafeMemory}; + +#[derive(Clone, Debug)] +pub struct WitnessCalculator { + pub instance: CircomInstance, + pub memory: SafeMemory, + pub n64: i32, +} + +impl WitnessCalculator { + pub fn new(path: impl AsRef<std::path::Path>) -> Result<Self> { + let store = Store::default(); + let module = Module::from_file(&store, path)?; + + // Set up the memory + let memory = Memory::new(&store, MemoryType::new(2000, None, false)).unwrap(); + let import_object = imports! { + "env" => { + "memory" => memory.clone(), + }, + // Host function callbacks from the WASM + "runtime" => { + "error" => runtime::error(&store), + "logSetSignal" => runtime::log_signal(&store), + "logGetSignal" => runtime::log_signal(&store), + "logFinishComponent" => runtime::log_component(&store), + "logStartComponent" => runtime::log_component(&store), + "log" => runtime::log_component(&store), + } + }; + let instance = CircomInstance::new(Instance::new(&module, &import_object)?); + + let n32 = (instance.get_fr_len()? >> 2) - 2; + + let mut memory = SafeMemory::new(memory, n32 as usize, BigInt::zero()); + + let ptr = instance.get_ptr_raw_prime()?; + let prime = memory.read_big(ptr as usize, n32 as usize)?; + let n64 = ((prime.bits() - 1) / 64 + 1) as i32; + memory.prime = prime; + + Ok(WitnessCalculator { + instance, + memory, + n64, + }) + } + + pub fn calculate_witness<I: IntoIterator<Item = (String, Vec<BigInt>)>>( + &mut self, + inputs: I, + sanity_check: bool, + ) -> Result<Vec<BigInt>> { + let old_mem_free_pos = self.memory.free_pos(); + + self.instance.init(sanity_check)?; + + let p_sig_offset = self.memory.alloc_u32(); + let p_fr = self.memory.alloc_fr(); + + // allocate the inputs + for (name, values) in inputs.into_iter() { + let (msb, lsb) = fnv(&name); + self.instance + .get_signal_offset32(p_sig_offset, 0, msb, lsb)?; + + let sig_offset = self.memory.read_u32(p_sig_offset as usize) as usize; + + for (i, value) in values.into_iter().enumerate() { + self.memory.write_fr(p_fr as usize, &value)?; + self.instance + .set_signal(0, 0, (sig_offset + i) as i32, p_fr as i32)?; + } + } + + let mut w = Vec::new(); + let n_vars = self.instance.get_n_vars()?; + for i in 0..n_vars { + let ptr = self.instance.get_ptr_witness(i)? as usize; + let el = self.memory.read_fr(ptr)?; + w.push(el); + } + + self.memory.set_free_pos(old_mem_free_pos); + + Ok(w) + } + + pub fn get_witness_buffer(&self) -> Result<Vec<u8>> { + let ptr = self.instance.get_ptr_witness_buffer()? as usize; + + let view = self.memory.memory.view::<u8>(); + + let len = self.instance.get_n_vars()? * self.n64 * 8; + let arr = view[ptr..ptr + len as usize] + .iter() + .map(Cell::get) + .collect::<Vec<_>>(); + + Ok(arr) + } +} + +// callback hooks for debugging +mod runtime { + use super::*; + + pub fn error(store: &Store) -> Function { + #[allow(unused)] + #[allow(clippy::many_single_char_names)] + fn func(a: i32, b: i32, c: i32, d: i32, e: i32, f: i32) {} + Function::new_native(&store, func) + } + + pub fn log_signal(store: &Store) -> Function { + #[allow(unused)] + fn func(a: i32, b: i32) {} + Function::new_native(&store, func) + } + + pub fn log_component(store: &Store) -> Function { + #[allow(unused)] + fn func(a: i32) {} + Function::new_native(&store, func) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::{collections::HashMap, path::PathBuf}; + + struct TestCase<'a> { + circuit_path: &'a str, + inputs_path: &'a str, + n_vars: u32, + n64: u32, + witness: &'a [&'a str], + } + + pub fn root_path(p: &str) -> String { + let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + path.push(p); + path.to_string_lossy().to_string() + } + + #[test] + fn multiplier_1() { + run_test(TestCase { + circuit_path: root_path("test-vectors/mycircuit.wasm").as_str(), + inputs_path: root_path("test-vectors/mycircuit-input1.json").as_str(), + n_vars: 4, + n64: 4, + witness: &["1", "33", "3", "11"], + }); + } + + #[test] + fn multiplier_2() { + run_test(TestCase { + circuit_path: root_path("test-vectors/mycircuit.wasm").as_str(), + inputs_path: root_path("test-vectors/mycircuit-input2.json").as_str(), + n_vars: 4, + n64: 4, + witness: &[ + "1", + "21888242871839275222246405745257275088548364400416034343698204186575672693159", + "21888242871839275222246405745257275088548364400416034343698204186575796149939", + "11", + ], + }); + } + + #[test] + fn multiplier_3() { + run_test(TestCase { + circuit_path: root_path("test-vectors/mycircuit.wasm").as_str(), + inputs_path: root_path("test-vectors/mycircuit-input3.json").as_str(), + n_vars: 4, + n64: 4, + witness: &[ + "1", + "21888242871839275222246405745257275088548364400416034343698204186575808493616", + "10944121435919637611123202872628637544274182200208017171849102093287904246808", + "2", + ], + }); + } + + #[test] + fn safe_multipler() { + let witness = + std::fs::read_to_string(&root_path("test-vectors/safe-circuit-witness.json")).unwrap(); + let witness: Vec<String> = serde_json::from_str(&witness).unwrap(); + let witness = &witness.iter().map(|x| x.as_ref()).collect::<Vec<_>>(); + run_test(TestCase { + circuit_path: root_path("test-vectors/circuit2.wasm").as_str(), + inputs_path: root_path("test-vectors/mycircuit-input1.json").as_str(), + n_vars: 132, // 128 + 4 + n64: 4, + witness, + }); + } + + #[test] + fn smt_verifier() { + let witness = + std::fs::read_to_string(&root_path("test-vectors/smtverifier10-witness.json")).unwrap(); + let witness: Vec<String> = serde_json::from_str(&witness).unwrap(); + let witness = &witness.iter().map(|x| x.as_ref()).collect::<Vec<_>>(); + + run_test(TestCase { + circuit_path: root_path("test-vectors/smtverifier10.wasm").as_str(), + inputs_path: root_path("test-vectors/smtverifier10-input.json").as_str(), + n_vars: 4794, + n64: 4, + witness, + }); + } + + use serde_json::Value; + use std::str::FromStr; + + fn value_to_bigint(v: Value) -> BigInt { + match v { + Value::String(inner) => BigInt::from_str(&inner).unwrap(), + Value::Number(inner) => BigInt::from(inner.as_u64().expect("not a u32")), + _ => panic!("unsupported type"), + } + } + + fn run_test(case: TestCase) { + let mut wtns = WitnessCalculator::new(case.circuit_path).unwrap(); + assert_eq!( + wtns.memory.prime.to_str_radix(16), + "30644E72E131A029B85045B68181585D2833E84879B9709143E1F593F0000001".to_lowercase() + ); + assert_eq!(wtns.instance.get_n_vars().unwrap() as u32, case.n_vars); + assert_eq!(wtns.n64 as u32, case.n64); + + let inputs_str = std::fs::read_to_string(case.inputs_path).unwrap(); + let inputs: std::collections::HashMap<String, serde_json::Value> = + serde_json::from_str(&inputs_str).unwrap(); + + let inputs = inputs + .iter() + .map(|(key, value)| { + let res = match value { + Value::String(inner) => { + vec![BigInt::from_str(inner).unwrap()] + } + Value::Number(inner) => { + vec![BigInt::from(inner.as_u64().expect("not a u32"))] + } + Value::Array(inner) => inner.iter().cloned().map(value_to_bigint).collect(), + _ => panic!(), + }; + + (key.clone(), res) + }) + .collect::<HashMap<_, _>>(); + + let res = wtns.calculate_witness(inputs, false).unwrap(); + for (r, w) in res.iter().zip(case.witness) { + assert_eq!(r, &BigInt::from_str(w).unwrap()); + } + } +}
A
src/circuit/builder.rs
@@ -0,0 +1,95 @@
+use ark_ec::PairingEngine; +use std::{fs::File, path::Path}; + +use super::{CircomCircuit, R1CS}; + +use num_bigint::BigInt; +use std::collections::HashMap; + +use crate::{circuit::R1CSFile, WitnessCalculator}; +use color_eyre::Result; + +pub struct CircomBuilder<E: PairingEngine> { + pub cfg: CircuitConfig<E>, + pub inputs: HashMap<String, Vec<BigInt>>, +} + +// Add utils for creating this from files / directly from bytes +pub struct CircuitConfig<E: PairingEngine> { + pub r1cs: R1CS<E>, + pub wtns: WitnessCalculator, + pub sanity_check: bool, +} + +impl<E: PairingEngine> CircuitConfig<E> { + pub fn new(wtns: impl AsRef<Path>, r1cs: impl AsRef<Path>) -> Result<Self> { + let wtns = WitnessCalculator::new(wtns).unwrap(); + let reader = File::open(r1cs)?; + let r1cs = R1CSFile::new(reader)?.into(); + Ok(Self { + wtns, + r1cs, + sanity_check: false, + }) + } +} + +impl<E: PairingEngine> CircomBuilder<E> { + /// Instantiates a new builder using the provided WitnessGenerator and R1CS files + /// for your circuit + pub fn new(cfg: CircuitConfig<E>) -> Self { + Self { + cfg, + inputs: HashMap::new(), + } + } + + /// Pushes a Circom input at the specified name. + pub fn push_input<T: Into<BigInt>>(&mut self, name: impl ToString, val: T) { + let values = self.inputs.entry(name.to_string()).or_insert_with(Vec::new); + values.push(val.into()); + } + + /// Generates an empty circom circuit with no witness set, to be used for + /// generation of the trusted setup parameters + pub fn setup(&self) -> CircomCircuit<E> { + let mut circom = CircomCircuit { + r1cs: self.cfg.r1cs.clone(), + witness: None, + }; + + // Disable the wire mapping + circom.r1cs.wire_mapping = None; + + circom + } + + /// Creates the circuit populated with the witness corresponding to the previously + /// provided inputs + pub fn build(mut self) -> Result<CircomCircuit<E>> { + let mut circom = self.setup(); + + // calculate the witness + let witness = self + .cfg + .wtns + .calculate_witness(self.inputs, self.cfg.sanity_check)?; + + // convert it to field elements + let witness = witness + .into_iter() + .map(|w| E::Fr::from(w.to_biguint().unwrap())) + .collect::<Vec<_>>(); + circom.witness = Some(witness); + + // sanity check + debug_assert!({ + use ark_relations::r1cs::{ConstraintSynthesizer, ConstraintSystem}; + let cs = ConstraintSystem::<E::Fr>::new_ref(); + circom.clone().generate_constraints(cs.clone()).unwrap(); + cs.is_satisfied().unwrap() + }); + + Ok(circom) + } +}
A
src/circuit/circom.rs
@@ -0,0 +1,107 @@
+use ark_ec::PairingEngine; +use ark_relations::r1cs::{ + ConstraintSynthesizer, ConstraintSystemRef, LinearCombination, SynthesisError, Variable, +}; + +use crate::circuit::R1CS; + +use color_eyre::Result; + +#[derive(Clone, Debug)] +pub struct CircomCircuit<E: PairingEngine> { + pub r1cs: R1CS<E>, + pub witness: Option<Vec<E::Fr>>, +} + +impl<'a, E: PairingEngine> CircomCircuit<E> { + pub fn get_public_inputs(&self) -> Option<Vec<E::Fr>> { + match &self.witness { + None => None, + Some(w) => match &self.r1cs.wire_mapping { + None => Some(w[1..self.r1cs.num_inputs].to_vec()), + Some(m) => Some(m[1..self.r1cs.num_inputs].iter().map(|i| w[*i]).collect()), + }, + } + } +} + +impl<E: PairingEngine> ConstraintSynthesizer<E::Fr> for CircomCircuit<E> { + fn generate_constraints(self, cs: ConstraintSystemRef<E::Fr>) -> Result<(), SynthesisError> { + let witness = &self.witness; + let wire_mapping = &self.r1cs.wire_mapping; + + // Start from 1 because Arkworks implicitly allocates One for the first input + for i in 1..self.r1cs.num_inputs { + cs.new_input_variable(|| { + Ok(match witness { + None => E::Fr::from(1u32), + Some(w) => match wire_mapping { + Some(m) => w[m[i]], + None => w[i], + }, + }) + })?; + } + + for i in 0..self.r1cs.num_aux { + cs.new_witness_variable(|| { + Ok(match witness { + None => E::Fr::from(1u32), + Some(w) => match wire_mapping { + Some(m) => w[m[i + self.r1cs.num_inputs]], + None => w[i + self.r1cs.num_inputs], + }, + }) + })?; + } + + let make_index = |index| { + if index < self.r1cs.num_inputs { + Variable::Instance(index) + } else { + Variable::Witness(index - self.r1cs.num_inputs) + } + }; + let make_lc = |lc_data: &[(usize, E::Fr)]| { + lc_data.iter().fold( + LinearCombination::<E::Fr>::zero(), + |lc: LinearCombination<E::Fr>, (index, coeff)| lc + (*coeff, make_index(*index)), + ) + }; + + for constraint in &self.r1cs.constraints { + cs.enforce_constraint( + make_lc(&constraint.0), + make_lc(&constraint.1), + make_lc(&constraint.2), + )?; + } + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{CircomBuilder, CircuitConfig}; + use ark_bn254::{Bn254, Fr}; + use ark_relations::r1cs::ConstraintSystem; + + #[test] + fn satisfied() { + let cfg = CircuitConfig::<Bn254>::new( + "./test-vectors/mycircuit.wasm", + "./test-vectors/mycircuit.r1cs", + ) + .unwrap(); + let mut builder = CircomBuilder::new(cfg); + builder.push_input("a", 3); + builder.push_input("b", 11); + + let circom = builder.build().unwrap(); + let cs = ConstraintSystem::<Fr>::new_ref(); + circom.generate_constraints(cs.clone()).unwrap(); + assert!(cs.is_satisfied().unwrap()); + } +}
A
src/circuit/mod.rs
@@ -0,0 +1,13 @@
+use ark_ec::PairingEngine; + +pub mod r1cs_reader; +pub use r1cs_reader::{R1CSFile, R1CS}; + +mod circom; +pub use circom::CircomCircuit; + +mod builder; +pub use builder::{CircomBuilder, CircuitConfig}; + +pub type Constraints<E> = (ConstraintVec<E>, ConstraintVec<E>, ConstraintVec<E>); +pub type ConstraintVec<E> = Vec<(usize, <E as PairingEngine>::Fr)>;
A
src/circuit/r1cs_reader.rs
@@ -0,0 +1,270 @@
+//! R1CS circom file reader +//! Copied from https://github.com/poma/zkutil +use byteorder::{LittleEndian, ReadBytesExt}; +use std::io::{Error, ErrorKind, Result}; + +use ark_ec::PairingEngine; +use ark_ff::FromBytes; +use ark_std::io::Read; + +use crate::circuit::{ConstraintVec, Constraints}; + +#[derive(Clone, Debug)] +pub struct R1CS<E: PairingEngine> { + pub num_inputs: usize, + pub num_aux: usize, + pub num_variables: usize, + pub constraints: Vec<Constraints<E>>, + pub wire_mapping: Option<Vec<usize>>, +} + +impl<E: PairingEngine> From<R1CSFile<E>> for R1CS<E> { + fn from(file: R1CSFile<E>) -> Self { + let num_inputs = (1 + file.header.n_pub_in + file.header.n_pub_out) as usize; + let num_variables = file.header.n_wires as usize; + let num_aux = num_variables - num_inputs; + R1CS { + num_aux, + num_inputs, + num_variables, + constraints: file.constraints, + wire_mapping: Some(file.wire_mapping.iter().map(|e| *e as usize).collect()), + } + } +} + +pub struct R1CSFile<E: PairingEngine> { + pub version: u32, + pub header: Header, + pub constraints: Vec<Constraints<E>>, + pub wire_mapping: Vec<u64>, +} + +impl<E: PairingEngine> R1CSFile<E> { + pub fn new<R: Read>(mut reader: R) -> Result<R1CSFile<E>> { + let mut magic = [0u8; 4]; + reader.read_exact(&mut magic)?; + if magic != [0x72, 0x31, 0x63, 0x73] { + // magic = "r1cs" + return Err(Error::new(ErrorKind::InvalidData, "Invalid magic number")); + } + + let version = reader.read_u32::<LittleEndian>()?; + if version != 1 { + return Err(Error::new(ErrorKind::InvalidData, "Unsupported version")); + } + + let _num_sections = reader.read_u32::<LittleEndian>()?; + + // todo: rewrite this to support different section order and unknown sections + // todo: handle sec_size correctly + let _sec_type = reader.read_u32::<LittleEndian>()?; + let sec_size = reader.read_u64::<LittleEndian>()?; + + let header = Header::new(&mut reader, sec_size)?; + let _sec_type = reader.read_u32::<LittleEndian>()?; + let _sec_size = reader.read_u64::<LittleEndian>()?; + let constraints = read_constraints::<&mut R, E>(&mut reader, &header)?; + + let _sec_type = reader.read_u32::<LittleEndian>()?; + let sec_size = reader.read_u64::<LittleEndian>()?; + let wire_mapping = read_map(&mut reader, sec_size, &header)?; + + Ok(R1CSFile { + version, + header, + constraints, + wire_mapping, + }) + } +} + +pub struct Header { + pub field_size: u32, + pub prime_size: Vec<u8>, + pub n_wires: u32, + pub n_pub_out: u32, + pub n_pub_in: u32, + pub n_prv_in: u32, + pub n_labels: u64, + pub n_constraints: u32, +} + +impl Header { + fn new<R: Read>(mut reader: R, size: u64) -> Result<Header> { + let field_size = reader.read_u32::<LittleEndian>()?; + if field_size != 32 { + return Err(Error::new( + ErrorKind::InvalidData, + "This parser only supports 32-byte fields", + )); + } + + if size != 32 + field_size as u64 { + return Err(Error::new( + ErrorKind::InvalidData, + "Invalid header section size", + )); + } + + let mut prime_size = vec![0u8; field_size as usize]; + reader.read_exact(&mut prime_size)?; + + if prime_size + != hex::decode("010000f093f5e1439170b97948e833285d588181b64550b829a031e1724e6430") + .unwrap() + { + return Err(Error::new( + ErrorKind::InvalidData, + "This parser only supports bn256", + )); + } + + Ok(Header { + field_size, + prime_size, + n_wires: reader.read_u32::<LittleEndian>()?, + n_pub_out: reader.read_u32::<LittleEndian>()?, + n_pub_in: reader.read_u32::<LittleEndian>()?, + n_prv_in: reader.read_u32::<LittleEndian>()?, + n_labels: reader.read_u64::<LittleEndian>()?, + n_constraints: reader.read_u32::<LittleEndian>()?, + }) + } +} + +fn read_constraint_vec<R: Read, E: PairingEngine>(mut reader: R) -> Result<ConstraintVec<E>> { + let n_vec = reader.read_u32::<LittleEndian>()? as usize; + let mut vec = Vec::with_capacity(n_vec); + for _ in 0..n_vec { + vec.push(( + reader.read_u32::<LittleEndian>()? as usize, + E::Fr::read(&mut reader)?, + )); + } + Ok(vec) +} + +fn read_constraints<R: Read, E: PairingEngine>( + mut reader: R, + header: &Header, +) -> Result<Vec<Constraints<E>>> { + // todo check section size + let mut vec = Vec::with_capacity(header.n_constraints as usize); + for _ in 0..header.n_constraints { + vec.push(( + read_constraint_vec::<&mut R, E>(&mut reader)?, + read_constraint_vec::<&mut R, E>(&mut reader)?, + read_constraint_vec::<&mut R, E>(&mut reader)?, + )); + } + Ok(vec) +} + +fn read_map<R: Read>(mut reader: R, size: u64, header: &Header) -> Result<Vec<u64>> { + if size != header.n_wires as u64 * 8 { + return Err(Error::new( + ErrorKind::InvalidData, + "Invalid map section size", + )); + } + let mut vec = Vec::with_capacity(header.n_wires as usize); + for _ in 0..header.n_wires { + vec.push(reader.read_u64::<LittleEndian>()?); + } + if vec[0] != 0 { + return Err(Error::new( + ErrorKind::InvalidData, + "Wire 0 should always be mapped to 0", + )); + } + Ok(vec) +} + +#[cfg(test)] +mod tests { + use super::*; + use ark_bn254::{Bn254, Fr}; + + #[test] + fn sample() { + let data = hex_literal::hex!( + " + 72316373 + 01000000 + 03000000 + 01000000 40000000 00000000 + 20000000 + 010000f0 93f5e143 9170b979 48e83328 5d588181 b64550b8 29a031e1 724e6430 + 07000000 + 01000000 + 02000000 + 03000000 + e8030000 00000000 + 03000000 + 02000000 88020000 00000000 + 02000000 + 05000000 03000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 06000000 08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 03000000 + 00000000 02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 02000000 14000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 03000000 0C000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 02000000 + 00000000 05000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 02000000 07000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 03000000 + 01000000 04000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 04000000 08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 05000000 03000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 02000000 + 03000000 2C000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 06000000 06000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 00000000 + 01000000 + 06000000 04000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 03000000 + 00000000 06000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 02000000 0B000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 03000000 05000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 01000000 + 06000000 58020000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 03000000 38000000 00000000 + 00000000 00000000 + 03000000 00000000 + 0a000000 00000000 + 0b000000 00000000 + 0c000000 00000000 + 0f000000 00000000 + 44010000 00000000 + " + ); + + let file = R1CSFile::<Bn254>::new(&data[..]).unwrap(); + assert_eq!(file.version, 1); + + assert_eq!(file.header.field_size, 32); + assert_eq!( + file.header.prime_size, + hex::decode("010000f093f5e1439170b97948e833285d588181b64550b829a031e1724e6430") + .unwrap(), + ); + assert_eq!(file.header.n_wires, 7); + assert_eq!(file.header.n_pub_out, 1); + assert_eq!(file.header.n_pub_in, 2); + assert_eq!(file.header.n_prv_in, 3); + assert_eq!(file.header.n_labels, 0x03e8); + assert_eq!(file.header.n_constraints, 3); + + assert_eq!(file.constraints.len(), 3); + assert_eq!(file.constraints[0].0.len(), 2); + assert_eq!(file.constraints[0].0[0].0, 5); + assert_eq!(file.constraints[0].0[0].1, Fr::from(3)); + assert_eq!(file.constraints[2].1[0].0, 0); + assert_eq!(file.constraints[2].1[0].1, Fr::from(6)); + assert_eq!(file.constraints[1].2.len(), 0); + + assert_eq!(file.wire_mapping.len(), 7); + assert_eq!(file.wire_mapping[1], 3); + } +}
A
src/ethereum.rs
@@ -0,0 +1,271 @@
+//! Helpers for converting Arkworks types to U256-tuples as expected by the +//! Solidity Groth16 Verifier smart contracts +use ark_ff::{BigInteger, FromBytes, PrimeField}; +use ethers::types::U256; + +use ark_bn254::{Bn254, Fq2, Fr, G1Affine, G2Affine}; + +pub struct Inputs(pub Vec<U256>); + +impl From<&[Fr]> for Inputs { + fn from(src: &[Fr]) -> Self { + let els = src.iter().map(|point| point_to_u256(*point)).collect(); + + Self(els) + } +} + +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub struct G1 { + pub x: U256, + pub y: U256, +} + +impl From<G1> for G1Affine { + fn from(src: G1) -> G1Affine { + let x = u256_to_point(src.x); + let y = u256_to_point(src.y); + G1Affine::new(x, y, false) + } +} + +type G1Tup = (U256, U256); + +impl G1 { + pub fn as_tuple(&self) -> (U256, U256) { + (self.x, self.y) + } +} + +impl From<&G1Affine> for G1 { + fn from(p: &G1Affine) -> Self { + Self { + x: point_to_u256(p.x), + y: point_to_u256(p.y), + } + } +} + +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub struct G2 { + pub x: [U256; 2], + pub y: [U256; 2], +} + +impl From<G2> for G2Affine { + fn from(src: G2) -> G2Affine { + let c0 = u256_to_point(src.x[0]); + let c1 = u256_to_point(src.x[1]); + let x = Fq2::new(c0, c1); + + let c0 = u256_to_point(src.y[0]); + let c1 = u256_to_point(src.y[1]); + let y = Fq2::new(c0, c1); + + G2Affine::new(x, y, false) + } +} + +type G2Tup = ([U256; 2], [U256; 2]); + +impl G2 { + // NB: Serialize the c1 limb first. + pub fn as_tuple(&self) -> G2Tup { + ([self.x[1], self.x[0]], [self.y[1], self.y[0]]) + } +} + +impl From<&G2Affine> for G2 { + fn from(p: &G2Affine) -> Self { + Self { + x: [point_to_u256(p.x.c0), point_to_u256(p.x.c1)], + y: [point_to_u256(p.y.c0), point_to_u256(p.y.c1)], + } + } +} + +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub struct Proof { + a: G1, + b: G2, + c: G1, +} + +impl Proof { + pub fn as_tuple(&self) -> (G1Tup, G2Tup, G1Tup) { + (self.a.as_tuple(), self.b.as_tuple(), self.c.as_tuple()) + } +} + +impl From<ark_groth16::Proof<Bn254>> for Proof { + fn from(proof: ark_groth16::Proof<Bn254>) -> Self { + Self { + a: G1::from(&proof.a), + b: G2::from(&proof.b), + c: G1::from(&proof.c), + } + } +} + +impl From<Proof> for ark_groth16::Proof<Bn254> { + fn from(src: Proof) -> ark_groth16::Proof<Bn254> { + ark_groth16::Proof { + a: src.a.into(), + b: src.b.into(), + c: src.c.into(), + } + } +} + +#[derive(Default, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub struct VerifyingKey { + pub alpha1: G1, + pub beta2: G2, + pub gamma2: G2, + pub delta2: G2, + pub ic: Vec<G1>, +} + +impl VerifyingKey { + pub fn as_tuple(&self) -> (G1Tup, G2Tup, G2Tup, G2Tup, Vec<G1Tup>) { + ( + self.alpha1.as_tuple(), + self.beta2.as_tuple(), + self.gamma2.as_tuple(), + self.delta2.as_tuple(), + self.ic.iter().map(|i| i.as_tuple()).collect(), + ) + } +} + +impl From<ark_groth16::VerifyingKey<Bn254>> for VerifyingKey { + fn from(vk: ark_groth16::VerifyingKey<Bn254>) -> Self { + Self { + alpha1: G1::from(&vk.alpha_g1), + beta2: G2::from(&vk.beta_g2), + gamma2: G2::from(&vk.gamma_g2), + delta2: G2::from(&vk.delta_g2), + ic: vk.gamma_abc_g1.iter().map(G1::from).collect(), + } + } +} + +impl From<VerifyingKey> for ark_groth16::VerifyingKey<Bn254> { + fn from(src: VerifyingKey) -> ark_groth16::VerifyingKey<Bn254> { + ark_groth16::VerifyingKey { + alpha_g1: src.alpha1.into(), + beta_g2: src.beta2.into(), + gamma_g2: src.gamma2.into(), + delta_g2: src.delta2.into(), + gamma_abc_g1: src.ic.into_iter().map(Into::into).collect(), + } + } +} + +// Helper for converting a PrimeField to its U256 representation for Ethereum compatibility +fn u256_to_point<F: PrimeField>(point: U256) -> F { + let mut buf = [0; 32]; + point.to_little_endian(&mut buf); + let bigint = F::BigInt::read(&buf[..]).expect("always works"); + F::from_repr(bigint).expect("alwasy works") +} + +// Helper for converting a PrimeField to its U256 representation for Ethereum compatibility +// (U256 reads data as big endian) +fn point_to_u256<F: PrimeField>(point: F) -> U256 { + let point = point.into_repr(); + let point_bytes = point.to_bytes_be(); + U256::from(&point_bytes[..]) +} + +#[cfg(test)] +mod tests { + use super::*; + use ark_bn254::Fq; + + fn fq() -> Fq { + Fq::from(2) + } + + fn fq2() -> Fq2 { + Fq2::from(2) + } + + fn fr() -> Fr { + Fr::from(2) + } + + fn g1() -> G1Affine { + G1Affine::new(fq(), fq(), false) + } + + fn g2() -> G2Affine { + G2Affine::new(fq2(), fq2(), false) + } + + #[test] + fn convert_fq() { + let el = fq(); + let el2 = point_to_u256(el); + let el3: Fq = u256_to_point(el2); + let el4 = point_to_u256(el3); + assert_eq!(el, el3); + assert_eq!(el2, el4); + } + + #[test] + fn convert_fr() { + let el = fr(); + let el2 = point_to_u256(el); + let el3: Fr = u256_to_point(el2); + let el4 = point_to_u256(el3); + assert_eq!(el, el3); + assert_eq!(el2, el4); + } + + #[test] + fn convert_g1() { + let el = g1(); + let el2 = G1::from(&el); + let el3: G1Affine = el2.into(); + let el4 = G1::from(&el3); + assert_eq!(el, el3); + assert_eq!(el2, el4); + } + + #[test] + fn convert_g2() { + let el = g2(); + let el2 = G2::from(&el); + let el3: G2Affine = el2.into(); + let el4 = G2::from(&el3); + assert_eq!(el, el3); + assert_eq!(el2, el4); + } + + #[test] + fn convert_vk() { + let vk = ark_groth16::VerifyingKey::<Bn254> { + alpha_g1: g1(), + beta_g2: g2(), + gamma_g2: g2(), + delta_g2: g2(), + gamma_abc_g1: vec![g1(), g1(), g1()], + }; + let vk_ethers = VerifyingKey::from(vk.clone()); + let ark_vk: ark_groth16::VerifyingKey<Bn254> = vk_ethers.into(); + assert_eq!(ark_vk, vk); + } + + #[test] + fn convert_proof() { + let p = ark_groth16::Proof::<Bn254> { + a: g1(), + b: g2(), + c: g1(), + }; + let p2 = Proof::from(p.clone()); + let p3 = ark_groth16::Proof::from(p2); + assert_eq!(p, p3); + } +}
A
src/lib.rs
@@ -0,0 +1,79 @@
+//! Arkworks - Circom Compatibility layer +//! +//! Given a Circom WASM-compiled witness.wasm, it can read it and calculate the corresponding +//! +//! ## WASM Witness Generator +//! +//! ## Types +//! * ZKey +//! * WTNS +//! * R1CS +//! * WASM +//! * Sys? +//! +//! Inputs: +//! * circuit.wasm +//! * input.json +//! +//! Outputs: +//! * witness.wtns +//! +//! Given a circuit WASM and an input.json calculates the corresponding witness +//! +//! ## Proof calculator +//! +//! Inputs: +//! * witness.wtns / witness.json +//! * circuit.zkey +//! +//! Given a witness (and r1cs?) synthesizes the circom circuit +//! And then feeds it to the arkworks groth16 prover +//! +//! Outputs: +//! * public.json +//! * proof.json +//! +//! ## Smart Contract connector class +//! +//! Given an Arkworks proof, it's able to translate it to the Circom-verifier +//! expected arguments +//! +//! (No Dark Forest specific modifications included, these are part of df-snark) +//! +//! ## Binary +//! +//! CLIs for each of the above + logging to stdout +//! +//! witness for the specified inputs +//! +//! ## Commands +//! +//! Compile a circuit: +//! `circom circuit.circom --r1cs --wasm --sym` +//! +//! Phase2 over circuit + PoT +//! `snarkjs zkey new circuit.r1cs powersOfTau28_hez_final_10.ptau circuit_0000.zkey` +//! `snarkjs zkey contribute circuit_0000.zkey circuit_final.zkey` +//! `snarkjs zkey export verificationkey circuit_final.zkey verification_key.json` +//! +//! Witness calculation from inputs: +//! `snarkjs wtns calculate circuit.wasm input.json witness.wtns` +//! `snarkjs wtns export json witness.wtns witness.json` +//! +//! Groth16 proof calculation: +//! `snarkjs groth16 prove circuit_final.zkey witness.wtns proof.json public.json` +//! +//! Groth16 Proof verification: +//! `snarkjs groth16 verify verification_key.json public.json proof.json` + +mod circom_wasm; +pub use circom_wasm::WitnessCalculator; + +pub mod circuit; +pub use circuit::{CircomBuilder, CircomCircuit, CircuitConfig}; + +pub mod ethereum; + +pub mod zkey; + +pub mod circom_qap;
A
src/zkey.rs
@@ -0,0 +1,835 @@
+//! ZKey +//! +//! Each ZKey file is broken into sections: +//! Header(1) +//! Prover Type 1 Groth +//! HeaderGroth(2) +//! n8q +//! q +//! n8r +//! r +//! NVars +//! NPub +//! DomainSize (multiple of 2 +//! alpha1 +//! beta1 +//! delta1 +//! beta2 +//! gamma2 +//! delta2 +//! IC(3) +//! Coefs(4) +//! PointsA(5) +//! PointsB1(6) +//! PointsB2(7) +//! PointsC(8) +//! PointsH(9) +//! Contributions(10) +use ark_ff::{BigInteger256, FromBytes}; +use ark_serialize::{CanonicalDeserialize, SerializationError}; +use ark_std::log2; +use byteorder::{LittleEndian, ReadBytesExt}; + +use std::{ + collections::HashMap, + io::{Cursor, Read, Result as IoResult}, +}; + +use ark_bn254::{Bn254, Fq, Fq2, G1Affine, G2Affine}; +use ark_groth16::{ProvingKey, VerifyingKey}; +use ark_serialize::CanonicalSerialize; +use num_traits::Zero; + +#[derive(Clone, Debug)] +pub struct Section { + position: u64, + size: usize, +} + +#[derive(Debug)] +pub struct BinFile<'a> { + ftype: String, + version: u32, + sections: HashMap<u32, Vec<Section>>, + reader: &'a mut Cursor<&'a [u8]>, +} + +impl<'a> BinFile<'a> { + pub fn new(reader: &'a mut Cursor<&'a [u8]>) -> IoResult<Self> { + let mut magic = [0u8; 4]; + reader.read_exact(&mut magic)?; + + let version = reader.read_u32::<LittleEndian>()?; + + let num_sections = reader.read_u32::<LittleEndian>()?; + + let mut sections = HashMap::new(); + for _ in 0..num_sections { + let section_id = reader.read_u32::<LittleEndian>()?; + let section_length = reader.read_u64::<LittleEndian>()?; + + let section = sections.entry(section_id).or_insert_with(Vec::new); + section.push(Section { + position: reader.position(), + size: section_length as usize, + }); + + reader.set_position(reader.position() + section_length); + } + + Ok(Self { + ftype: std::str::from_utf8(&magic[..]).unwrap().to_string(), + version, + sections, + reader, + }) + } + + pub fn proving_key(&mut self) -> IoResult<ProvingKey<Bn254>> { + let header = self.groth_header()?; + let ic = self.ic(header.n_public)?; + + let a_query = self.a_query(header.n_vars)?; + let b_g1_query = self.b_g1_query(header.n_vars)?; + let b_g2_query = self.b_g2_query(header.n_vars)?; + let l_query = self.l_query(header.n_vars - header.n_public - 1)?; + let h_query = self.h_query(header.domain_size as usize)?; + + let vk = VerifyingKey::<Bn254> { + alpha_g1: header.verifying_key.alpha_g1, + beta_g2: header.verifying_key.beta_g2, + gamma_g2: header.verifying_key.gamma_g2, + delta_g2: header.verifying_key.delta_g2, + gamma_abc_g1: ic, + }; + + let pk = ProvingKey::<Bn254> { + vk, + beta_g1: header.verifying_key.beta_g1, + delta_g1: header.verifying_key.delta_g1, + a_query, + b_g1_query, + b_g2_query, + h_query, + l_query, + }; + + Ok(pk) + } + + fn get_section(&self, id: u32) -> Section { + self.sections.get(&id).unwrap()[0].clone() + } + + pub fn groth_header(&mut self) -> IoResult<HeaderGroth> { + let section = self.get_section(2); + let header = HeaderGroth::new(&mut self.reader, §ion)?; + Ok(header) + } + + pub fn ic(&mut self, n_public: usize) -> IoResult<Vec<G1Affine>> { + // the range is non-inclusive so we do +1 to get all inputs + self.g1_section(n_public + 1, 3) + } + + // Section 4 is the coefficients, we ignore it + + pub fn a_query(&mut self, n_vars: usize) -> IoResult<Vec<G1Affine>> { + self.g1_section(n_vars, 5) + } + + pub fn b_g1_query(&mut self, n_vars: usize) -> IoResult<Vec<G1Affine>> { + self.g1_section(n_vars, 6) + } + + pub fn b_g2_query(&mut self, n_vars: usize) -> IoResult<Vec<G2Affine>> { + self.g2_section(n_vars, 7) + } + + pub fn l_query(&mut self, n_vars: usize) -> IoResult<Vec<G1Affine>> { + self.g1_section(n_vars, 8) + } + + pub fn h_query(&mut self, n_vars: usize) -> IoResult<Vec<G1Affine>> { + self.g1_section(n_vars, 9) + } + + fn g1_section(&mut self, num: usize, section_id: usize) -> IoResult<Vec<G1Affine>> { + let section = self.get_section(section_id as u32); + deserialize_g1_vec( + &self.reader.get_ref()[section.position as usize..], + num as u32, + ) + } + + fn g2_section(&mut self, num: usize, section_id: usize) -> IoResult<Vec<G2Affine>> { + let section = self.get_section(section_id as u32); + deserialize_g2_vec( + &self.reader.get_ref()[section.position as usize..], + num as u32, + ) + } +} + +#[derive(Default, Clone, Debug, CanonicalDeserialize)] +pub struct ZVerifyingKey { + pub alpha_g1: G1Affine, + pub beta_g1: G1Affine, + pub beta_g2: G2Affine, + pub gamma_g2: G2Affine, + pub delta_g1: G1Affine, + pub delta_g2: G2Affine, +} + +impl ZVerifyingKey { + fn new<R: Read>(reader: &mut R) -> IoResult<Self> { + let alpha_g1 = deserialize_g1(reader)?; + let beta_g1 = deserialize_g1(reader)?; + let beta_g2 = deserialize_g2(reader)?; + let gamma_g2 = deserialize_g2(reader)?; + let delta_g1 = deserialize_g1(reader)?; + let delta_g2 = deserialize_g2(reader)?; + + Ok(Self { + alpha_g1, + beta_g1, + beta_g2, + gamma_g2, + delta_g1, + delta_g2, + }) + } +} + +#[derive(Clone, Debug)] +pub struct HeaderGroth { + pub n8q: u32, + pub q: BigInteger256, + + pub n8r: u32, + pub r: BigInteger256, + + pub n_vars: usize, + pub n_public: usize, + + pub domain_size: u32, + pub power: u32, + + pub verifying_key: ZVerifyingKey, +} + +impl HeaderGroth { + pub fn new(reader: &mut Cursor<&[u8]>, section: &Section) -> IoResult<Self> { + reader.set_position(section.position); + Self::read(reader) + } + + fn read<R: Read>(mut reader: &mut R) -> IoResult<Self> { + // TODO: Impl From<u32> in Arkworks + let n8q: u32 = FromBytes::read(&mut reader)?; + // group order r of Bn254 + let q = BigInteger256::read(&mut reader)?; + + let n8r: u32 = FromBytes::read(&mut reader)?; + // Prime field modulus + let r = BigInteger256::read(&mut reader)?; + + let n_vars = u32::read(&mut reader)? as usize; + let n_public = u32::read(&mut reader)? as usize; + + let domain_size: u32 = FromBytes::read(&mut reader)?; + let power = log2(domain_size as usize); + + let verifying_key = ZVerifyingKey::new(&mut reader)?; + + Ok(Self { + n8q, + q, + n8r, + r, + n_vars, + n_public, + domain_size, + power, + verifying_key, + }) + } +} + +// skips the multiplication by R because Circom points are already in Montgomery form +fn deserialize_field<R: Read>(reader: &mut R) -> IoResult<Fq> { + let bigint = BigInteger256::read(reader)?; + // if you use ark_ff::PrimeField::from_repr it multiplies by R + Ok(Fq::new(bigint)) +} + +fn deserialize_g1<R: Read>(reader: &mut R) -> IoResult<G1Affine> { + let x = deserialize_field(reader)?; + let y = deserialize_field(reader)?; + let infinity = x.is_zero() && y.is_zero(); + Ok(G1Affine::new(x, y, infinity)) +} + +fn deserialize_g2<R: Read>(reader: &mut R) -> IoResult<G2Affine> { + let c0 = deserialize_field(reader)?; + let c1 = deserialize_field(reader)?; + let f1 = Fq2::new(c0, c1); + + let c0 = deserialize_field(reader)?; + let c1 = deserialize_field(reader)?; + let f2 = Fq2::new(c0, c1); + let infinity = f1.is_zero() && f2.is_zero(); + Ok(G2Affine::new(f1, f2, infinity)) +} + +fn deserialize_g1_vec(buf: &[u8], n_vars: u32) -> IoResult<Vec<G1Affine>> { + let size = G1Affine::zero().uncompressed_size(); + let mut v = vec![]; + for i in 0..n_vars as usize { + let el = deserialize_g1(&mut &buf[i * size..(i + 1) * size])?; + v.push(el); + } + Ok(v) +} + +fn deserialize_g2_vec(buf: &[u8], n_vars: u32) -> IoResult<Vec<G2Affine>> { + let size = G2Affine::zero().uncompressed_size(); + let mut v = vec![]; + for i in 0..n_vars as usize { + let el = deserialize_g2(&mut &buf[i * size..(i + 1) * size])?; + v.push(el); + } + Ok(v) +} + +#[cfg(test)] +mod tests { + use super::*; + use ark_bn254::{G1Projective, G2Projective}; + use memmap::*; + use num_bigint::BigUint; + use serde_json::Value; + use std::fs::File; + + use crate::{circom_qap::R1CStoQAPCircom, CircomBuilder, CircuitConfig}; + use ark_groth16::{create_random_proof_with_qap as prove, prepare_verifying_key, verify_proof}; + use ark_std::rand::thread_rng; + use num_traits::{One, Zero}; + use std::str::FromStr; + + use std::convert::TryFrom; + + fn fq_from_str(s: &str) -> Fq { + BigInteger256::try_from(BigUint::from_str(s).unwrap()) + .unwrap() + .into() + } + + // Circom snarkjs code: + // console.log(curve.G1.F.one) + fn fq_buf() -> Vec<u8> { + vec![ + 157, 13, 143, 197, 141, 67, 93, 211, 61, 11, 199, 245, 40, 235, 120, 10, 44, 70, 121, + 120, 111, 163, 110, 102, 47, 223, 7, 154, 193, 119, 10, 14, + ] + } + + // Circom snarkjs code: + // const buff = new Uint8Array(curve.G1.F.n8*2); + // curve.G1.toRprLEM(buff, 0, curve.G1.one); + // console.dir( buff, { 'maxArrayLength': null }) + fn g1_buf() -> Vec<u8> { + vec![ + 157, 13, 143, 197, 141, 67, 93, 211, 61, 11, 199, 245, 40, 235, 120, 10, 44, 70, 121, + 120, 111, 163, 110, 102, 47, 223, 7, 154, 193, 119, 10, 14, 58, 27, 30, 139, 27, 135, + 186, 166, 123, 22, 142, 235, 81, 214, 241, 20, 88, 140, 242, 240, 222, 70, 221, 204, + 94, 190, 15, 52, 131, 239, 20, 28, + ] + } + + // Circom snarkjs code: + // const buff = new Uint8Array(curve.G2.F.n8*2); + // curve.G2.toRprLEM(buff, 0, curve.G2.one); + // console.dir( buff, { 'maxArrayLength': null }) + fn g2_buf() -> Vec<u8> { + vec![ + 38, 32, 188, 2, 209, 181, 131, 142, 114, 1, 123, 73, 53, 25, 235, 220, 223, 26, 129, + 151, 71, 38, 184, 251, 59, 80, 150, 175, 65, 56, 87, 25, 64, 97, 76, 168, 125, 115, + 180, 175, 196, 216, 2, 88, 90, 221, 67, 96, 134, 47, 160, 82, 252, 80, 233, 9, 107, + 123, 234, 58, 131, 240, 254, 20, 246, 233, 107, 136, 157, 250, 157, 97, 120, 155, 158, + 245, 151, 210, 127, 254, 254, 125, 27, 35, 98, 26, 158, 255, 6, 66, 158, 174, 235, 126, + 253, 40, 238, 86, 24, 199, 86, 91, 9, 100, 187, 60, 125, 50, 34, 249, 87, 220, 118, 16, + 53, 51, 190, 53, 249, 85, 130, 100, 253, 147, 230, 160, 164, 13, + ] + } + + // Circom logs in Projective coordinates: console.log(curve.G1.one) + fn g1_one() -> G1Affine { + let x = Fq::one(); + let y = Fq::one() + Fq::one(); + let z = Fq::one(); + G1Affine::from(G1Projective::new(x, y, z)) + } + + // Circom logs in Projective coordinates: console.log(curve.G2.one) + fn g2_one() -> G2Affine { + let x = Fq2::new( + fq_from_str( + "10857046999023057135944570762232829481370756359578518086990519993285655852781", + ), + fq_from_str( + "11559732032986387107991004021392285783925812861821192530917403151452391805634", + ), + ); + + let y = Fq2::new( + fq_from_str( + "8495653923123431417604973247489272438418190587263600148770280649306958101930", + ), + fq_from_str( + "4082367875863433681332203403145435568316851327593401208105741076214120093531", + ), + ); + let z = Fq2::new(Fq::one(), Fq::zero()); + G2Affine::from(G2Projective::new(x, y, z)) + } + + #[test] + fn can_deser_fq() { + let buf = fq_buf(); + let fq = deserialize_field(&mut &buf[..]).unwrap(); + assert_eq!(fq, Fq::one()); + } + + #[test] + fn can_deser_g1() { + let buf = g1_buf(); + assert_eq!(buf.len(), 64); + let g1 = deserialize_g1(&mut &buf[..]).unwrap(); + let expected = g1_one(); + assert_eq!(g1, expected); + } + + #[test] + fn can_deser_g1_vec() { + let n_vars = 10; + let buf = vec![g1_buf(); n_vars] + .iter() + .cloned() + .flatten() + .collect::<Vec<_>>(); + let expected = vec![g1_one(); n_vars]; + + let de = deserialize_g1_vec(&buf[..], n_vars as u32).unwrap(); + assert_eq!(expected, de); + } + + #[test] + fn can_deser_g2() { + let buf = g2_buf(); + assert_eq!(buf.len(), 128); + let g2 = deserialize_g2(&mut &buf[..]).unwrap(); + + let expected = g2_one(); + assert_eq!(g2, expected); + } + + #[test] + fn can_deser_g2_vec() { + let n_vars = 10; + let buf = vec![g2_buf(); n_vars] + .iter() + .cloned() + .flatten() + .collect::<Vec<_>>(); + let expected = vec![g2_one(); n_vars]; + + let de = deserialize_g2_vec(&buf[..], n_vars as u32).unwrap(); + assert_eq!(expected, de); + } + + #[test] + fn header() { + // `circom --r1cs` using the below file: + // + // template Multiplier() { + // signal private input a; + // signal private input b; + // signal output c; + // + // c <== a*b; + // } + // + // component main = Multiplier(); + // + // Then: + // `snarkjs zkey new circuit.r1cs powersOfTau28_hez_final_10.ptau test.zkey` + let path = "./test-vectors/test.zkey"; + let file = File::open(path).unwrap(); + let map = unsafe { + MmapOptions::new() + .map(&file) + .expect("unable to create a memory map") + }; + let mut reader = Cursor::new(map.as_ref()); + let mut binfile = BinFile::new(&mut reader).unwrap(); + let header = binfile.groth_header().unwrap(); + assert_eq!(header.n_vars, 4); + assert_eq!(header.n_public, 1); + assert_eq!(header.domain_size, 4); + assert_eq!(header.power, 2); + } + + #[test] + fn deser_key() { + let path = "./test-vectors/test.zkey"; + let file = File::open(path).unwrap(); + let map = unsafe { + MmapOptions::new() + .map(&file) + .expect("unable to create a memory map") + }; + let mut reader = Cursor::new(map.as_ref()); + let mut binfile = BinFile::new(&mut reader).unwrap(); + let params = binfile.proving_key().unwrap(); + + // Check IC + let expected = vec![ + deserialize_g1( + &mut &[ + 11, 205, 205, 176, 2, 105, 129, 243, 153, 58, 137, 89, 61, 95, 99, 161, 133, + 201, 153, 192, 119, 19, 113, 136, 43, 105, 47, 206, 166, 55, 81, 22, 154, 77, + 58, 119, 28, 230, 160, 206, 134, 98, 4, 115, 112, 184, 46, 117, 61, 180, 103, + 138, 141, 202, 110, 252, 199, 252, 141, 211, 5, 46, 244, 10, + ][..], + ) + .unwrap(), + deserialize_g1( + &mut &[ + 118, 135, 198, 156, 63, 190, 210, 98, 194, 59, 169, 168, 204, 168, 76, 208, + 109, 170, 24, 193, 57, 31, 184, 88, 234, 218, 118, 58, 107, 129, 90, 36, 230, + 98, 62, 243, 3, 55, 68, 227, 117, 64, 188, 81, 81, 247, 161, 68, 68, 210, 142, + 191, 174, 43, 110, 194, 253, 128, 217, 4, 54, 196, 111, 43, + ][..], + ) + .unwrap(), + ]; + assert_eq!(expected, params.vk.gamma_abc_g1); + + // Check A Query + let expected = vec![ + deserialize_g1( + &mut &[ + 240, 165, 110, 187, 72, 39, 218, 59, 128, 85, 50, 174, 229, 1, 86, 58, 125, + 244, 145, 205, 248, 253, 120, 2, 165, 140, 154, 55, 220, 253, 14, 19, 212, 106, + 59, 19, 125, 198, 202, 4, 59, 74, 14, 62, 20, 248, 219, 47, 234, 205, 54, 183, + 33, 119, 165, 84, 46, 75, 39, 17, 229, 42, 192, 2, + ][..], + ) + .unwrap(), + deserialize_g1( + &mut &[ + 93, 53, 177, 82, 50, 5, 123, 116, 91, 35, 14, 196, 43, 180, 54, 15, 88, 144, + 197, 105, 57, 167, 54, 5, 188, 109, 17, 89, 9, 223, 80, 1, 39, 193, 211, 168, + 203, 119, 169, 105, 17, 156, 53, 106, 11, 102, 44, 92, 123, 220, 158, 240, 97, + 253, 30, 121, 4, 236, 171, 23, 100, 34, 133, 11, + ][..], + ) + .unwrap(), + deserialize_g1( + &mut &[ + 177, 47, 21, 237, 244, 73, 76, 98, 80, 10, 10, 142, 80, 145, 40, 254, 100, 214, + 103, 33, 38, 84, 238, 248, 252, 181, 75, 32, 109, 16, 93, 23, 135, 157, 206, + 122, 107, 105, 202, 164, 197, 124, 242, 100, 70, 108, 9, 180, 224, 102, 250, + 149, 130, 14, 133, 185, 132, 189, 193, 230, 180, 143, 156, 30, + ][..], + ) + .unwrap(), + deserialize_g1( + &mut &[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ][..], + ) + .unwrap(), + ]; + assert_eq!(expected, params.a_query); + + // B G1 Query + let expected = vec![ + deserialize_g1( + &mut &[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ][..], + ) + .unwrap(), + deserialize_g1( + &mut &[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ][..], + ) + .unwrap(), + deserialize_g1( + &mut &[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ][..], + ) + .unwrap(), + deserialize_g1( + &mut &[ + 177, 47, 21, 237, 244, 73, 76, 98, 80, 10, 10, 142, 80, 145, 40, 254, 100, 214, + 103, 33, 38, 84, 238, 248, 252, 181, 75, 32, 109, 16, 93, 23, 192, 95, 174, 93, + 171, 34, 86, 151, 199, 77, 127, 3, 75, 254, 119, 227, 124, 241, 134, 235, 51, + 55, 203, 254, 164, 226, 111, 250, 189, 190, 199, 17, + ][..], + ) + .unwrap(), + ]; + assert_eq!(expected, params.b_g1_query); + + // B G2 Query + let expected = vec![ + deserialize_g2( + &mut &[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ][..], + ) + .unwrap(), + deserialize_g2( + &mut &[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ][..], + ) + .unwrap(), + deserialize_g2( + &mut &[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ][..], + ) + .unwrap(), + deserialize_g2( + &mut &[ + 240, 25, 157, 232, 164, 49, 152, 204, 244, 190, 178, 178, 29, 133, 205, 175, + 172, 28, 12, 123, 139, 202, 196, 13, 67, 165, 204, 42, 74, 40, 6, 36, 112, 104, + 61, 67, 107, 112, 72, 41, 213, 210, 249, 75, 89, 144, 144, 34, 177, 228, 18, + 70, 80, 195, 124, 82, 40, 122, 91, 21, 198, 100, 154, 1, 16, 235, 41, 4, 176, + 106, 9, 113, 141, 251, 100, 233, 188, 128, 194, 173, 0, 100, 206, 110, 53, 223, + 163, 47, 166, 235, 25, 12, 151, 238, 45, 0, 78, 210, 56, 53, 57, 212, 67, 189, + 253, 132, 62, 62, 116, 20, 235, 15, 245, 113, 30, 182, 33, 127, 203, 231, 124, + 149, 74, 223, 39, 190, 217, 41, + ][..], + ) + .unwrap(), + ]; + assert_eq!(expected, params.b_g2_query); + + // Check L Query + let expected = vec![ + deserialize_g1( + &mut &[ + 146, 142, 29, 235, 9, 162, 84, 255, 6, 119, 86, 214, 154, 18, 12, 190, 202, 19, + 168, 45, 29, 76, 174, 130, 6, 59, 146, 15, 229, 82, 81, 40, 50, 25, 124, 247, + 129, 12, 147, 35, 108, 119, 178, 116, 238, 145, 33, 184, 74, 201, 128, 41, 151, + 6, 60, 84, 156, 225, 200, 14, 240, 171, 128, 20, + ][..], + ) + .unwrap(), + deserialize_g1( + &mut &[ + 26, 32, 112, 226, 161, 84, 188, 236, 141, 226, 119, 169, 235, 218, 253, 176, + 157, 184, 108, 243, 73, 122, 239, 217, 39, 190, 239, 105, 147, 190, 80, 47, + 211, 68, 155, 212, 139, 173, 229, 160, 123, 117, 243, 110, 162, 188, 217, 206, + 102, 19, 36, 189, 87, 183, 113, 8, 164, 133, 43, 142, 138, 109, 66, 33, + ][..], + ) + .unwrap(), + ]; + assert_eq!(expected, params.l_query); + + // Check H Query + let expected = vec![ + deserialize_g1( + &mut &[ + 21, 76, 104, 34, 28, 236, 135, 204, 218, 16, 160, 115, 185, 44, 19, 62, 43, 24, + 57, 99, 207, 105, 10, 139, 195, 60, 17, 57, 85, 244, 167, 10, 166, 166, 165, + 55, 38, 75, 116, 116, 182, 87, 217, 112, 28, 237, 239, 123, 231, 180, 122, 109, + 77, 116, 88, 67, 102, 48, 80, 214, 137, 47, 94, 30, + ][..], + ) + .unwrap(), + deserialize_g1( + &mut &[ + 144, 175, 205, 119, 119, 192, 11, 10, 148, 224, 87, 161, 157, 231, 101, 208, + 55, 15, 13, 16, 24, 59, 9, 22, 63, 215, 255, 30, 77, 188, 71, 37, 84, 227, 59, + 29, 159, 116, 101, 93, 212, 220, 159, 141, 204, 107, 131, 87, 174, 149, 175, + 72, 199, 109, 64, 109, 180, 150, 160, 249, 246, 33, 212, 29, + ][..], + ) + .unwrap(), + deserialize_g1( + &mut &[ + 129, 169, 52, 179, 66, 88, 123, 199, 222, 69, 24, 17, 219, 235, 118, 195, 156, + 210, 14, 21, 76, 155, 178, 210, 223, 4, 233, 5, 8, 18, 156, 24, 82, 68, 183, + 186, 7, 126, 2, 201, 207, 207, 74, 45, 44, 199, 16, 165, 25, 65, 157, 199, 90, + 159, 12, 150, 250, 17, 177, 193, 244, 93, 230, 41, + ][..], + ) + .unwrap(), + deserialize_g1( + &mut &[ + 207, 61, 229, 214, 21, 61, 103, 165, 93, 145, 54, 138, 143, 214, 5, 83, 183, + 22, 174, 87, 108, 59, 99, 96, 19, 20, 25, 139, 114, 238, 198, 40, 182, 88, 1, + 255, 206, 132, 156, 165, 178, 171, 0, 226, 179, 30, 192, 4, 79, 198, 69, 43, + 145, 133, 116, 86, 36, 144, 190, 119, 79, 241, 76, 16, + ][..], + ) + .unwrap(), + ]; + assert_eq!(expected, params.h_query); + } + + #[test] + fn deser_vk() { + let path = "./test-vectors/test.zkey"; + let file = File::open(path).unwrap(); + let map = unsafe { + MmapOptions::new() + .map(&file) + .expect("unable to create a memory map") + }; + let mut reader = Cursor::new(map.as_ref()); + let mut binfile = BinFile::new(&mut reader).unwrap(); + + let params = binfile.proving_key().unwrap(); + + let json = std::fs::read_to_string("./test-vectors/verification_key.json").unwrap(); + let json: Value = serde_json::from_str(&json).unwrap(); + + assert_eq!(json_to_g1(&json, "vk_alpha_1"), params.vk.alpha_g1); + assert_eq!(json_to_g2(&json, "vk_beta_2"), params.vk.beta_g2); + assert_eq!(json_to_g2(&json, "vk_gamma_2"), params.vk.gamma_g2); + assert_eq!(json_to_g2(&json, "vk_delta_2"), params.vk.delta_g2); + assert_eq!(json_to_g1_vec(&json, "IC"), params.vk.gamma_abc_g1); + } + + fn json_to_g1(json: &Value, key: &str) -> G1Affine { + let els: Vec<String> = json + .get(key) + .unwrap() + .as_array() + .unwrap() + .iter() + .map(|i| i.as_str().unwrap().to_string()) + .collect(); + G1Affine::from(G1Projective::new( + fq_from_str(&els[0]), + fq_from_str(&els[1]), + fq_from_str(&els[2]), + )) + } + + fn json_to_g1_vec(json: &Value, key: &str) -> Vec<G1Affine> { + let els: Vec<Vec<String>> = json + .get(key) + .unwrap() + .as_array() + .unwrap() + .iter() + .map(|i| { + i.as_array() + .unwrap() + .iter() + .map(|x| x.as_str().unwrap().to_string()) + .collect::<Vec<String>>() + }) + .collect(); + + els.iter() + .map(|coords| { + G1Affine::from(G1Projective::new( + fq_from_str(&coords[0]), + fq_from_str(&coords[1]), + fq_from_str(&coords[2]), + )) + }) + .collect() + } + + fn json_to_g2(json: &Value, key: &str) -> G2Affine { + let els: Vec<Vec<String>> = json + .get(key) + .unwrap() + .as_array() + .unwrap() + .iter() + .map(|i| { + i.as_array() + .unwrap() + .iter() + .map(|x| x.as_str().unwrap().to_string()) + .collect::<Vec<String>>() + }) + .collect(); + + let x = Fq2::new(fq_from_str(&els[0][0]), fq_from_str(&els[0][1])); + let y = Fq2::new(fq_from_str(&els[1][0]), fq_from_str(&els[1][1])); + let z = Fq2::new(fq_from_str(&els[2][0]), fq_from_str(&els[2][1])); + G2Affine::from(G2Projective::new(x, y, z)) + } + + #[test] + fn verify_proof_with_zkey() { + let path = "./test-vectors/test.zkey"; + let file = File::open(path).unwrap(); + let map = unsafe { + MmapOptions::new() + .map(&file) + .expect("unable to create a memory map") + }; + let mut reader = Cursor::new(map.as_ref()); + let mut binfile = BinFile::new(&mut reader).unwrap(); + + let params = binfile.proving_key().unwrap(); + + let cfg = CircuitConfig::<Bn254>::new( + "./test-vectors/mycircuit.wasm", + "./test-vectors/mycircuit.r1cs", + ) + .unwrap(); + let mut builder = CircomBuilder::new(cfg); + builder.push_input("a", 3); + builder.push_input("b", 11); + + let circom = builder.build().unwrap(); + + let inputs = circom.get_public_inputs().unwrap(); + + let mut rng = thread_rng(); + let proof = prove::<_, _, _, R1CStoQAPCircom>(circom, ¶ms, &mut rng).unwrap(); + + let pvk = prepare_verifying_key(¶ms.vk); + + let verified = verify_proof(&pvk, &proof, &inputs).unwrap(); + + assert!(verified); + } +}
A
test-vectors/calculatewitness.js
@@ -0,0 +1,35 @@
+#!/usr/bin/env node + +const fs = require("fs"); +const {stringifyBigInts, unstringifyBigInts} = require("snarkjs"); +const WitnessCalculatorBuilder = require("./witness_calculator.js"); + +// const wasmName = "smtverifier10.wasm" +// const inputName = "smtverifier10-input.json" + +const wasmName = "nconstraints.wasm" +const inputName = "nconstraints-input.json" + +async function run () { + const wasm = await fs.promises.readFile(wasmName); + const input = unstringifyBigInts(JSON.parse(await fs.promises.readFile(inputName, "utf8"))); + + console.log("input:", input); + let options; + const wc = await WitnessCalculatorBuilder(wasm, options); + + const w = await wc.calculateWitness(input); + + console.log("witness:\n", JSON.stringify(stringifyBigInts(w))); + + // const wb = await wc.calculateBinWitness(input); + + // console.log("witnessBin:", Buffer.from(wb).toString('hex')); + + // await fs.promises.writeFile(witnessName, JSON.stringify(stringifyBigInts(w), null, 1)); + +} + +run().then(() => { + process.exit(); +});
A
test-vectors/circuit2.circom
@@ -0,0 +1,39 @@
+template CheckBits(n) { + signal input in; + signal bits[n]; + var lc1=0; + + var e2=1; + for (var i = 0; i<n; i++) { + bits[i] <-- (in >> i) & 1; + bits[i] * (bits[i] -1 ) === 0; + lc1 += bits[i] * e2; + e2 = e2+e2; + } + + lc1 === in; +} + +template Multiplier(n) { + signal private input a; + signal private input b; + signal output c; + signal inva; + signal invb; + + component chackA = CheckBits(n); + component chackB = CheckBits(n); + + chackA.in <== a; + chackB.in <== b; + + inva <-- 1/(a-1); + (a-1)*inva === 1; + + invb <-- 1/(b-1); + (b-1)*invb === 1; + + c <== a*b; +} + +component main = Multiplier(64);
A
test-vectors/mycircuit-input2.json
@@ -0,0 +1,2 @@
+{"a": "21888242871839275222246405745257275088548364400416034343698204186575796149939", "b": 11} +
A
test-vectors/mycircuit-input3.json
@@ -0,0 +1,2 @@
+{"a": "10944121435919637611123202872628637544274182200208017171849102093287904246808", "b": 2} +
A
test-vectors/mycircuit.circom
@@ -0,0 +1,10 @@
+template Multiplier() { + signal private input a; + signal private input b; + signal output c; + + c <== a*b; +} + +component main = Multiplier(); +
A
test-vectors/nconstraints.circom
@@ -0,0 +1,14 @@
+template A(n) { + signal input in; + signal output out; + + signal intermediate[n]; + + intermediate[0] <== in; + for (var i=1; i<n; i++) { + intermediate[i] <== intermediate[i-1] * intermediate[i-1] + i; + } + out <== intermediate[n-1]; +} + +component main = A({{N}});
A
test-vectors/package-lock.json
@@ -0,0 +1,801 @@
+{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "big-integer": { + "version": "1.6.48", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", + "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + }, + "circom": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/circom/-/circom-0.5.4.tgz", + "integrity": "sha512-160Qs9lptZBNy/BWuRKsLYWX2RjMwxnH+GfUEO5RzEWBEwsiG0GX2HM+07IbWK4lxaZufE0wkF808YmpKcuYPQ==", + "requires": { + "big-integer": "^1.6.32", + "chai": "^4.2.0", + "circom_runtime": "0.0.3", + "ffiasm": "0.0.2", + "ffjavascript": "0.0.4", + "ffwasm": "0.0.6", + "fnv-plus": "^1.3.1", + "r1csfile": "0.0.3", + "tmp-promise": "^2.0.2", + "wasmbuilder": "0.0.10" + } + }, + "circom_runtime": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.0.3.tgz", + "integrity": "sha512-z4ypbs9cTQn7+2FHZNTnccMj6kQCcKT2agYqCrm2kdLBJh9LDoxU1JVu5mSnVuOtgc7BclQ7r0xclG0zP2rxhw==", + "requires": { + "big-integer": "^1.6.48", + "fnv-plus": "^1.3.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "requires": { + "type-detect": "^4.0.0" + } + }, + "ejs": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.0.2.tgz", + "integrity": "sha512-IncmUpn1yN84hy2shb0POJ80FWrfGNY0cxO9f4v+/sG7qcBvAtVWUA1IdzY/8EYUmOVhoKJVdJjNd3AZcnxOjA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "ffiasm": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ffiasm/-/ffiasm-0.0.2.tgz", + "integrity": "sha512-o/CL7F4IodB7eRHCOQL1SrqN2DIPHrQbEwjPY7NIyeBRdnB3G0xo6b6Mj44SKiWFnvpQMb3n4N7acjD3vv4NVQ==", + "requires": { + "big-integer": "^1.6.48", + "ejs": "^3.0.1", + "yargs": "^15.3.1" + } + }, + "ffjavascript": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.0.4.tgz", + "integrity": "sha512-6eiRvy+YuGCRjH4U8KdJbRel5VBW0zeuUL1FXQ+fFxTp5xv2ClqTfCYf5ClUtq0voGpd9XJAdUCvgIxHDbAQ0Q==", + "requires": { + "big-integer": "^1.6.48" + } + }, + "ffwasm": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/ffwasm/-/ffwasm-0.0.6.tgz", + "integrity": "sha512-bEBKYANozdyZBCGE6XLg4s/CaJRZdFGQgbthy7EZ4OhNCIpycgklS5mlf88Bw4fXSddlU1V9iYXI4JwfGO3BhQ==", + "requires": { + "big-integer": "^1.6.48", + "wasmbuilder": "0.0.10" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fnv-plus": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/fnv-plus/-/fnv-plus-1.3.1.tgz", + "integrity": "sha512-Gz1EvfOneuFfk4yG458dJ3TLJ7gV19q3OM/vVvvHf7eT02Hm1DleB4edsia6ahbKgAYxO9gvyQ1ioWZR+a00Yw==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "keccak": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.0.tgz", + "integrity": "sha512-/4h4FIfFEpTEuySXi/nVFM5rqSKPnnhI7cL4K3MFSwoI3VyM7AhPSq3SsysARtnEBEeIKMBUWD8cTh9nHE8AkA==", + "requires": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-addon-api": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.0.tgz", + "integrity": "sha512-ASCL5U13as7HhOExbT6OlWJJUV/lLzL2voOSP1UVehpRD8FbSrSDjfScK/KwAvVTI5AS6r4VwbOMlIqtvRidnA==" + }, + "node-gyp-build": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.1.tgz", + "integrity": "sha512-XyCKXsqZfLqHep1hhsMncoXuUNt/cXCjg1+8CLbu69V1TKuPiOeSGbL9n+k/ByKH8UT0p4rdIX8XkTRZV0i7Sw==" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "r1csfile": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.3.tgz", + "integrity": "sha512-TNrodnbHw5yAMv2gj0Ezf22XS3q8zGEjdPHZLBmJauIPFxm6QmyzxlB92yZ5WNkjEtJiS7p1hvkO9/RsJXRDjw==", + "requires": { + "big-integer": "^1.6.48" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "snarkjs": { + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.1.25.tgz", + "integrity": "sha512-VtQoCWbkt3uFGnBB9aEYX1OITw9Rx40q2wkj1QElRcJtJU0R73BJ+CNfYEty7/Z10pEjkGkUCD4a3J6MOAllQA==", + "requires": { + "big-integer": "^1.6.43", + "chai": "^4.2.0", + "circom_runtime": "0.0.3", + "escape-string-regexp": "^1.0.5", + "ffjavascript": "0.0.4", + "keccak": "^3.0.0", + "r1csfile": "0.0.3", + "yargs": "^12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "requires": { + "rimraf": "^2.6.3" + } + }, + "tmp-promise": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-2.0.2.tgz", + "integrity": "sha512-zl71nFWjPKW2KXs+73gEk8RmqvtAeXPxhWDkTUoa3MSMkjq3I+9OeknjF178MQoMYsdqL730hfzvNfEkePxq9Q==", + "requires": { + "tmp": "0.1.0" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "wasmbuilder": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.10.tgz", + "integrity": "sha512-zQSvZ7d74d9OvN+mCN6ucNne4QS5/cBBYTHldX0Oe+u9gStY21orapvuX1ajisA7RVIpuFhYg+ZgdySsPfeh0A==", + "requires": { + "big-integer": "^1.6.48" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } + }, + "yargs-parser": { + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +}
A
test-vectors/proof.json
@@ -0,0 +1,28 @@
+{ + "pi_a": [ + "21820242516822140966541162377276968686232843738113587401096982992192344668894", + "11813319305207505272935972628809616933491158390363636948064175237855995334902", + "1" + ], + "pi_b": [ + [ + "18917448206777957911519238799204582671273667459570541744718718682284696800644", + "21860816634843106300632391943058453169523964990832692292245793512061190952946" + ], + [ + "16561373496530563246294178223057082579479375833438527168631993097749179197198", + "19528135117438338906248937077496663741632339371165800510091342591825441786822" + ], + [ + "1", + "0" + ] + ], + "pi_c": [ + "16517915790659730733697074034691836627766957980661041574367499432757153082558", + "14547307060850695604573432667032315680903080725809615957085938618335278860351", + "1" + ], + "protocol": "groth16", + "curve": "bn128" +}
A
test-vectors/safe-circuit-witness.json
@@ -0,0 +1,1 @@
+["1","33","3","11","10944121435919637611123202872628637544274182200208017171849102093287904247809","15321770010287492655572484021680092561983855080291224040588742930603065946932","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","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","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]
A
test-vectors/smtverifier10-input.json
@@ -0,0 +1,1 @@
+{"enabled":1,"fnc":0,"root":"4677130581325536491486966387607462164138332022971476080171400451642918512081","siblings":["3663166078965935940798554689567237216195612079341396621785946741270885707796","0","0","15268343501033916092396853374199187988748455820543796633535012025134089057292","0","0","0","0","0","0"],"oldKey":0,"oldValue":0,"isOld0":0,"key":8,"value":"88"}
A
test-vectors/smtverifier10-witness.0.json
@@ -0,0 +1,1 @@
+["1","1","4677130581325536491486966387607462164138332022971476080171400451642918512081","3663166078965935940798554689567237216195612079341396621785946741270885707796","0","0","15268343501033916092396853374199187988748455820543796633535012025134089057292","0","0","0","0","0","0","0","0","0","8","88","0","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","20401005071856934512126577919502093469896998333576395423210405098533190508507","11221637573274527616863092148963749320478792326359046885677505791311769356018","8745783385554450415208935817556852505963904666879292035461030896427986458112","9244054540770593249164904411947793447281401475699918706115188959349553172609","6581545343376332934470298595303632772511109891764171139465847680676650578729","12975903254346194675529240354727255457038095804076524091329755869393139766310","19803394941685684270813854857745644278038054764942536290820369900488658686769","5585940125353456154521445874379558632458207346008607940080790213364645505640","11244506172933668759891206264732186405597437035907023598547133839316120885010","3851610976264127763238413778601510263979165838589148071349426447569686985537","7071322364577335901969711896982054043277813863419856561388537194670266500928","3422067089417484796438032477722219695118990728746401029759595625790364149058","12805072737486811772973782049375276466806793382130045923297598542528800907640","17594513878835829024628278755667566984922043736716840421722068539653840180098","11676632784204779241861891185738674481683374135588050557642915940062806296009","17029162924965293673613365522846640100950910855072609798239625459599435756432","898211697157487519549227415570576029211121292361396405283406356883749403433","14366915830202766326462188063191230174833179536088645343834382544400378063817","12664457920371440200917881112751351791448665078161964422114373799678084000050","17225831107330066355623410954976865220779035414911632504709423461069070042847","15657915420758543114125245922743178484097012107933132545134956351582036480599","19754853673624730710977384068239569426733090852240507254234975130775960609938","8198290072019908088585613427402075944609199376238991750557143368792110056917","1333407219535987206869704320213118282868594714568243577334397935211111565715","21696472737914927716029078365694485185304677066522490566902805064270348556171","21497072371838054498503157730407578511075553217113204002988434039207246371578","5716079215469010939187327511333079592012591456756259945796209224952163593487","20404170185245755308843976534997243568739930447604335283167685199377654923677","3861104375503645343253701541822050315728344764334581528650347764808466008772","12176975535856139763876059137788210748198215908393783789694770294237423844957","9247875438240158930194335478535671336864947763413807028167313109015312968497","6592516723531779047857309550899157470275721686168529216387600586493627849431","16476508353622634039502369128688793162898765582396203485037731125713134755088","16991997937888716195946864204614725755234396710735877165513368685452596661198","3914988840617461336651438811845515669502559158528622460013509105300914427028","3863115990534889945500773133511145528863330703330314568158266628528605597927","416082415334241412724663049953052712235794129102416316011799084427861582432","7012848816004284185035158201803358903539970170529540142208517967114500409289","309124229574207157014906527537525694202070019156169063436887145561949857354","4903932045637942020910927595036398365107193846462306614299284140404690065068","7000863141160564151708317534611959556176902405007176070976400358908336487170","21691282481141582101787333268357348185168707972411497385218229921979851496714","4993846952465067232508627513995021849200978865360389076614854507987120521327","13679265692718148432964414312888965754192456198167844449126675613603764431353","17066325425121808184493925216967757222883042054035551418153107722149034573896","17710845672394130184756857369322756347951455276898130666623871172064208747979","18791922148050535258510569444323003216256558953498764128968513159495756490056","21422612213975069678703444003440769029703257979189053492384391986190935853154","14074415911075350631884210592009132418311763228478585328870829236957130742199","16712164885928936209544215710602236499399381264333010921664416671110192821993","3890144174096543702457795424381092106714103806060869185105952186578895867756","11411603826185899674971789468779496707097420392589574681030457227865151634051","11278134006242651868902384814455424534094895878266224494208932651040997774068","1357976199171393844376689379124945751111697904858997084755974405416513135130","4343153040657565323028111840502007152428817003888600450694507961870476715049","9181377387595337580491416874175160168294493245080934245751816446388796751333","2425255305536196957205709729120798214436921859930479453252945270807748959831","6578001121361113879940172957236491457133313864689528387979479021821170227528","6164826779736626116597963547825155927772940310941968391447058498265132941261","3700108232241915958613696304948507201904544448046297515460883207338904971957","6190605837118282399165843470388989860287782868077605535985954418426816486848","6106138037438722673902364538115559045760636760660522230477535279666035413187","7405964407182383200594638786755813280180795146585621289192941432152439440086","2200073129892824111028068225485916839587213026436809124266199233346024821857","777319442678688744821482923415270381777286492397327378325402245889926113240","4017789474855628294606140402010623796688815094558205632387074072916552303805","11541270330683062542002567459358015349727014574901601721365737063538627848784","2823446574700218657249665947434174672382654962132488646881644193852571932673","18645589912182584889008316601334376095060638659765559115298650825082369851287","3680029750573981264593517375834933811009820922904952587272493770675150374356","2929666058350115345342236274632809166146917579536660504655231315555436676586","8320637811295883468181433499036831046557397880226343311828585289892587214515","16591937026101200113681836715463161062807490929046078632696350632714015846273","8795690113722596255446828902343872522907104874764323843148878360839846919788","20366663702866348723626834188465001593290575846081185935326903927067034107252","12342598629879250444478089943466892992579599146445696118318894716353479374633","16259012922543827169350964030933195000537381418255367480041281802653105554367","12727226511659528038841457459572229869377155257323116804496913969535909098288","4163951756144334245982358155937243341098470553469840012078653410810603589985","16103760585047488043518047184267211279733736508403896735104081570559394710718","17968408395015647153390654310047841793100589888981506050760915440531564687486","16351568846757948082188054307032332134518555898871318879812972448998152306907","6342581867536954425364947512495207954907702963409018744505216713745289776619","9363831508530600700698420618137039463907207123540773426371039894423765974248","20075832863770169333140290362784679987512130747407669117958068862238087506494","21580125495149521509798300361163549289523125106301210180275602913697795554567","1937040316623820023960935271645884612309404618891512677359910025188104033226","21517678618944895039240977900966127769332156048840516238088842026700305705012","20728974232879640650907968365809502694287999028914817913019859489247556584657","3409922081783949327397585571502224023322363594505140360630521720238096632048","4352570094213759068010467281635359513546837716394971164736674562929400659212","18092743800455456886347218203111800469191995169022333387522916747113632570721","2720063087673413801723557690255579841302823358803320266748888047895700178045","17175110071593084131946893556501435042165047431415201347091813354122835260983","9564979330152443288757003931479794587522179114133060435658579983149254930452","3347318299939765106607470741145767094546236829410691679119011792301797632966","14304502015050510948444307105619853777717641581631912930792268465609404021745","13092175495279360971869065949746520811223147791128757546399480296412351058636","1707262360973913201290435384049854356393578103195212390738103913777738765421","19547205526504752356643386138961952832928916942163722567977251224617238914117","9085154959324178162089071949842580458454326822530247712634309003141924702486","12814237133700871021032361735785084146217842200097327414960119130631110311442","1359758249310568523959159411473149159617592555982101840296408398338014100783","3104980275139829931512442595755479318019380107275848824776224035187014631003","5493324324817078234775956780046158417049208997028274089444829337603296722426","1681520132627660515759216226058108884817107492719428021074441745269746284718","13662965712161503073421247925426256337681191812734409004926825920787983550049","13953690466383149502155233198046014428345178899886405774602488957627161563198","19508620792125602182604291052414997117479520340671156481638198006380435206454","15585806510286403785339305494026941066403103642461231767248063552270235798329","10591076546558341465956035434738467664797258248905485988162498958505153513549","7303414353594474076771047430548081276179918923761331892484251075976564495075","17809199738317839532834887681838755795863975391799342593236782185975857238832","16604278472391565348616039444424523867654345641807562460418656489568589645032","8237960180613089133251894643818308954848678663543875572693460953231041608999","20252627952247442853516997323335870309495884623902725391299640626806641363419","13010139359466442214028326184148905507075133675038826752784828106826780272511","10593150018938904650239309235782794716816364828345398853512108236577076228427","21367786691449289003262284660230829190347540659543560982766812158031120620473","6451648692626028930093936406515211657854909709777953110081985716539273220516","12766739823382181891283205641808414952509826741782530753613193983744392728448","4152627578387185259720856370164111187765235611908230932235714802983217744703","20559441146863706706612756361694163338214336751967192218824662904135304898265","21585694903436710940838237655335883320936489820548029731069199515972395902380","20086222984858344510153414643427012481264615220408902558799562092479204992935","4412297587711446043658653737773520913552739358415225931706151379637525239477","2018569567026351713371810181667215232974538547903561168814261759374068701803","19991380241176495288021205698639569317246725881199633001218387487225194499399","16690616887676576899275604530394123990808241817956807416089902772332005033784","12197411165633993311637818946920192462264030916481390428255919160240064902539","21360178049769523245638150201112394465160991252228772394025429826522876900707","12042620832074551150671733150982473051019870966564909661218834109744780832683","7575945236670015505297026945469622313829376830393540658820227626247404896917","1177554713186658763324413579030047150809337955329593674502439221398324469772","20701437816539673739193127221977693028818199043643329736436109179070047986613","21277375846212685001160649578521759416533171901229920395278837137843958994298","5167361814658027993443792587272450359866078492250847529914167555027021088752","15491994655976316629130032876017990030761400577254625018363825894120530242078","11227788182697009408713227845225539812449541448277168680929743423822707529016","6805999662232917683088357937775508272384308252402567889259796646010812882509","19147779879984705098129733151170417062086581671669029655550877954792558142120","6767138719486424092389456488423146405376629165433241332938689996397685776600","7930912798246568183862348412267808581384988460482027147004935278632461616331","2840685718056113649483300108416912411553089383486903035854107190428939595608","5168388012160650046818706408111785055211044776154200232884758331702687554334","10804401084335200432200234570784426047440267309244921012516844845499016980664","5879447319630148454436579568803516195284192221266612058486316005113897095930","13917146744616545927466577242504887257092990414335537997096436089688482879066","7281193707760517178701005290717080306813564631661049871540602881963365683570","4714562661041331587767734533894097091396488088860418963518426473589804557487","13887563944098051139877147513872141311344298949607520302221303592669471460570","16579059176161881255591784547021600660183776427736277671308519582581979168878","8694977228299859841175623888800715810340720419926627503988818183239920254073","2172253260743250401035024421278379777916382490227575054809637917357788441312","14665571968318605496084681499335240332202318897099276835041940682766807976907","13788414596479781830905239782377049622946683526352305364078392223659290971584","18846694414052465556659565992225098024384646887582834683138263144484156013216","18909694294096613181566240927846162134571252858203666549730835332103200690035","11302305857141628538629953629326471087204891592808197565589978544546426632081","6227200756618295061351735117380809309630763426846510648575304931856516037841","8021312996668423572838508273377537114213652367510483138732039589143910942285","21388094391985017261787469872068829174474019054586123619541825509796561450790","21885651340100197866119915077229901141001400587163480023167719003850464453378","1608755743284263772124938006622577179113688179673570557030033176267563213041","13050375867717790111352186875571909444667320683101020630233156531382762997902","4180493677097985629503954411759408181273462596141906530266328347694482447964","16811998889189663419776324321715740745154975581084585098481145952898063763925","16612502123140902787932370622659883066359797218657937716504038581027498683678","15769175760205404886801504889168121006624730224917112560602404161996659168361","20052131037268168276455630892186744046507841591520494885002299620411034571862","11286349682428768936719355726833992780573753672773572798304688720131939941802","15293151422103730504035658386990919038025737188769598280820302135301927386912","18703537633868269115461117846009556047576534581284962047788460371685925813668","19816902833644091320363126330118840288762510118845312064098145305766287003223","6949529972860419420429881205468865348186754309617968830960173223899557068871","21769760420707708407196283509804176958755850063132524803247207048895874481547","16473440670711897050313900169854568259807762012647829221269081056318792356126","5755517310638949109705199598640619834726909253002725292857053231304608155045","18514834954938936122733927663845294725735316174228237138021110413393046162581","17571597077800905223425674691799272951518841099899533191990592453235956462954","10343484121259456581495033186763792506225736617417894740287403400452942118070","8186370189144040948121370788563796344048042083081451096538106522673478588702","8995025199059491390637130758318854239417833814558039265434685177008885657376","3031472894766219059858005879618131510547478592444817981222996099059821846881","2096428173458244970035526371806757154215216540598106496719732366873152520837","8675946050592777564397329804724481502039667147072709891128997869096929909302","17906690355906715260861029848190721333178832439438757851850849610334161786543","4384788675154419950337779244254851527639700456846122803163036431404897343108","10634747710354045161595825225067140147638177833819964359291109028759478763621","4580007891428170105461347466211733339661434246730887454077503547854614786950","6720944024268957202412287014295868893359381461158140752090329880073245402319","21067675131658633409859213918385464384511429181488894854369374713210855461815","16177587773864804257177452843060500221886822743222984664060487906675527734703","13079635341912832179522112507633850975262973331265925673861158474356511611384","16236233157426847369987516405740925840383712577721411003080927736978196366559","17097099286724890492201072326079274906042444622668857230524228768759306104985","12374897587824358200842113460666498015857548278280740473550475324753591770620","3743009308795546792486590404059394908393015243149251676878652068279426604464","13432526247494961087744035539077952702179727966783485855320023422065068950252","14688776804642386173370616887634934837860201468381553713589845678935220814417","20904319181107930591693522497108668757957419786841420945208626464814153089193","19407641638080623902880021605403902459599192981944013662244523661942092202498","21720689962955897879072073704808757982038470068030781698960518758667577129677","11556047135933626896991588396593649827497284072272132683055383198656940349048","19257583335877403011481825317736793499880424865167133441637092959749399313502","13275085742513982073825903569505547173921689074792003972342829667341416493126","18186872120656666367984034318751888935557574116281525928633345317144781969073","14599117383639859062997186133227491056306039136668700051238992695822329595098","19740951317365036802810812995171476018610554899213047341766274684214000740145","9232422044771875096580864407828551184325758239361884860195530069570407413318","5782771296280052360904902126779087649052846261379285480209334847379086457360","17775282817901904888330413443189119364682659487019158676987538587625189917675","1066561985776794466121987377463909476153575322506563004801404340179984503358","916610154805361771422714723232443767291038192009867156950524039746086028401","4263481370387913376337920860725556717557869034134864109920649685553200846737","21527423542512274990094513736693705044639494441663212768988971472445510517978","10772690412778715474843013948287122660611007948917009503717928759138195613014","18989845603394891199611627052394615555798122422360150509305595512430227212110","1487098483796490147575884469388782159299789468561110722348429487198102511632","11667047470399501056529839354106390056855239389300339367976940850340830689602","5338067017433143995924920876000505719377099047442243276435769640883922280642","1639154030154468844685352572728959965411397422368845217263926967377984087918","13132630700141676106323558960818397425405595913465552969558631534061094705576","2458781772273794819307075201130420262482061223367508169648376645311313254366","6989078751359738075626608779501110225709667509447635458687084301860445414746","20836197943088438759206423067022986510252062173602603489446775527012291159050","18390977497454237569981882804497550599991431944174604456803823228635067811916","4479367924266739311074668717226301598844575048116616983202084854079931435570","2372419656930102328120568984777773190858918440893623551278564788948605764950","17424291298284456433265316564330140848645960802620988826169646524423608305736","5191605225433260421899104272077087002740218354346855625304698999580323149994","17898440187463079591870946871304745777602605814215664686278564822325291419191","17611859793190030697270091204050783889385403582777422405706234317717780973100","6588587992156876940819466372868592907549272382061712287684384984996473409069","7571197384407543438573501918487955350438229069418009632490500922685766556226","19622703780298965679676905213767547082077482457947888893360172083867854718926","21446166290358832595129109900917818945140329225281180988061882531971704945157","14649292190763374051361083505220623580043497183975221593597470501022875986346","9250214836887340715465257774381457509613303863101998855836867422306668714320","3799607608415765239282726340696436000586985801883310385292182905931378559808","17716236540211356810682240131328879925291668848938188875646461996226633603517","3887247465597261866432589749777530709095472168951470811122850860456882054277","6525687314391411916112093511825672263789004056033625391579990650584140851278","18592972741726720044072476390541116995214640896242376564042077906654954615137","12997212889971214092134739212016042815399565774915015723654277172229677291011","4254868471812137051590028129329703685529333363876224691622049514478855958366","14077966582517650919095650571577815704088597646103632306418723366506982670177","2119040149469535235354287029771330452747208537753577105519400357108434620411","21207697933470223869807555124325166307406257362044904072363334745276665314519","7190349195858345271646884052209071028827286750667738554028330712093377579936","16265488593955930172602312822419213417723968840302817494967024427075137839227","3815741010043562088607530283042787457524759791192323981761722086661415318698","583720915355772636555020703257046532442295128724429828849982324889318921432","1102170375893401441969298656526252647564281790059860493515220468546293038983","20767630688965793693794841558983931333464021565935903930902434604933701634957","21616121155846316756550750706226004899196665451412952515147921487185019383040","5002740013222387832459522707343247526776565128458994065010013201054029150030","6422077943179130803411797212230074834259655685154616288632319414611811921679","6019275795713350605150056395270079054684805603375188442442583000164536600669","17914078933612908061224514463417935922110346592944014164310000755613126054170","884772023111484045899873716128401230350003279147268331381189004763305996576","17473959651366673630198321431736393430579835044648223641744676465172539467775","15447258812182481040301268885975493988884370066061371405663840836784218216964","8635047604843668793061248505841409069840701926714186786314566959169242448865","1913175376077276449938876878307650673449443092618268439860264573460817155356","17706537122791580851807813119734656545999717631833479323944583835616042046747","12713533224713702620572061555868239494560543672613943047779079905883794270793","15335431588644804698232638554832153707521179263496428095244719330764160979536","16972338882045649714960232935724128881358002139149662161855864918611719193447","20510265683377915239031331609931077634777511282902061740535762044318011447054","14348591232319171989710953381320670528467798633079274942581439677296902359507","7268761067249240551039469436291066141493626057753839932909829536129404405943","11177503563612935234878370475564044265033655526751198478229137454476060257389","20518306225043379063486161411895415905822729807964259472068843201645131954257","17274735491667046764616117425484985780921016176546365036792978392889983447275","3422727355178567490283294271244869036734587792776225423412684863858585667355","16361499482646211891495144643544799199439460048105681752590733351645896563991","9831378251659910502475468716900359141926459444308789377882824537354952704571","610751981717624005026256857476647225087205352593680510310135048655409805665","1274705802853698530896831887960868150413512303073765020858441284767481108557","12911573265070499437820407902233678187536367292819490176599490719474506679709","838780343058487840022597119049399265615305670097910639521946026305859537822","21886817593090220196061836652905990482772534345601206284920261819623544068569","13045057626386605209435393764744146030789888964374754365611177028824591744466","6872197446001880821713864607137207074245510844558962930055703063293109109677","9851117414973500062343684294511405799095673206164177441983808850858510638197","10356153918708276096440724514334813427938372190784074162287576232344370795144","5422236224208691735064222120059315321102696977576093626421991175019644275419","9270939530192661239044458014881210314222813499613547255416257255885663545705","17875006811148349666757764655667275519374986324184686591199872639841653267451","14223311161352757642768299768200066774808435309343986292557601348729896785348","15426232126866833911689462701146039651872381668257636712453957459186675608824","7341609890003755608731719926354383413086148334559783936923856681083371751858","2522916755395592528799997935331603289350745805903534350854142361512185858526","7975672719323847188584994034813755253910739379403210188890471743868304156385","10361152088869789372664667844034575270433189615534296913541908638779984022220","12565165574657902894308498356020741523059341649671415591209990377145546349749","8751927430299691834222222528273367980786855265571692230466656313501870515928","3782747889242504906539232417313404774472163523681147906451826831235080368272","2357908358798385925981298822139313965517778558204913007219318504379373437268","18858304770874740039984686448203470834562578493921595648210975754608317345623","7675993016512283682207173403605941444327148756612111199564173985331381488683","18818890453076413887523765231615383836499382990172339300581405948672279661939","20252144571549047445847058871179203700989782831670248309822846431530401883720","1548099034248382487438231907714050431020571588355663997785662562789965803980","16804474097957695744497077255787193298059334569168351136160606040471620694477","19508191667931806758288226550226059879657814340243709578088346681152392462495","1728719999167062338488031868382015025692441998348761079303220639921123256253","3604348649226051022337575722529270125804601416032976114063695533907383376063","10603799316068953108041964397928911876756607480893951394891306679070664686941","11648836007515467240952473614276607091898134725313122196877249156490523356027","20304987071409008531291607394096634487514970541849677970364964525409317001703","16887097190060385275598534531462546504328245264471846147005445996927829539625","3866748619116340790322227095657732028265396618488150952705187965765394142344","2338553626517986088379244573542094345133876349395153534676872066555319122659","2989903198038977576699565058449844165648971727702772542926261896668111017225","14278108812091993370081347429490097324884501265196936847107187781917283188596","11380653571214536036495190297205289870093439158653307679146162820611556102008","10728370069888852342064543039072884588207288307463842575342439018507973749875","6397015059973528659997355436100884860480194279234476207371274262619351989712","541153916915028861555802627075793763065968288425448237372538721080483579866","18703944686825210001777887304396928822416474276215979439014172442048460507918","14758294058966360999395530764869560471829375974872409340898445816910150933642","16526931650578182231679662261327171662688393688603926959024262791659875401297","602976647786763241606729968150119992779405527249465670521719980888114456911","18058348521510457484238468261675615616734549390787035210695832199652030799290","3408352310769542203249747633896333727677518788800695461819894477600392750387","13813696926749566428491595164396687786753780912143355428869363417663150103299","19226110628051298554688993880923837902732997396390909485477580979796568268253","1751416741656305902722022764840854257058950958650470467036624232208612663135","14273497410104557864925816124947236175101464480860485988459705747849145681216","17015769229295700838532275937420211087470832686975726393205562687498866290956","14317743544567964828895913664482783398948360705243772246269021084945454695426","1163710387996022107448633858536432008182893204461095765258858907535290527398","1157472141102273214560586147623465021722506106484968954764968896766765161328","11681638321160186580228856179688445951029310816905220272006101003142657558151","7819383141229404988917287897793820336725988282324748328500126584790204946216","4951737109128262717496808639553648804593962078862416064602914582392219323452","3442536812713619147824039056757226293704728452919903288417441857326983315172","10972029915673903790920684428014880528769637778570023451906625828019451706493","14773388161979847043531770832479609075984091647516302841116078929938077685390","6832011488895261587794164577700291580520309532692302077020376875264467715555","17143902297385696174135078846256591193632419203064831489933616909690183265289","17963799875997102172022690183795592375198545029882913008170902194968455818572","18877959338292270131211824401179673216317987726501062994411176561346079618062","14358101523035386382208062475555490310717442823564620083001831011989304676139","15796568151681791272753262366429731017034321762865614705556398537444716949893","13594857027304532283889325823930658134430393819837961037773389277784045884187","12136189727726413275229170388027187858694486236901282556934338668968776031849","1878632778304231028304727355487330626473470046303885272219164588770349458891","16873156099807728926852233664688168784075341453512083976642291718576315890258","11888191400576547298317080753543279148265645791517177796081641411013662826267","12210018620533033404291042202232857902072819731256915890812287001012514424820","2720995111620673475976904476404847046702162392875915718272984382599949577930","15740015006700066587650738996931848298647799054109075680819419326780689301412","18792314519811779877573893617497033030062705897791012092700956142509339219587","4533063041836045489675809767596619288203889485091241212692263726853545243001","20087279194440392445388020521232352321771796905350016545006792036125962969008","7662598580271470898701419629406835755452899820387556478370304330574127888110","2044322434996628951886285591950247795571711833625611674952208584770381736486","9298086345190166002533620311111572062855266053987387718138964764033420577753","899023757360740488398947202266024685219176491069483977212238341721384465909","20010267753246295660761776949157831033584594444801325360922807083432616388000","4450168704469888293988828437399020403079513401850888103443449346484211800937","14818763657168994501241419792426650382460802911500420715192462379889014218887","17499922386950534814980392095212646829833012336949589738217695906642893333161","4725703200623869934067110781096149110080128914289809281524369625038851276728","21835965127088232500387522593299395557327989607714564030101094338431057597467","5820797066449247361552221309787436085379889805203375090244078627730164212530","10690618433287001275009978059717247672897362692985112411393484683451942079152","6042827480936488655202996967650552195596171412588631273445587685915755805839","2124979120726636017099604334751505752148470044032645004013782814693996776755","5330435275056975088743051229223220800904435190882376049131249876689777155160","10124640773832184137904971182012863119485346620571202390914900093461027458298","4792024075244123098429550700645522059707473361886941368732914916479154714143","19199265391861538037180779666995909618497861428521118501466940732045803109056","4847826399302624775401994843815425199296930699401308990787135212735355431038","6407450376417859266449821859393770958635892367401690415325194496013043677136","1826395464858704884123218795787675583917701212492065945897042270085201498824","15238350515275529718536633219359365300853538429543725551430697362918415181074","21884720716136022005919093587710286615177807981683063472262896460904606628205","11689623546966353939670252259858789076351178209866822513410564961318335022311","7012794711375761331676943528254022381176901806276543398707129348614811953364","7180386038316110601441275181186218169286243634048902624801201568432593598141","13992917683661928463383695371898592624570240528944920013143005531297360192342","20034382193406507934708640117013118683945312285636692120801926999004026442192","14938652037071147313292164890053271808218189916901397934979103168334918558363","6648656337341126044962186909579051464159388727291296359968541322347995250420","12687003636792713485597279951140994909100599482079709621716948174519718796052","5108026212737931447624617494967304196499275147503023686887173141950819456829","13237879168621780799452013770046455143623364293054791609245436247351123437547","4341628653085149506528562773616721450933762016986791665663158769077061948538","2872050032952832698964730829903028920310787582321093426023746057532106397812","1367067391257975331756935824189631175172150708192657401957557819332219873827","2510908003064509602380389482004083587572613328572081988132878417052528058870","7084003845943087385716519398984211467638527143523438844810938260869100814307","21021470589871879755146279959973770415620667125847333514170945742003965711484","18375929337749007201709778590417087272057251219761079367326499808386163199502","3165201527196484602864016786637760443866722821135007004482670717537305516789","16717649565776057036320806132383209226780464215331716681516324418665003576180","20084295757088902108975491392002149988322839073620040409242765620165003006690","19241439593234676080041039883677491849402159269654950325486169959046767303641","4275910305427071218515830496145381854241709860849136935348204612634119544809","12898354034815273049223090812634413302174170749584845355813712153571284519914","1832136847875618967387144179529385178062929371405576686128489060593804295801","6069947755267812432913347261315755057349276133831784919354196155981254082646","11766183173827664081811296117089138123797414603598518127011517445259099898091","3993663602157055910018053040318139873694801305099748688074646613364745456069","15977276649214691975175801642730396873722756384246035320089179093520841000256","20303338735673445164192456383185100079100313199924244751665084177273928289523","20078019286098604448173211316407882189295460838424433108031089458601795603798","3307945001378206345398846558075581322286376391921099092518022108700861563718","21251247831852952153335635921612511638716100986041125503837495470248973341708","16246658361510148897664309243464380229567944126043953870011393349640538010692","1780654817260938957384325125461246845814503286839545932803113565621260161576","18710920936002511033230033673354693186030823806023934261043809330225688019647","9909111894805078760429022088296773927960051970891988461264950755997874666368","4345705541817674840760552109695955140943188102322798018969285864074427755164","4218015441219662255997165544650931566353829817981176787648891923654028187504","14312948242537810365234703004108012126182512780396291296729098565955837200965","295429846515676001104835276665049934394487183477715755147863239617239603688","15662344495653911375885561867591476367861074324822203271697194851167934401197","4793902408684290068019571137097387781094250811250560723390621410227755625428","4917605387106365671936349402138022267056891394874514471401018603057541394966","12993315137821697215971205486742231731559446527233973456459030184764267833130","16524985806030765353574471797740141094531695570270767498985348130558921348427","17013745813130281919891782917152585107471370145883327936054547011802523582182","17100361367645562641951805935367684861196104993797463923886759602641481183803","18833494072617086391597832039235402246961190856658717439789773239549364133295","20157866969311886681148400462214545913907226429163925709394672179635388896518","239609839853616379785377333442787354361568308011318294445268661600284057373","12020614379209217917047110972341532122216802896668712785859434794471240569360","1248739678507170190094138204517434142149054474900589856533653488451999142610","347915422993469780317591223477066986796955479205331632188505297615283578389","7999351262004511546770814747439380767590917178796919996885684840970542675481","20967594534594815486207550915474044087229684419402104901430196899850653362067","12899121896433082785388065281401431678366644722544051956929985724649596205064","18983588687933404065713078913700781650024901175649432230763486533515462594521","10766551589014395287410716892733848848003231068450440677265375421579008245609","20169652396045174249228895132866242783042168925415971892597182614884452884464","8957813983054350321796051550969191364715748771015789590569930810320606596431","9643155271414084161531721957806730069165955979114015273977651814640128472366","14700897093031440778526140571254449874936272810108988470714238171786681228615","14253815871028211364121586455534782624539734061148936548728775279097248553246","12623686528624702687438004549592639102850653340068344303348073426554835546383","10887499024511455665783360424280990671057735891551733295390571273395259237282","16792183329149820420875049780284492322598361840397896565294020303662868308403","9761704149743627159698957629672578406325922760477174888401254285722061841549","12931048515074471565571865161878351893082622778237083696666972505231964577505","15634847659877970105363072070507485783478919227149202058826464081071643773101","2906908506833041965320370496001711113060506302861350052429818849770038069678","8699899202483882769321195990250850850577555890082198906596960575592479589201","42373252218515653405393706267826997457994495485868519711417565290528955998","13298926901628935863638570113103068562843821480959781806957648334812991282309","11340495629472361531751136493827214341448466196267950757968881545938240013043","4410162973634101037164287543635784419735236595410876302496731409711464203560","6770504591846631067009674695263383781064304620185766583378598703662090659608","803268033919858655611811794309731920699017330011910045611157093721121626734","12911506200920624526864882942275121636127997230823935902940985092979574078964","17918643324157271778766566567889948352259699059171047284794326313189880774701","7009959043684140466581557454305689161448928833856327927307997281234391362846","13608676044229669503858530637021492044621349605932764029187667136233188902261","8469042229294487154908793664586203937411909612880073031669159370098423984545","6503765897633991782175459954225585422528890847227322728737944812623475852139","9715672328228477028203852818176561465039698179069163699650993321831992888477","17660990464121635097256814738911507903541707401612095639122186321774484595557","14804081443437546771116013793618853310717593234517633753124568696591221419786","6724218330718468523063558898686833457277735121312680344450184429142318815032","11402319676983861046390626662653884449314993741931036168486829754142513828259","16169080210743684844396699122536061698227435085322952297967432264699685757856","7675907879276133953708522162728651878121131686921572128914246808579870005917","4230211911914155476612752596599592280759202092722649006427735130558128219337","19994913083264981050872215776005351950306358251618357787279433070487904484823","14226987613623192001061092270841034855848619059750529499586599879686324456714","7045706519369812325556555256874783203298277170448306853617215815294968449904","2062849677144799356514567881687217598261884486125775155904626936404918986032","17601920854716323001594362511208188462850993131871853150842482389118606277711","3114106057124321155037877509199474249372783266108754138849102106650508205535","15465747930743984970223812683747855883693317069587253229201455749955846107163","3334494231965751270647811534096470335132564873859376879858935312105589711885","9823807746394349345368616975004290248806613677673994895815373421919965602266","5400271608648346754918607312792816605467323464770476391129036476619221125765","11770821436383451310596048403074829165521108637308954395370893718334054277368","20773403632811810296516343407006579798380994788000675726989846280765214549663","19605822286773678860331719553999804483779045012091324038328721032301094265056","7506448280816146246231851040199126517175663891590862860617123356646005555345","18126684419189656267813215765438780356938370095844302451607818952534708829765","13515823872008853824996025558859393212682839451413033376269220015533372008124","11462818572865227301821439771555025107926322021541096417968595142068838678265","387527620292599706620064005572533814830769480236179918610678629811523562236","21160096138473093258283714457499392397390620540060924570049011188639238085803","4354453094935226486359014408208016656075153446280746499510554516975950297130","1149854953378540661435822397775744272093475010171290951176022231193252054454","4886874912923569255211212213751909431336552875722832209717634183141312835459","8121417973301734978350814829063219763930505331511762446382376103512670333855","10397108991421661604545471702024443403572229499221138846385420184468156248436","135592906362394068721135816280006619658575717043549038357198542574796191751","12470986481443840884498861270893844690324714017774615057320249066166810815131","20711627617123608281465397514094515604912076289675946973464843147332653924743","19936523306637884947878303702523543831272475518000646601478891393886307224894","6610180504156263317235179434459908562313719468361106154297126173324848499090","2835947021190105212771241626312472117135141182807194884209080228417103438754","14991719226605127306441066466338764291641727399261080758950782642427317493566","3224955852105064561373076563380816036656741761437324050875349423939116643826","17986913328344175363997927083146937336279613526299537730298828188126021779067","14956620466071915113707982931908833123655918488965732670821007021323695567331","8273230426812750549513268262802322378227809250991622030042205458961448559361","12864204175590457893253605551535554300512181117280069428500328714508946474596","3856747252245224166966728227308235343017242206197065871162867092702777748228","5064589380721614521620432648404726474344877858870050645117028128155890472157","17855084468176511297023651008689325974304699449897905618704009760228510867305","10592444459552152581761051586259401938596901225175489278318737616663685510540","6169879685391435858857691820131996505378957223607348917145825765418631880515","8113562783193356344318894437081098186897299591291373320406057303483148742065","21628375570977952288299958796859480513666871363598101523098963887399205929440","2134865132164751654161455518567670919392897747989349525945201224885061887279","19429744046477844402907598398585600388537641557514304476273967618904065097380","10334858431682540793324733752716409902705019287129525537434622640519791881859","20898874645461345309219443195795227020136151785431504665854615665433057656034","21758936607630402529195006563442025392002485085893619072588368460552039953657","6658767622080579375212702865672225131694187648045659659491640133964821409021","15945223109716077813697724894481072775767923725068384358165128896271885377185","7493788631544480359761010651349903811913677854977183784782164761002795001013","1591024071527067760292081143937838601494082577069154394739643638063130650847","12619889692927553488927714722921271374516407458651205979102849490293579412361","13544060486316243019111794113241157741412385204952590231446494676348138782433","2887841573309108233158231126323775418060676605741555803818569347039364806120","11036140437691913600589642507367009124853186496834027940452890971374326749644","13459410879887221125208802127286738607219329998144370393597168847217136752309","14138446918712369212513361591812053045469401743940362364452295564191258618071","15139494420493896979465536772798315576661564585009975882149046490426430943584","2680555907002159385123500413017583949180278933797222446966030933631028615392","15487403918133177809118221011827665334424270640296194179725020674859862311148","2253081490999534554527627661799880907320552244022209364079259863144124063204","11191815691711088981123145114348502329836887875342463606897269964110132026398","5109339959165897707712238280262288223228410318321865982030257634795492624075","4228877585466284848766757257455261240377460433844128878744325273017336623330","362614992692373963638010157404324560163964919752108254809408812315768440698","5497792324848207351089823477182027421661697005728339438037281493209918368532","18300280641113926020062358545714253222621042370181649338471915860636927514005","5165038560428976080842235638073800522486475602829240088348607001517236391108","2008091893886066583601032642095457476875986236627706624298412511701486682373","18855234687460732907670779566552575320366460980688149277845081203486429085196","13389943196844183901355127422435750731202929208969262430001608034764394210668","7021308455275082494090292683339579828621547308114648482192389995456759019483","6585222136111747436624886140691552835483743497794532311521040071922248443420","21715523680622751847043762670484689094478706333228979861445139700243365776594","13416504159545791441009914591308927615633686498715702676442432727915988269082","2248673097632858668765361179839205001457921928295571511512730199800584213625","8201617310205868515409198034710234660861203915866715605849930565273415152742","15680268660957381191262801077602444572267901505301952184208993099935462124810","16104837654487289387088073687347866178758228946202427776701306205624672792028","13684332979506205929903153264861964109520505064291381840093693876889335151993","14298782347976668524645278060067709431261037349301522981877578968571565556100","14146039703163289539879685125644412698975703808605016607740716155671097450434","11934833171060725907314404100396400102926313444214797514298446783806475079254","5914086988947997830012843744355360132724998743777726913294864331058879138715","10659686720196564899287303479729456926962280252284297382118982673601141180405","1692869277894986008249025777573665756719181333137351109659460920317143830734","11121687568974872103818642807085399340558431041449573582444977407542211264004","3501050053396506996742711102422431158646670397678002654123600295042244164171","14984319169585253070148527069125354016209833099403929166529971220165461080109","11039249245607138942408416774669487123603045223333515097649259364656805712742","2859932898082976799590321590558908799276823987835443387471293467877754277565","19478458481483880492508096426388037208182771578389243036459312837722364528292","12681295366282558699393012939095360477842070047616469520212796398808404284054","13010182377434613954012233404363979798719688181232968966240632263017157983618","16037260491735954899197790080305488568587224615297648089505787564736457655504","3774943811190403499690974560575281409833645236366071596666126241657610017452","21814452909632353471149869440665903500310360262001108752776562989491779018263","52072281042752561123298216211920776224842140069522348353471850133101459444","5393226600522078959309667664647807969543977428132923032121300709179500319576","2535335411461130857251786076113019736467112607101573495446575260857514915285","3223186631939230423000089008145326734853542787816950488463620916770299441548","7203210648731017372643394417187027255626158150779569672743304509771556031568","7365613311894109391567490056887433110920012927687918796539454353472662806193","14706919882948918903316502617047588031491849474605859994059009247259486020572","3455208500142568951439012515724503646898391143487306421264185506460408250399","6176697988969134956767325675724315996342279819575423735264769950348921409207","12951834853082027138974145617464147922857695533654628319949695487103738097783","21540266130478603719496842280607306809615541536701125437958624893911805143507","15841251123604012933249526821849462516847731497880691132669932653838678041593","18948683310275384847923387957211395414092251858762610439160163446326775365243","21295038317344811116316108726319045473711109917897691371510311266185853001380","9095729641247909707668520027352422462525417609968833674217396882088429011133","7748284092532915876871264327404847715957163892603821067089338023968276636762","15504838028731494447984781439562882212473223734774564943920587671282013892783","17710545040585682988241551019670248079649743911204771375834642632997788982222","10356848241091081418291575127603139858556280821909592538600302788565231776573","2135069867766629257670982448236296634454202981621983661012300557748557064120","17125626450944567520231005064919628723567428206918336867263540842196820837720","4339710247506255212189027358431803298527452960376838551044914736673354018926","6930242572932818307072016665941050027383664335148847099555399010971211803352","4540469819839984928572435092473380609832679284334795966063195919694411877587","16628353401446674199275380109941591337811739913828377380737794433676215960528","11535473251411739443035362528505534882481533559097828804136416323035986938254","19579697444869757236996156907979434468393725881854767726694937129865836699720","9122237435448224029760899946316303693350992158431420619823600405922536098176","14160660546759582304436411024155309006194269578272087613920265117044205512077","18077708722465603517949588398649463852351624681209651633613380178864514332020","6241268709545939837365635267975060746505512224966727723691581500981526218338","14888529711719706713295983706169954857641487121071161174594422218430859599969","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","16384","32768","65536","0","262144","524288","1048576","2097152","4194304","8388608","16777216","0","67108864","134217728","268435456","0","0","2147483648","4294967296","0","17179869184","34359738368","0","0","274877906944","549755813888","1099511627776","2199023255552","4398046511104","8796093022208","17592186044416","35184372088832","70368744177664","140737488355328","0","562949953421312","0","2251799813685248","0","9007199254740992","18014398509481984","36028797018963968","72057594037927936","0","288230376151711744","0","0","2305843009213693952","4611686018427387904","0","18446744073709551616","36893488147419103232","73786976294838206464","147573952589676412928","0","590295810358705651712","1180591620717411303424","2361183241434822606848","4722366482869645213696","0","0","37778931862957161709568","75557863725914323419136","0","0","604462909807314587353088","1208925819614629174706176","2417851639229258349412352","4835703278458516698824704","9671406556917033397649408","19342813113834066795298816","38685626227668133590597632","0","154742504910672534362390528","0","0","1237940039285380274899124224","2475880078570760549798248448","0","9903520314283042199192993792","19807040628566084398385987584","39614081257132168796771975168","79228162514264337593543950336","158456325028528675187087900672","316912650057057350374175801344","0","0","0","5070602400912917605986812821504","10141204801825835211973625643008","20282409603651670423947251286016","0","81129638414606681695789005144064","0","324518553658426726783156020576256","0","1298074214633706907132624082305024","2596148429267413814265248164610048","5192296858534827628530496329220096","0","20769187434139310514121985316880384","41538374868278621028243970633760768","83076749736557242056487941267521536","166153499473114484112975882535043072","0","664613997892457936451903530140172288","0","2658455991569831745807614120560689152","5316911983139663491615228241121378304","10633823966279326983230456482242756608","0","0","85070591730234615865843651857942052864","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","1","0","1","1","1","1","1","1","1","0","1","1","1","0","0","1","1","0","1","1","0","0","1","1","1","1","1","1","1","1","1","1","0","1","0","1","0","1","1","1","1","0","1","0","0","1","1","0","1","1","1","1","0","1","1","1","1","0","0","1","1","0","0","1","1","1","1","1","1","1","0","1","0","0","1","1","0","1","1","1","1","1","1","0","0","0","1","1","1","0","1","0","1","0","1","1","1","0","1","1","1","1","0","1","0","1","1","1","0","0","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","340282366920938463463374607431768211454","0","0","0","0","0","0","0","0","0","0","0","0","16384","32768","65536","0","262144","524288","1048576","2097152","4194304","8388608","16777216","0","67108864","134217728","268435456","0","0","2147483648","4294967296","0","17179869184","34359738368","0","0","274877906944","549755813888","1099511627776","2199023255552","4398046511104","8796093022208","17592186044416","35184372088832","70368744177664","140737488355328","0","562949953421312","0","2251799813685248","0","9007199254740992","18014398509481984","36028797018963968","72057594037927936","0","288230376151711744","0","0","2305843009213693952","4611686018427387904","0","18446744073709551616","36893488147419103232","73786976294838206464","147573952589676412928","0","590295810358705651712","1180591620717411303424","2361183241434822606848","4722366482869645213696","0","0","37778931862957161709568","75557863725914323419136","0","0","604462909807314587353088","1208925819614629174706176","2417851639229258349412352","4835703278458516698824704","9671406556917033397649408","19342813113834066795298816","38685626227668133590597632","0","154742504910672534362390528","0","0","1237940039285380274899124224","2475880078570760549798248448","0","9903520314283042199192993792","19807040628566084398385987584","39614081257132168796771975168","79228162514264337593543950336","158456325028528675187087900672","316912650057057350374175801344","0","0","0","5070602400912917605986812821504","10141204801825835211973625643008","20282409603651670423947251286016","0","81129638414606681695789005144064","0","324518553658426726783156020576256","0","1298074214633706907132624082305024","2596148429267413814265248164610048","5192296858534827628530496329220096","0","20769187434139310514121985316880384","41538374868278621028243970633760768","83076749736557242056487941267521536","166153499473114484112975882535043072","0","664613997892457936451903530140172288","0","2658455991569831745807614120560689152","5316911983139663491615228241121378304","10633823966279326983230456482242756608","0","0","85070591730234615865843651857942052864","0","1","1","1","1","1","1","1","1","1","1","1","1","1","0","1","1","0","1","1","1","1","1","1","1","0","1","1","1","0","0","1","1","0","1","1","0","0","1","1","1","1","1","1","1","1","1","1","0","1","0","1","0","1","1","1","1","0","1","0","0","1","1","0","1","1","1","1","0","1","1","1","1","0","0","1","1","0","0","1","1","1","1","1","1","1","0","1","0","0","1","1","0","1","1","1","1","1","1","0","0","0","1","1","1","0","1","0","1","0","1","1","1","0","1","1","1","1","0","1","0","1","1","1","0","0","1","1","0","0","0","0","0","0","1","1","1","1","0","0","0","0","0","3403282052539321372122021860745657553680346102370129270104818183970772517761","1","0","1","0","0","3966084645890315710559696097731071392208711270577602201535613204174857094254","1","0","1","0","1","0","1","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","0","0","1","0","0","0","1","0","0","0","1","0","0","0","0","1","0","0","0","0","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","16751074199471344286802035516092717228413021805857911221340709282829922649570","16607689897250896163839120369329143853138821982212506869796223602775242163908","6306670965815533610139978731151082260521747949859106157811737942199411096763","8230394042541507458651300722707802655073997691897399557296075563607891385931","9921340941556354371580059537039333469973209453102024699252654455316059290620","16798896597145667139496131042097011601219503268718208432881915127321311248865","10761622635138561113453616724326151200504548364659640959171019993528403053596","4201374595453568719536041091370119651099375260803977706482746783208488880305","9971587591474752610461421108018095077842562578014452361783151616467835435111","5516956972178305312309254917389099764623678730180225999630364134360264110082","15066785865404294422881557619360885995614121995592112712990143250762198336884","21755300202021669800310961644948292234097575522286241219994206014548021317507","44312224132391919278568080003847402581022440080536924033423180021727388015","17589524827975147485715615321649189469791625723245721893742228097834086947532","8719984869514470722047522645705044152404773497435222154684105742564180785917","12838432770668333832140112504623798777955855545564491234660602333126926294802","10962219331981126937794734082126576683795140107663121675442940913117472782171","11315763313939367564880085930200632291397536948843222126556649652575069224853","9490320164035243469515553845741859611832694165395589257142226352243136301303","14573213588623917823708851377700803537638194753660392663536665732379880810694","11957092005664205224141548929385856436673493267279705778466447868093190736829","2201153109770645202954444876374528386609966279164593010871872560011817397913","11082747672059648638492717211402437406817522242047530271849521934851141518229","20477546427784935443802032434219911124745095329100703429739367686725375043621","20413669078949764936443689287676556111623164824373754014432737811311226761753","12881136730064110218094313142501866107021596701447009682940537878392614463314","13227437990758291440620943688822553930025228016992494659907178847660023537124","16572644556309208037124906701824425475845839679912404017132481770297056142431","19207525364486005896906208137031026335360739161340583275343816203229308414622","13749935216854607186487641922071692492037890524402382020370477865659977471212","14305753616231100452668590820745059778506427001382290586975701645092921660548","765857276287722813531198419619164140070915902829725892404102530083930750063","17837831429010867898764848684310505000314798050293841430668793505708981358048","21265099592359165713925953648362407254559580913936166135963567928466675766562","9836732997058077094526466589020739322840803019139480203465858201631980200718","7950736069218471132276924429739021815862792210045959677128696849570697403704","4769271140055336949069111665742509949024134261124654997310716329224630277762","20393350587508813313089483176581445684689819238531002176517292760755869721350","38149718364286962749939608665460785683852940908425655353420799858383968080","294908462199902072876663185334271659283432370640074451060800538373960973112","15686183370543867546923411519048855269420334921977460677980634391907762285104","7739644896700310773878882243266703498955498777056626589614168707182557659069","8962053441358370892949398584321217001524120474906547766312555570245268276141","10485968530935240560535418413665896337924134365028112810521932629743032594567","10455176935063524730554996425761077284254888258693211809138770824018864886743","14115566565369486572031311310429302802089825334724609634263576446726737605806","20073124591363501366789760608831383241995767850640689122251701726731390338567","18044196147441334580548109144408355893452990965490068051314106336265811591526","11777763830067607118918986120012546064057341507222391327324648823238698980251","5076285475125881250450494722872064230965358749104743996583186222500686678935","9433671005987645330351463650157742363370796004102441907383343518108550265783","16007614664479860453771437441344953439396368135713518528960723657246075833228","3670983463941934079214226480204001841287142286161279531732782678406433460843","7046179718502550936980595924901442920616633571872416339261615305735715278602","17608692011920050118706235959991963886935386829021365964093748239332711649084","2996821855883838728759536316610792557284394221854997002429026293476701752866","1677231509722364930842177352080930133827209916580071048531613825027648977700","20514621385694392131023051208602786923531777062045824148198436025028161478292","18706232149332458956113227927382844148669824578035828945319576383268514596397","11536282866871845249336852725858083392404317076310198593892963050259371331649","20466198999255199834400800454553246058101307023747737024879595930133188864963","17213082575127239224295748117279913461834934345205651804512629361221712146029","19484671891372768411934382885285679105157644357942611948795072906049381809678","8503442112050525052228756834095001115345112944909240539866003384575979945546","1591002621123168604526593223171654111798901832992697089266968330710061317327","17926989791280931197506965049310631268713794343236183001990363712296100776267","9818426793010627181403113577980666147935770130277255691539405567600286312065","9942988821595010693836539395678956414086510769345202336272828286806505105690","11428337004946391003737882643329882420040707267209738526410651698195832612398","5246173256091330545722754324790141877812115594929637564770216594001202665291","9244678589481971155093167074568918052432648706230664195707777716588708425821","16484327628325306003364245414567032312084673791908596909706339237437400759774","15909549332391486405320400238323446874739232392980137232129556119929377881543","4605603680690078397409074258309278031489863163721440064230911400507819976731","11932390595676097724926919191547257683296828193773941999444763120344004292794","21261316293685003751543366541787086957146195861519918738279059420379259769912","21694342134861979785664822222441943407054500023420869221254046994410705539047","13455418065215420116004885303563860520053149691344937005371740002984186620259","21294895762334183277561199056622692153331598314844350195434334666176806203759","2298913285650149740197504916695862209035358355428627300724306426005525816892","6433628427964344837720421894751973624448162124243791938584892092692934497062","13980638727833468810299341230787216089256640947577023476618983231259366747402","16386989380774535566905941270495126370482370902137781001804268887369782038022","3779483885209758277783355831078003188483448889651898318713331166172699636659","13118689370009477102054967134335796733104690982621174244425832900274928932116","21445533669518956637854447045256826873132438263003600821648791482859243407079","5527331762329369159390944165620100309794622537826464839886395712108419580582","3982772412651522640643769699838411900841643087659996933180626455834078733729","8936887292441133154504378719580283709673438127834570894253255440130778560891","5689786437531621897454594927415077264858288108775631464102476970728285871609","6370104324738040905290397305607362815394997849284017671587890146354255852594","2562605975511809500373038481836128711166779361259424204015484454382469913903","8009939360434127939211330421690368857019489809160778015418598167076961485953","6207214611018146300599438189744645959242652217703597746064748175193260329591","16671090648797063256204148088217002774332376248497761795371610457828028740038","351920541540014679905588425887435163878844099034359672557071300875572975398","21058204412077323033815879298722170627087867902547775349664797410908803369974","14564771468858246038476497989063618180073537400380117152664301508245795360502","8272882885871254955349820427886161624704712655862030935537145720959792892274","6909321091395274276146501993203761280720491918442748432524267471458601993221","16580321413206363974123623814602922867712388513971038402753464758491015803565","843281673245380754722495246696808119685404475704137112513160388856240699325","10171659328829219575897640303524498462582095234092978615905848203599889269897","5280538311454636369301273025630273683522547291583648504386454238616356441491","16623616276068850220179897023862034811947741374757987914392112935677729609272","19853123512203259979603644963397956834690886149706076304732426191753395611491","955364103151966477697350532913523016231165744311492647080211628659701871391","20523715452656959031445477013594952421617762425683127800448733851153498579066","14293535687965811563014333045217822091100404926900397852150955930734852567984","4229676629734606989516536240720033922492197958317336524425272064033701231219","18901397382211336164186387913666617814943452495137150951121911861411601103404","14375484255313188168372529479566281408768539401520374973084172059374055840588","19545798768864804171001454865226638660566831783618291009839659068600532212741","12755887933202061913161194217993793715343250197162556258497417497956440593759","8686513030225489957270848893530798775170299685233413267611917464195410557211","5880638904324026409005302950304740533498165011473478865956931412853188357431","7354389273252412391825625422266284022910347922206550320847139744353922366698","7016237351930429912019063230239434124147424389329878468689095040305536565141","5620972089534918638996272688507749091836816762473512644976785924112182176059","20413835273287925719552648605928582957864781808563858039878873559057433938566","11990352873652827398677739409877583255209694499432033562422373811536346570826","11452116767092430632569157126777353261344552818614541313334131497235795274616","13608939909527726586864284167014632459539109382363764498491490357609068357661","19699932497952889669632765576298327295926506735107495829131115663202263356665","15251682785177950917305927011901953367908953567062062215661324049886315524643","20988180365782566790010352815052502389134630736373419926172473693216627536947","7836720310496068244885024104589560761724497802627198466406853572609572183783","8038431537840849850004264549778072928837344446259802659731886224882799164652","2029425248168573578041930579769085260473443689520829116695151637114698378179","14014583048054989975362949820515352457455051497561401705089149965549711007728","10229910039445142063805930610858936389530402461507274678278419431360560041672","18414356640728818641083254061594699427771424933767295240543780118943302353557","14385363499980792320572694168709347498076611078827580165565397937806655843600","17574003158941143569210345425977586387561202207597212418442851062273722778557","5020456663555107491462633901410150293006360280142421036527516054973198917775","20127051627292194507636525988626707066686058957062478135802400381125882156129","20897939964842847172746478761928317623445313616223360444114601438540638075545","4768232651051213290835674042772040002316324578972496328572277887954854608839","17294503583995767475859552377185515589678216285313681942711238998872988167848","14649373813471851945320940299605201018392088399780709659677169234196157620092","8780430624549024727143069679282190039037099678026940232022642526296513616209","19379993141583360349219631444991584062781246208701481966534256751049466960129","15269077688496085659395433896981555224821074535243453599961761864702497339408","5391117857262141392878145098178984215824926943428788260915775917501212609214","7908721172934600956268520018234658066175251014237965624123564978124712802362","7874341505294103336917508655326356231557632351889805234868207045464424182027","14717357719887344869049716594829853959760329970432750252010555421746110830753","3360261399639751762974090530765480555630239123582758200815794978493014885586","9821826804670125425236325658293385777765305748666267887783525427098280556536","17204157028222666500796136628457984571840002100152982240371475388423494849033","5542034861058754185477946991198906162285361355155642038893943908835601160038","3683282103686594289964931403051831385975351230136466856931777064461047733401","15224685775706801324889650391158158261567751841767486050473559405133656352415","14348433140170281101901970266749278653067511062361719376252531576778262236894","11561449914623393122383031050474623941756403082164093879442389899363860513713","18245049492685205869746697260817503761252527622829228814032380169292346673291","17504537922258513011905565287240975149408627350242698790215780212356407248353","1087354866746490755068915240098723302841828156617728293233180699369449595227","6969042902258472469564623163041902613727762494563269234625798939473325810728","19781365794109169059730125820268469324655465578674107499591208131269329184831","19197720132445970072674786026374184753486316604335554230360798533521780079016","8985344752484815619908870528789201141893762847988902632020302966238055069038","6180566225714340566468063951590163252160515912634301758875151812293005995707","7886321650473731550722613550286337225983696528924522412475864179994945154038","1770329309062897291917236776676146963443813646104822628855480965002025402285","2672465549015492990178140878418702146106524780378266324725481883753805796676","9510938473472052600166974310685487461419214920988365840433371267775469202990","8763681409640408511774703386738865004873345690332395131153581718682846235816","5086184804083998594076230176630486989159676487216439626195171443687145611476","3444180739794824231911901354495926100580172575807360182050883799956253686124","19959585945609801580752975266494803324672866918723431810286213367913961455037","3606118653399557978017653345353488674231963545742074503030228140079743128217","9802232062091145454674219420688213272404224274164975947158499021341809478056","14753794963203840670689834131757653710719077219319396758581277854471817219976","10293226843634758194510263296936027709342071523680880184525420653949365085783","12718806094899532360102670898087743973296203292888146926436211859399441382266","19720557165108559470587427734825443980468432595646509009288337442868761549209","11247390882107475711483619058539054176238525726311758865073230404212341552278","15462509904958076555211488611104595950707114200311503866776513865723341096539","19234760699502123418676309783515052697057041962626575225401675314728972650121","17158261287148866987348692179057818719922602171392849314284493894658836825746","15365955529424977292357623764025498682706496161142382817837522205572607763997","20052202240009352261741122369957280265238958638450496105242649976727648471603","423357909332235822254079656696928158152503031658093508494175901331804543226","15922263825513783744583412081948095026829380051325974037117331160273000625665","21608880876703158853582170966053859080506692816444303830697579496441737611292","14979302256083977877181830607642975718819599820161889327504074019516836927010","21610296362574306626509926774800244990065257145430368375419027492142934708446","17595716914975830356499498547074024086847211138200645735802384039048171815958","14654668119168864815561684444214692059474181246705559164525875353227464689053","7909137102568989978451284135464888703672144746229046026942372688255268205369","14812130315252358082784842576665409029101165747479648757059927502821594119043","19533381322254969505860938447353219937929507327716748825809064520539543455254","9403823843450196420799337565010549178259435908490320872849582783166065168282","10464241134417201329419510220104949346527274013274592882563416495012556125132","9301345819661937440725860028779312914339790525885214274554275091844623535968","11291714547013661830332569817711684505569815478772306103530109513027459828741","16566712313878755327910485384356179345881280692463454520410105624337016288883","9857254387540706281892224858708177932493833333242386469874406815551456850784","13235323444556237974521531300791907080635475702604350856205423158574376182435","6837328857570342508089383303046615979341710677796715226424263996563411126589","9567191971502453137803265066675229742925788197509550723183106561667775516503","13589520733675005345281874911032983354954922397198387703860557678089764021921","104175365654736775178218750541299505009591406942062749114421467907345346042","590163818614270202706155060786980081635141531931653658533034907216652933183","11630836030911095078662233290280414853525666587225870019070111475894870557937","3143463001554546949388574227992235144909572072667494575339346439434777710214","17210674657600746455132196643290051407032499980059412222084673652147666262244","19558381360647054135714232130709740454803497350056006816389092459633204536306","16883239974151654186618501613502254189172694896294262882551553603289459762207","8413661446386279271250258046703699372256294759176301597443419113141652463386","17926420509822647309653607861708033860852594098459584436645268742667896895558","19824925766389886827250259916041015429740610094218960702010388823681796598372","21569124030016608055974854740419962472020200788866623348222538997741654501795","14232424310854472834356314082148076539296957249563473004688613559676523926509","15193615028121862883292210509489791742567273312408676269715846648108564480216","4571863685585148023589373809103548979799867639025504561868195666694987162026","6206779924996162752046602034743078689551092997538497731303258570990576183904","13551354910729069809580067054835607774880530108885793285331679609370500875004","9899791381683262402504188099370233883995824403872277909479896171174493425427","19676726055572810021222964113026140207269355942060367353065169172081559784672","842852341267559061264418048500907996345833086685212080144270808293582991176","2374896551530407137601201042234188834144647343362619212010730934843698743587","7541169441788393045940373474338091879780271077778260807857446771010926024429","11136936778745143751630950186644088027953411966465838448171145474563978816093","10104692900610618203101067220992674388402050900350351026933004613495030125962","9448067584436414960964337190111983737612300524270450316697483521460203416821","8950186827869639604172647121100447815900277491673507364868135313567370094566","13506425119440201268368754328546416032565667481881592632895304755531522876713","8980168571796290804339343950808891004720242960395088290536220280570423270238","18170882696616761010489613056792567852402646771641587111297862995908970291284","17964914132412404677996740117340161470056406021410685722116447488755963163990","4999254529824068728272549382468024522346083624068028557197677399460354032302","19863286783514673257602438096028698340633489355546438580505275806712888618797","8597501472019579693110022148133358484974050449265021769883471363830981070438","15745697387452707443485700990949175358831586983137296283366195319537908003288","13137385666206357557612894624274538332141042254638811649741671391041335368023","17489444249761129472685381315022721658390849238308934118982939182052647535064","7817235089381823509145374360042255112726388997005284838446772709175711038688","14266303771668205536382691342596456410509199091923271798848518821724529136059","3636857805719964585971325322044663359458065705759731491721865284507973354939","15992868605947752108489235540799285759772965578817149705232162327368620329585","1335686142273152709365597717137409998821127623205060581051968539417021206504","6433290482925748613794540660743040431650259914794007152150057855153874666944","1361143257838811133926634806224247744517655450729374562521500236431831031476","18225681286815161411121137668234617452312048153276117017888242519394843989168","19843309075203033669895762315323851121116692526905833370940041980425774744571","15228011749951502720507138380119493145011628580619540200408217541371854380957","19619902256720178830677177598316556548461566595041053642017410940299852914682","511045245706260898110690359652263936223759289411819460157040898756960539462","7391377516085877772042712644814217270885890613808054711267621194257918442112","5891519591265284241203789998585637602270159400314233944803142442234700250863","2205432830627138420924593517638591617200352501757865976823844451062848337881","3222440233016699218240995056566298768106156979610420431469004199306974269103","8738332104312050387266272441686236247554960069301415997266286065690829290396","1551797112498648676836888480223639601740456286931633071547538018561520713544","1533866262507880248780245731190869299029017561560482981975068249985135371067","3996384786620540375232033672025195552610224229344345117985645908694200761016","16595891332727724151340175555326766529692459983213346368706615677339339240020","11523034561885962354991131363057963624098255825893327869682794018887379424097","21037920806606953471816674932313658324079485042735787472381615025003112432904","19591615019774495060998741485447874831723014393820542494077889189192102109031","9121850391530996471222427082549856324643713020999728941399437734853739817153","6849010089591794160862035089126940514820060634802302095512422500449021208898","21803985179639408855590213016678692901492191793853596659193109444086006378119","13364642672122219159126189111975702569548137252134210263160227802926124348078","16905269331135488328605515318505661227228474740876565481132283687997616028861","11264009642168330483857233256241513200490483139661004283535705073110138982890","5332394467645666696623235864746879605637402312414276534976098157513611666542","17925301199630013346486151991337546692422339664903952576083922784335751134079","11900184416418670354965232151665958518848952270854151924870211669630781631223","15562113593580216239006544427542674838265849698433044757495991364465187405884","3806304128817128192424875722779633391243742313942202394988632791379590507084","4657338409098638664678315846850627043185036888996779552648742031908099581588","15813005888849962389158961584970173978097218996267117171684509555319301477411","17056578011328104553093128374315470853531917998809681241413306393882725625198","6430589065893485715796702045939612847939363293990681504299985210155618562864","7514454699643127952791367885323645723388779246392186109883710722291187240497","7826937063653788873418085859562133984976335940156012117355343731656725674347","2225655582871701716469716244290307217751235918380896133272619906562931866876","11565133364312756310075478066314302953761772900026528225403220752431976340190","18232452026689223969965820968016739847092564814758593382764078404018135510023","1358358355244320152796507416231954843591920800744392329047477141132664693794","2597241426605278043922861599217180508175107341199392281858695037638300643180","17674515264858256312450756598079170929596539962153597882812281349637224943254","3143421480716849445957518543992988300614287126569006297241763368177602468592","15933437847230001720929677769855858682918236257655835442179345528393419564882","6733106851709743508924920069771721545927217564131624545573720030931843427107","3903499693696421946995265411390118861168305725858301760878023455038512768658","14433872132790123652832156520925166553485145595432897200832458531093296216884","7097617002748651760063122634260707663385999924497452509206216049717006887614","9196893673129829898318166605040425641260075795136163048833535143632480806738","19140091520550535179093575244921354004409797700450072348027875067724407780771","13815362122463786845354711610276132099779552968788780241453140843664912171289","132329010991610972419019365039613190472336282083377290824055198940312830513","2049181411991933045514610569712374231531845833062261528528564288748902967619","9942692693883003669846738387378238020204191501223875692726715738542841527104","6283754404754969631949771092743204859616073374053464616082489188503158661340","13531881648062996717630837244804254055395580039994975987100053481374744485749","0","0","0","0","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","16751074199471344286802035516092717228413021805857911221340709282829922649570","16607689897250896163839120369329143853138821982212506869796223602775242163908","6306670965815533610139978731151082260521747949859106157811737942199411096763","8230394042541507458651300722707802655073997691897399557296075563607891385931","9921340941556354371580059537039333469973209453102024699252654455316059290620","16798896597145667139496131042097011601219503268718208432881915127321311248865","10761622635138561113453616724326151200504548364659640959171019993528403053596","4201374595453568719536041091370119651099375260803977706482746783208488880305","9971587591474752610461421108018095077842562578014452361783151616467835435111","5516956972178305312309254917389099764623678730180225999630364134360264110082","15066785865404294422881557619360885995614121995592112712990143250762198336884","21755300202021669800310961644948292234097575522286241219994206014548021317507","44312224132391919278568080003847402581022440080536924033423180021727388015","17589524827975147485715615321649189469791625723245721893742228097834086947532","8719984869514470722047522645705044152404773497435222154684105742564180785917","12838432770668333832140112504623798777955855545564491234660602333126926294802","10962219331981126937794734082126576683795140107663121675442940913117472782171","11315763313939367564880085930200632291397536948843222126556649652575069224853","9490320164035243469515553845741859611832694165395589257142226352243136301303","14573213588623917823708851377700803537638194753660392663536665732379880810694","11957092005664205224141548929385856436673493267279705778466447868093190736829","2201153109770645202954444876374528386609966279164593010871872560011817397913","11082747672059648638492717211402437406817522242047530271849521934851141518229","20477546427784935443802032434219911124745095329100703429739367686725375043621","20413669078949764936443689287676556111623164824373754014432737811311226761753","12881136730064110218094313142501866107021596701447009682940537878392614463314","13227437990758291440620943688822553930025228016992494659907178847660023537124","16572644556309208037124906701824425475845839679912404017132481770297056142431","19207525364486005896906208137031026335360739161340583275343816203229308414622","13749935216854607186487641922071692492037890524402382020370477865659977471212","14305753616231100452668590820745059778506427001382290586975701645092921660548","765857276287722813531198419619164140070915902829725892404102530083930750063","17837831429010867898764848684310505000314798050293841430668793505708981358048","21265099592359165713925953648362407254559580913936166135963567928466675766562","9836732997058077094526466589020739322840803019139480203465858201631980200718","7950736069218471132276924429739021815862792210045959677128696849570697403704","4769271140055336949069111665742509949024134261124654997310716329224630277762","20393350587508813313089483176581445684689819238531002176517292760755869721350","38149718364286962749939608665460785683852940908425655353420799858383968080","294908462199902072876663185334271659283432370640074451060800538373960973112","15686183370543867546923411519048855269420334921977460677980634391907762285104","7739644896700310773878882243266703498955498777056626589614168707182557659069","8962053441358370892949398584321217001524120474906547766312555570245268276141","10485968530935240560535418413665896337924134365028112810521932629743032594567","10455176935063524730554996425761077284254888258693211809138770824018864886743","14115566565369486572031311310429302802089825334724609634263576446726737605806","20073124591363501366789760608831383241995767850640689122251701726731390338567","18044196147441334580548109144408355893452990965490068051314106336265811591526","11777763830067607118918986120012546064057341507222391327324648823238698980251","5076285475125881250450494722872064230965358749104743996583186222500686678935","9433671005987645330351463650157742363370796004102441907383343518108550265783","16007614664479860453771437441344953439396368135713518528960723657246075833228","3670983463941934079214226480204001841287142286161279531732782678406433460843","7046179718502550936980595924901442920616633571872416339261615305735715278602","17608692011920050118706235959991963886935386829021365964093748239332711649084","2996821855883838728759536316610792557284394221854997002429026293476701752866","1677231509722364930842177352080930133827209916580071048531613825027648977700","20514621385694392131023051208602786923531777062045824148198436025028161478292","18706232149332458956113227927382844148669824578035828945319576383268514596397","11536282866871845249336852725858083392404317076310198593892963050259371331649","20466198999255199834400800454553246058101307023747737024879595930133188864963","17213082575127239224295748117279913461834934345205651804512629361221712146029","19484671891372768411934382885285679105157644357942611948795072906049381809678","8503442112050525052228756834095001115345112944909240539866003384575979945546","1591002621123168604526593223171654111798901832992697089266968330710061317327","17926989791280931197506965049310631268713794343236183001990363712296100776267","9818426793010627181403113577980666147935770130277255691539405567600286312065","9942988821595010693836539395678956414086510769345202336272828286806505105690","11428337004946391003737882643329882420040707267209738526410651698195832612398","5246173256091330545722754324790141877812115594929637564770216594001202665291","9244678589481971155093167074568918052432648706230664195707777716588708425821","16484327628325306003364245414567032312084673791908596909706339237437400759774","15909549332391486405320400238323446874739232392980137232129556119929377881543","4605603680690078397409074258309278031489863163721440064230911400507819976731","11932390595676097724926919191547257683296828193773941999444763120344004292794","21261316293685003751543366541787086957146195861519918738279059420379259769912","21694342134861979785664822222441943407054500023420869221254046994410705539047","13455418065215420116004885303563860520053149691344937005371740002984186620259","21294895762334183277561199056622692153331598314844350195434334666176806203759","2298913285650149740197504916695862209035358355428627300724306426005525816892","6433628427964344837720421894751973624448162124243791938584892092692934497062","13980638727833468810299341230787216089256640947577023476618983231259366747402","16386989380774535566905941270495126370482370902137781001804268887369782038022","3779483885209758277783355831078003188483448889651898318713331166172699636659","13118689370009477102054967134335796733104690982621174244425832900274928932116","21445533669518956637854447045256826873132438263003600821648791482859243407079","5527331762329369159390944165620100309794622537826464839886395712108419580582","3982772412651522640643769699838411900841643087659996933180626455834078733729","8936887292441133154504378719580283709673438127834570894253255440130778560891","5689786437531621897454594927415077264858288108775631464102476970728285871609","6370104324738040905290397305607362815394997849284017671587890146354255852594","2562605975511809500373038481836128711166779361259424204015484454382469913903","8009939360434127939211330421690368857019489809160778015418598167076961485953","6207214611018146300599438189744645959242652217703597746064748175193260329591","16671090648797063256204148088217002774332376248497761795371610457828028740038","351920541540014679905588425887435163878844099034359672557071300875572975398","21058204412077323033815879298722170627087867902547775349664797410908803369974","14564771468858246038476497989063618180073537400380117152664301508245795360502","8272882885871254955349820427886161624704712655862030935537145720959792892274","6909321091395274276146501993203761280720491918442748432524267471458601993221","16580321413206363974123623814602922867712388513971038402753464758491015803565","843281673245380754722495246696808119685404475704137112513160388856240699325","10171659328829219575897640303524498462582095234092978615905848203599889269897","5280538311454636369301273025630273683522547291583648504386454238616356441491","16623616276068850220179897023862034811947741374757987914392112935677729609272","19853123512203259979603644963397956834690886149706076304732426191753395611491","955364103151966477697350532913523016231165744311492647080211628659701871391","20523715452656959031445477013594952421617762425683127800448733851153498579066","14293535687965811563014333045217822091100404926900397852150955930734852567984","4229676629734606989516536240720033922492197958317336524425272064033701231219","18901397382211336164186387913666617814943452495137150951121911861411601103404","14375484255313188168372529479566281408768539401520374973084172059374055840588","19545798768864804171001454865226638660566831783618291009839659068600532212741","12755887933202061913161194217993793715343250197162556258497417497956440593759","8686513030225489957270848893530798775170299685233413267611917464195410557211","5880638904324026409005302950304740533498165011473478865956931412853188357431","7354389273252412391825625422266284022910347922206550320847139744353922366698","7016237351930429912019063230239434124147424389329878468689095040305536565141","5620972089534918638996272688507749091836816762473512644976785924112182176059","20413835273287925719552648605928582957864781808563858039878873559057433938566","11990352873652827398677739409877583255209694499432033562422373811536346570826","11452116767092430632569157126777353261344552818614541313334131497235795274616","13608939909527726586864284167014632459539109382363764498491490357609068357661","19699932497952889669632765576298327295926506735107495829131115663202263356665","15251682785177950917305927011901953367908953567062062215661324049886315524643","20988180365782566790010352815052502389134630736373419926172473693216627536947","7836720310496068244885024104589560761724497802627198466406853572609572183783","8038431537840849850004264549778072928837344446259802659731886224882799164652","2029425248168573578041930579769085260473443689520829116695151637114698378179","14014583048054989975362949820515352457455051497561401705089149965549711007728","10229910039445142063805930610858936389530402461507274678278419431360560041672","18414356640728818641083254061594699427771424933767295240543780118943302353557","14385363499980792320572694168709347498076611078827580165565397937806655843600","17574003158941143569210345425977586387561202207597212418442851062273722778557","5020456663555107491462633901410150293006360280142421036527516054973198917775","20127051627292194507636525988626707066686058957062478135802400381125882156129","20897939964842847172746478761928317623445313616223360444114601438540638075545","4768232651051213290835674042772040002316324578972496328572277887954854608839","17294503583995767475859552377185515589678216285313681942711238998872988167848","14649373813471851945320940299605201018392088399780709659677169234196157620092","8780430624549024727143069679282190039037099678026940232022642526296513616209","19379993141583360349219631444991584062781246208701481966534256751049466960129","15269077688496085659395433896981555224821074535243453599961761864702497339408","5391117857262141392878145098178984215824926943428788260915775917501212609214","7908721172934600956268520018234658066175251014237965624123564978124712802362","7874341505294103336917508655326356231557632351889805234868207045464424182027","14717357719887344869049716594829853959760329970432750252010555421746110830753","3360261399639751762974090530765480555630239123582758200815794978493014885586","9821826804670125425236325658293385777765305748666267887783525427098280556536","17204157028222666500796136628457984571840002100152982240371475388423494849033","5542034861058754185477946991198906162285361355155642038893943908835601160038","3683282103686594289964931403051831385975351230136466856931777064461047733401","15224685775706801324889650391158158261567751841767486050473559405133656352415","14348433140170281101901970266749278653067511062361719376252531576778262236894","11561449914623393122383031050474623941756403082164093879442389899363860513713","18245049492685205869746697260817503761252527622829228814032380169292346673291","17504537922258513011905565287240975149408627350242698790215780212356407248353","1087354866746490755068915240098723302841828156617728293233180699369449595227","6969042902258472469564623163041902613727762494563269234625798939473325810728","19781365794109169059730125820268469324655465578674107499591208131269329184831","19197720132445970072674786026374184753486316604335554230360798533521780079016","8985344752484815619908870528789201141893762847988902632020302966238055069038","6180566225714340566468063951590163252160515912634301758875151812293005995707","7886321650473731550722613550286337225983696528924522412475864179994945154038","1770329309062897291917236776676146963443813646104822628855480965002025402285","2672465549015492990178140878418702146106524780378266324725481883753805796676","9510938473472052600166974310685487461419214920988365840433371267775469202990","8763681409640408511774703386738865004873345690332395131153581718682846235816","5086184804083998594076230176630486989159676487216439626195171443687145611476","3444180739794824231911901354495926100580172575807360182050883799956253686124","19959585945609801580752975266494803324672866918723431810286213367913961455037","3606118653399557978017653345353488674231963545742074503030228140079743128217","9802232062091145454674219420688213272404224274164975947158499021341809478056","14753794963203840670689834131757653710719077219319396758581277854471817219976","10293226843634758194510263296936027709342071523680880184525420653949365085783","12718806094899532360102670898087743973296203292888146926436211859399441382266","19720557165108559470587427734825443980468432595646509009288337442868761549209","11247390882107475711483619058539054176238525726311758865073230404212341552278","15462509904958076555211488611104595950707114200311503866776513865723341096539","19234760699502123418676309783515052697057041962626575225401675314728972650121","17158261287148866987348692179057818719922602171392849314284493894658836825746","15365955529424977292357623764025498682706496161142382817837522205572607763997","20052202240009352261741122369957280265238958638450496105242649976727648471603","423357909332235822254079656696928158152503031658093508494175901331804543226","15922263825513783744583412081948095026829380051325974037117331160273000625665","21608880876703158853582170966053859080506692816444303830697579496441737611292","14979302256083977877181830607642975718819599820161889327504074019516836927010","21610296362574306626509926774800244990065257145430368375419027492142934708446","17595716914975830356499498547074024086847211138200645735802384039048171815958","14654668119168864815561684444214692059474181246705559164525875353227464689053","7909137102568989978451284135464888703672144746229046026942372688255268205369","14812130315252358082784842576665409029101165747479648757059927502821594119043","19533381322254969505860938447353219937929507327716748825809064520539543455254","9403823843450196420799337565010549178259435908490320872849582783166065168282","10464241134417201329419510220104949346527274013274592882563416495012556125132","9301345819661937440725860028779312914339790525885214274554275091844623535968","11291714547013661830332569817711684505569815478772306103530109513027459828741","16566712313878755327910485384356179345881280692463454520410105624337016288883","9857254387540706281892224858708177932493833333242386469874406815551456850784","13235323444556237974521531300791907080635475702604350856205423158574376182435","6837328857570342508089383303046615979341710677796715226424263996563411126589","9567191971502453137803265066675229742925788197509550723183106561667775516503","13589520733675005345281874911032983354954922397198387703860557678089764021921","104175365654736775178218750541299505009591406942062749114421467907345346042","590163818614270202706155060786980081635141531931653658533034907216652933183","11630836030911095078662233290280414853525666587225870019070111475894870557937","3143463001554546949388574227992235144909572072667494575339346439434777710214","17210674657600746455132196643290051407032499980059412222084673652147666262244","19558381360647054135714232130709740454803497350056006816389092459633204536306","16883239974151654186618501613502254189172694896294262882551553603289459762207","8413661446386279271250258046703699372256294759176301597443419113141652463386","17926420509822647309653607861708033860852594098459584436645268742667896895558","19824925766389886827250259916041015429740610094218960702010388823681796598372","21569124030016608055974854740419962472020200788866623348222538997741654501795","14232424310854472834356314082148076539296957249563473004688613559676523926509","15193615028121862883292210509489791742567273312408676269715846648108564480216","4571863685585148023589373809103548979799867639025504561868195666694987162026","6206779924996162752046602034743078689551092997538497731303258570990576183904","13551354910729069809580067054835607774880530108885793285331679609370500875004","9899791381683262402504188099370233883995824403872277909479896171174493425427","19676726055572810021222964113026140207269355942060367353065169172081559784672","842852341267559061264418048500907996345833086685212080144270808293582991176","2374896551530407137601201042234188834144647343362619212010730934843698743587","7541169441788393045940373474338091879780271077778260807857446771010926024429","11136936778745143751630950186644088027953411966465838448171145474563978816093","10104692900610618203101067220992674388402050900350351026933004613495030125962","9448067584436414960964337190111983737612300524270450316697483521460203416821","8950186827869639604172647121100447815900277491673507364868135313567370094566","13506425119440201268368754328546416032565667481881592632895304755531522876713","8980168571796290804339343950808891004720242960395088290536220280570423270238","18170882696616761010489613056792567852402646771641587111297862995908970291284","17964914132412404677996740117340161470056406021410685722116447488755963163990","4999254529824068728272549382468024522346083624068028557197677399460354032302","19863286783514673257602438096028698340633489355546438580505275806712888618797","8597501472019579693110022148133358484974050449265021769883471363830981070438","15745697387452707443485700990949175358831586983137296283366195319537908003288","13137385666206357557612894624274538332141042254638811649741671391041335368023","17489444249761129472685381315022721658390849238308934118982939182052647535064","7817235089381823509145374360042255112726388997005284838446772709175711038688","14266303771668205536382691342596456410509199091923271798848518821724529136059","3636857805719964585971325322044663359458065705759731491721865284507973354939","15992868605947752108489235540799285759772965578817149705232162327368620329585","1335686142273152709365597717137409998821127623205060581051968539417021206504","6433290482925748613794540660743040431650259914794007152150057855153874666944","1361143257838811133926634806224247744517655450729374562521500236431831031476","18225681286815161411121137668234617452312048153276117017888242519394843989168","19843309075203033669895762315323851121116692526905833370940041980425774744571","15228011749951502720507138380119493145011628580619540200408217541371854380957","19619902256720178830677177598316556548461566595041053642017410940299852914682","511045245706260898110690359652263936223759289411819460157040898756960539462","7391377516085877772042712644814217270885890613808054711267621194257918442112","5891519591265284241203789998585637602270159400314233944803142442234700250863","2205432830627138420924593517638591617200352501757865976823844451062848337881","3222440233016699218240995056566298768106156979610420431469004199306974269103","8738332104312050387266272441686236247554960069301415997266286065690829290396","1551797112498648676836888480223639601740456286931633071547538018561520713544","1533866262507880248780245731190869299029017561560482981975068249985135371067","3996384786620540375232033672025195552610224229344345117985645908694200761016","16595891332727724151340175555326766529692459983213346368706615677339339240020","11523034561885962354991131363057963624098255825893327869682794018887379424097","21037920806606953471816674932313658324079485042735787472381615025003112432904","19591615019774495060998741485447874831723014393820542494077889189192102109031","9121850391530996471222427082549856324643713020999728941399437734853739817153","6849010089591794160862035089126940514820060634802302095512422500449021208898","21803985179639408855590213016678692901492191793853596659193109444086006378119","13364642672122219159126189111975702569548137252134210263160227802926124348078","16905269331135488328605515318505661227228474740876565481132283687997616028861","11264009642168330483857233256241513200490483139661004283535705073110138982890","5332394467645666696623235864746879605637402312414276534976098157513611666542","17925301199630013346486151991337546692422339664903952576083922784335751134079","11900184416418670354965232151665958518848952270854151924870211669630781631223","15562113593580216239006544427542674838265849698433044757495991364465187405884","3806304128817128192424875722779633391243742313942202394988632791379590507084","4657338409098638664678315846850627043185036888996779552648742031908099581588","15813005888849962389158961584970173978097218996267117171684509555319301477411","17056578011328104553093128374315470853531917998809681241413306393882725625198","6430589065893485715796702045939612847939363293990681504299985210155618562864","7514454699643127952791367885323645723388779246392186109883710722291187240497","7826937063653788873418085859562133984976335940156012117355343731656725674347","2225655582871701716469716244290307217751235918380896133272619906562931866876","11565133364312756310075478066314302953761772900026528225403220752431976340190","18232452026689223969965820968016739847092564814758593382764078404018135510023","1358358355244320152796507416231954843591920800744392329047477141132664693794","2597241426605278043922861599217180508175107341199392281858695037638300643180","17674515264858256312450756598079170929596539962153597882812281349637224943254","3143421480716849445957518543992988300614287126569006297241763368177602468592","15933437847230001720929677769855858682918236257655835442179345528393419564882","6733106851709743508924920069771721545927217564131624545573720030931843427107","3903499693696421946995265411390118861168305725858301760878023455038512768658","14433872132790123652832156520925166553485145595432897200832458531093296216884","7097617002748651760063122634260707663385999924497452509206216049717006887614","9196893673129829898318166605040425641260075795136163048833535143632480806738","19140091520550535179093575244921354004409797700450072348027875067724407780771","13815362122463786845354711610276132099779552968788780241453140843664912171289","132329010991610972419019365039613190472336282083377290824055198940312830513","2049181411991933045514610569712374231531845833062261528528564288748902967619","9942692693883003669846738387378238020204191501223875692726715738542841527104","6283754404754969631949771092743204859616073374053464616082489188503158661340","13531881648062996717630837244804254055395580039994975987100053481374744485749","0","0","0","0","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","16751074199471344286802035516092717228413021805857911221340709282829922649570","16607689897250896163839120369329143853138821982212506869796223602775242163908","6306670965815533610139978731151082260521747949859106157811737942199411096763","8230394042541507458651300722707802655073997691897399557296075563607891385931","9921340941556354371580059537039333469973209453102024699252654455316059290620","16798896597145667139496131042097011601219503268718208432881915127321311248865","10761622635138561113453616724326151200504548364659640959171019993528403053596","4201374595453568719536041091370119651099375260803977706482746783208488880305","9971587591474752610461421108018095077842562578014452361783151616467835435111","5516956972178305312309254917389099764623678730180225999630364134360264110082","15066785865404294422881557619360885995614121995592112712990143250762198336884","21755300202021669800310961644948292234097575522286241219994206014548021317507","44312224132391919278568080003847402581022440080536924033423180021727388015","17589524827975147485715615321649189469791625723245721893742228097834086947532","8719984869514470722047522645705044152404773497435222154684105742564180785917","12838432770668333832140112504623798777955855545564491234660602333126926294802","10962219331981126937794734082126576683795140107663121675442940913117472782171","11315763313939367564880085930200632291397536948843222126556649652575069224853","9490320164035243469515553845741859611832694165395589257142226352243136301303","14573213588623917823708851377700803537638194753660392663536665732379880810694","11957092005664205224141548929385856436673493267279705778466447868093190736829","2201153109770645202954444876374528386609966279164593010871872560011817397913","11082747672059648638492717211402437406817522242047530271849521934851141518229","20477546427784935443802032434219911124745095329100703429739367686725375043621","20413669078949764936443689287676556111623164824373754014432737811311226761753","12881136730064110218094313142501866107021596701447009682940537878392614463314","13227437990758291440620943688822553930025228016992494659907178847660023537124","16572644556309208037124906701824425475845839679912404017132481770297056142431","19207525364486005896906208137031026335360739161340583275343816203229308414622","13749935216854607186487641922071692492037890524402382020370477865659977471212","14305753616231100452668590820745059778506427001382290586975701645092921660548","765857276287722813531198419619164140070915902829725892404102530083930750063","17837831429010867898764848684310505000314798050293841430668793505708981358048","21265099592359165713925953648362407254559580913936166135963567928466675766562","9836732997058077094526466589020739322840803019139480203465858201631980200718","7950736069218471132276924429739021815862792210045959677128696849570697403704","4769271140055336949069111665742509949024134261124654997310716329224630277762","20393350587508813313089483176581445684689819238531002176517292760755869721350","38149718364286962749939608665460785683852940908425655353420799858383968080","294908462199902072876663185334271659283432370640074451060800538373960973112","15686183370543867546923411519048855269420334921977460677980634391907762285104","7739644896700310773878882243266703498955498777056626589614168707182557659069","8962053441358370892949398584321217001524120474906547766312555570245268276141","10485968530935240560535418413665896337924134365028112810521932629743032594567","10455176935063524730554996425761077284254888258693211809138770824018864886743","14115566565369486572031311310429302802089825334724609634263576446726737605806","20073124591363501366789760608831383241995767850640689122251701726731390338567","18044196147441334580548109144408355893452990965490068051314106336265811591526","11777763830067607118918986120012546064057341507222391327324648823238698980251","5076285475125881250450494722872064230965358749104743996583186222500686678935","9433671005987645330351463650157742363370796004102441907383343518108550265783","16007614664479860453771437441344953439396368135713518528960723657246075833228","3670983463941934079214226480204001841287142286161279531732782678406433460843","7046179718502550936980595924901442920616633571872416339261615305735715278602","17608692011920050118706235959991963886935386829021365964093748239332711649084","2996821855883838728759536316610792557284394221854997002429026293476701752866","1677231509722364930842177352080930133827209916580071048531613825027648977700","20514621385694392131023051208602786923531777062045824148198436025028161478292","18706232149332458956113227927382844148669824578035828945319576383268514596397","11536282866871845249336852725858083392404317076310198593892963050259371331649","20466198999255199834400800454553246058101307023747737024879595930133188864963","17213082575127239224295748117279913461834934345205651804512629361221712146029","19484671891372768411934382885285679105157644357942611948795072906049381809678","8503442112050525052228756834095001115345112944909240539866003384575979945546","1591002621123168604526593223171654111798901832992697089266968330710061317327","17926989791280931197506965049310631268713794343236183001990363712296100776267","9818426793010627181403113577980666147935770130277255691539405567600286312065","9942988821595010693836539395678956414086510769345202336272828286806505105690","11428337004946391003737882643329882420040707267209738526410651698195832612398","5246173256091330545722754324790141877812115594929637564770216594001202665291","9244678589481971155093167074568918052432648706230664195707777716588708425821","16484327628325306003364245414567032312084673791908596909706339237437400759774","15909549332391486405320400238323446874739232392980137232129556119929377881543","4605603680690078397409074258309278031489863163721440064230911400507819976731","11932390595676097724926919191547257683296828193773941999444763120344004292794","21261316293685003751543366541787086957146195861519918738279059420379259769912","21694342134861979785664822222441943407054500023420869221254046994410705539047","13455418065215420116004885303563860520053149691344937005371740002984186620259","21294895762334183277561199056622692153331598314844350195434334666176806203759","2298913285650149740197504916695862209035358355428627300724306426005525816892","6433628427964344837720421894751973624448162124243791938584892092692934497062","13980638727833468810299341230787216089256640947577023476618983231259366747402","16386989380774535566905941270495126370482370902137781001804268887369782038022","3779483885209758277783355831078003188483448889651898318713331166172699636659","13118689370009477102054967134335796733104690982621174244425832900274928932116","21445533669518956637854447045256826873132438263003600821648791482859243407079","5527331762329369159390944165620100309794622537826464839886395712108419580582","3982772412651522640643769699838411900841643087659996933180626455834078733729","8936887292441133154504378719580283709673438127834570894253255440130778560891","5689786437531621897454594927415077264858288108775631464102476970728285871609","6370104324738040905290397305607362815394997849284017671587890146354255852594","2562605975511809500373038481836128711166779361259424204015484454382469913903","8009939360434127939211330421690368857019489809160778015418598167076961485953","6207214611018146300599438189744645959242652217703597746064748175193260329591","16671090648797063256204148088217002774332376248497761795371610457828028740038","351920541540014679905588425887435163878844099034359672557071300875572975398","21058204412077323033815879298722170627087867902547775349664797410908803369974","14564771468858246038476497989063618180073537400380117152664301508245795360502","8272882885871254955349820427886161624704712655862030935537145720959792892274","6909321091395274276146501993203761280720491918442748432524267471458601993221","16580321413206363974123623814602922867712388513971038402753464758491015803565","843281673245380754722495246696808119685404475704137112513160388856240699325","10171659328829219575897640303524498462582095234092978615905848203599889269897","5280538311454636369301273025630273683522547291583648504386454238616356441491","16623616276068850220179897023862034811947741374757987914392112935677729609272","19853123512203259979603644963397956834690886149706076304732426191753395611491","955364103151966477697350532913523016231165744311492647080211628659701871391","20523715452656959031445477013594952421617762425683127800448733851153498579066","14293535687965811563014333045217822091100404926900397852150955930734852567984","4229676629734606989516536240720033922492197958317336524425272064033701231219","18901397382211336164186387913666617814943452495137150951121911861411601103404","14375484255313188168372529479566281408768539401520374973084172059374055840588","19545798768864804171001454865226638660566831783618291009839659068600532212741","12755887933202061913161194217993793715343250197162556258497417497956440593759","8686513030225489957270848893530798775170299685233413267611917464195410557211","5880638904324026409005302950304740533498165011473478865956931412853188357431","7354389273252412391825625422266284022910347922206550320847139744353922366698","7016237351930429912019063230239434124147424389329878468689095040305536565141","5620972089534918638996272688507749091836816762473512644976785924112182176059","20413835273287925719552648605928582957864781808563858039878873559057433938566","11990352873652827398677739409877583255209694499432033562422373811536346570826","11452116767092430632569157126777353261344552818614541313334131497235795274616","13608939909527726586864284167014632459539109382363764498491490357609068357661","19699932497952889669632765576298327295926506735107495829131115663202263356665","15251682785177950917305927011901953367908953567062062215661324049886315524643","20988180365782566790010352815052502389134630736373419926172473693216627536947","7836720310496068244885024104589560761724497802627198466406853572609572183783","8038431537840849850004264549778072928837344446259802659731886224882799164652","2029425248168573578041930579769085260473443689520829116695151637114698378179","14014583048054989975362949820515352457455051497561401705089149965549711007728","10229910039445142063805930610858936389530402461507274678278419431360560041672","18414356640728818641083254061594699427771424933767295240543780118943302353557","14385363499980792320572694168709347498076611078827580165565397937806655843600","17574003158941143569210345425977586387561202207597212418442851062273722778557","5020456663555107491462633901410150293006360280142421036527516054973198917775","20127051627292194507636525988626707066686058957062478135802400381125882156129","20897939964842847172746478761928317623445313616223360444114601438540638075545","4768232651051213290835674042772040002316324578972496328572277887954854608839","17294503583995767475859552377185515589678216285313681942711238998872988167848","14649373813471851945320940299605201018392088399780709659677169234196157620092","8780430624549024727143069679282190039037099678026940232022642526296513616209","19379993141583360349219631444991584062781246208701481966534256751049466960129","15269077688496085659395433896981555224821074535243453599961761864702497339408","5391117857262141392878145098178984215824926943428788260915775917501212609214","7908721172934600956268520018234658066175251014237965624123564978124712802362","7874341505294103336917508655326356231557632351889805234868207045464424182027","14717357719887344869049716594829853959760329970432750252010555421746110830753","3360261399639751762974090530765480555630239123582758200815794978493014885586","9821826804670125425236325658293385777765305748666267887783525427098280556536","17204157028222666500796136628457984571840002100152982240371475388423494849033","5542034861058754185477946991198906162285361355155642038893943908835601160038","3683282103686594289964931403051831385975351230136466856931777064461047733401","15224685775706801324889650391158158261567751841767486050473559405133656352415","14348433140170281101901970266749278653067511062361719376252531576778262236894","11561449914623393122383031050474623941756403082164093879442389899363860513713","18245049492685205869746697260817503761252527622829228814032380169292346673291","17504537922258513011905565287240975149408627350242698790215780212356407248353","1087354866746490755068915240098723302841828156617728293233180699369449595227","6969042902258472469564623163041902613727762494563269234625798939473325810728","19781365794109169059730125820268469324655465578674107499591208131269329184831","19197720132445970072674786026374184753486316604335554230360798533521780079016","8985344752484815619908870528789201141893762847988902632020302966238055069038","6180566225714340566468063951590163252160515912634301758875151812293005995707","7886321650473731550722613550286337225983696528924522412475864179994945154038","1770329309062897291917236776676146963443813646104822628855480965002025402285","2672465549015492990178140878418702146106524780378266324725481883753805796676","9510938473472052600166974310685487461419214920988365840433371267775469202990","8763681409640408511774703386738865004873345690332395131153581718682846235816","5086184804083998594076230176630486989159676487216439626195171443687145611476","3444180739794824231911901354495926100580172575807360182050883799956253686124","19959585945609801580752975266494803324672866918723431810286213367913961455037","3606118653399557978017653345353488674231963545742074503030228140079743128217","9802232062091145454674219420688213272404224274164975947158499021341809478056","14753794963203840670689834131757653710719077219319396758581277854471817219976","10293226843634758194510263296936027709342071523680880184525420653949365085783","12718806094899532360102670898087743973296203292888146926436211859399441382266","19720557165108559470587427734825443980468432595646509009288337442868761549209","11247390882107475711483619058539054176238525726311758865073230404212341552278","15462509904958076555211488611104595950707114200311503866776513865723341096539","19234760699502123418676309783515052697057041962626575225401675314728972650121","17158261287148866987348692179057818719922602171392849314284493894658836825746","15365955529424977292357623764025498682706496161142382817837522205572607763997","20052202240009352261741122369957280265238958638450496105242649976727648471603","423357909332235822254079656696928158152503031658093508494175901331804543226","15922263825513783744583412081948095026829380051325974037117331160273000625665","21608880876703158853582170966053859080506692816444303830697579496441737611292","14979302256083977877181830607642975718819599820161889327504074019516836927010","21610296362574306626509926774800244990065257145430368375419027492142934708446","17595716914975830356499498547074024086847211138200645735802384039048171815958","14654668119168864815561684444214692059474181246705559164525875353227464689053","7909137102568989978451284135464888703672144746229046026942372688255268205369","14812130315252358082784842576665409029101165747479648757059927502821594119043","19533381322254969505860938447353219937929507327716748825809064520539543455254","9403823843450196420799337565010549178259435908490320872849582783166065168282","10464241134417201329419510220104949346527274013274592882563416495012556125132","9301345819661937440725860028779312914339790525885214274554275091844623535968","11291714547013661830332569817711684505569815478772306103530109513027459828741","16566712313878755327910485384356179345881280692463454520410105624337016288883","9857254387540706281892224858708177932493833333242386469874406815551456850784","13235323444556237974521531300791907080635475702604350856205423158574376182435","6837328857570342508089383303046615979341710677796715226424263996563411126589","9567191971502453137803265066675229742925788197509550723183106561667775516503","13589520733675005345281874911032983354954922397198387703860557678089764021921","104175365654736775178218750541299505009591406942062749114421467907345346042","590163818614270202706155060786980081635141531931653658533034907216652933183","11630836030911095078662233290280414853525666587225870019070111475894870557937","3143463001554546949388574227992235144909572072667494575339346439434777710214","17210674657600746455132196643290051407032499980059412222084673652147666262244","19558381360647054135714232130709740454803497350056006816389092459633204536306","16883239974151654186618501613502254189172694896294262882551553603289459762207","8413661446386279271250258046703699372256294759176301597443419113141652463386","17926420509822647309653607861708033860852594098459584436645268742667896895558","19824925766389886827250259916041015429740610094218960702010388823681796598372","21569124030016608055974854740419962472020200788866623348222538997741654501795","14232424310854472834356314082148076539296957249563473004688613559676523926509","15193615028121862883292210509489791742567273312408676269715846648108564480216","4571863685585148023589373809103548979799867639025504561868195666694987162026","6206779924996162752046602034743078689551092997538497731303258570990576183904","13551354910729069809580067054835607774880530108885793285331679609370500875004","9899791381683262402504188099370233883995824403872277909479896171174493425427","19676726055572810021222964113026140207269355942060367353065169172081559784672","842852341267559061264418048500907996345833086685212080144270808293582991176","2374896551530407137601201042234188834144647343362619212010730934843698743587","7541169441788393045940373474338091879780271077778260807857446771010926024429","11136936778745143751630950186644088027953411966465838448171145474563978816093","10104692900610618203101067220992674388402050900350351026933004613495030125962","9448067584436414960964337190111983737612300524270450316697483521460203416821","8950186827869639604172647121100447815900277491673507364868135313567370094566","13506425119440201268368754328546416032565667481881592632895304755531522876713","8980168571796290804339343950808891004720242960395088290536220280570423270238","18170882696616761010489613056792567852402646771641587111297862995908970291284","17964914132412404677996740117340161470056406021410685722116447488755963163990","4999254529824068728272549382468024522346083624068028557197677399460354032302","19863286783514673257602438096028698340633489355546438580505275806712888618797","8597501472019579693110022148133358484974050449265021769883471363830981070438","15745697387452707443485700990949175358831586983137296283366195319537908003288","13137385666206357557612894624274538332141042254638811649741671391041335368023","17489444249761129472685381315022721658390849238308934118982939182052647535064","7817235089381823509145374360042255112726388997005284838446772709175711038688","14266303771668205536382691342596456410509199091923271798848518821724529136059","3636857805719964585971325322044663359458065705759731491721865284507973354939","15992868605947752108489235540799285759772965578817149705232162327368620329585","1335686142273152709365597717137409998821127623205060581051968539417021206504","6433290482925748613794540660743040431650259914794007152150057855153874666944","1361143257838811133926634806224247744517655450729374562521500236431831031476","18225681286815161411121137668234617452312048153276117017888242519394843989168","19843309075203033669895762315323851121116692526905833370940041980425774744571","15228011749951502720507138380119493145011628580619540200408217541371854380957","19619902256720178830677177598316556548461566595041053642017410940299852914682","511045245706260898110690359652263936223759289411819460157040898756960539462","7391377516085877772042712644814217270885890613808054711267621194257918442112","5891519591265284241203789998585637602270159400314233944803142442234700250863","2205432830627138420924593517638591617200352501757865976823844451062848337881","3222440233016699218240995056566298768106156979610420431469004199306974269103","8738332104312050387266272441686236247554960069301415997266286065690829290396","1551797112498648676836888480223639601740456286931633071547538018561520713544","1533866262507880248780245731190869299029017561560482981975068249985135371067","3996384786620540375232033672025195552610224229344345117985645908694200761016","16595891332727724151340175555326766529692459983213346368706615677339339240020","11523034561885962354991131363057963624098255825893327869682794018887379424097","21037920806606953471816674932313658324079485042735787472381615025003112432904","19591615019774495060998741485447874831723014393820542494077889189192102109031","9121850391530996471222427082549856324643713020999728941399437734853739817153","6849010089591794160862035089126940514820060634802302095512422500449021208898","21803985179639408855590213016678692901492191793853596659193109444086006378119","13364642672122219159126189111975702569548137252134210263160227802926124348078","16905269331135488328605515318505661227228474740876565481132283687997616028861","11264009642168330483857233256241513200490483139661004283535705073110138982890","5332394467645666696623235864746879605637402312414276534976098157513611666542","17925301199630013346486151991337546692422339664903952576083922784335751134079","11900184416418670354965232151665958518848952270854151924870211669630781631223","15562113593580216239006544427542674838265849698433044757495991364465187405884","3806304128817128192424875722779633391243742313942202394988632791379590507084","4657338409098638664678315846850627043185036888996779552648742031908099581588","15813005888849962389158961584970173978097218996267117171684509555319301477411","17056578011328104553093128374315470853531917998809681241413306393882725625198","6430589065893485715796702045939612847939363293990681504299985210155618562864","7514454699643127952791367885323645723388779246392186109883710722291187240497","7826937063653788873418085859562133984976335940156012117355343731656725674347","2225655582871701716469716244290307217751235918380896133272619906562931866876","11565133364312756310075478066314302953761772900026528225403220752431976340190","18232452026689223969965820968016739847092564814758593382764078404018135510023","1358358355244320152796507416231954843591920800744392329047477141132664693794","2597241426605278043922861599217180508175107341199392281858695037638300643180","17674515264858256312450756598079170929596539962153597882812281349637224943254","3143421480716849445957518543992988300614287126569006297241763368177602468592","15933437847230001720929677769855858682918236257655835442179345528393419564882","6733106851709743508924920069771721545927217564131624545573720030931843427107","3903499693696421946995265411390118861168305725858301760878023455038512768658","14433872132790123652832156520925166553485145595432897200832458531093296216884","7097617002748651760063122634260707663385999924497452509206216049717006887614","9196893673129829898318166605040425641260075795136163048833535143632480806738","19140091520550535179093575244921354004409797700450072348027875067724407780771","13815362122463786845354711610276132099779552968788780241453140843664912171289","132329010991610972419019365039613190472336282083377290824055198940312830513","2049181411991933045514610569712374231531845833062261528528564288748902967619","9942692693883003669846738387378238020204191501223875692726715738542841527104","6283754404754969631949771092743204859616073374053464616082489188503158661340","13531881648062996717630837244804254055395580039994975987100053481374744485749","0","0","0","0","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","16751074199471344286802035516092717228413021805857911221340709282829922649570","16607689897250896163839120369329143853138821982212506869796223602775242163908","6306670965815533610139978731151082260521747949859106157811737942199411096763","8230394042541507458651300722707802655073997691897399557296075563607891385931","9921340941556354371580059537039333469973209453102024699252654455316059290620","16798896597145667139496131042097011601219503268718208432881915127321311248865","10761622635138561113453616724326151200504548364659640959171019993528403053596","4201374595453568719536041091370119651099375260803977706482746783208488880305","9971587591474752610461421108018095077842562578014452361783151616467835435111","5516956972178305312309254917389099764623678730180225999630364134360264110082","15066785865404294422881557619360885995614121995592112712990143250762198336884","21755300202021669800310961644948292234097575522286241219994206014548021317507","44312224132391919278568080003847402581022440080536924033423180021727388015","17589524827975147485715615321649189469791625723245721893742228097834086947532","8719984869514470722047522645705044152404773497435222154684105742564180785917","12838432770668333832140112504623798777955855545564491234660602333126926294802","10962219331981126937794734082126576683795140107663121675442940913117472782171","11315763313939367564880085930200632291397536948843222126556649652575069224853","9490320164035243469515553845741859611832694165395589257142226352243136301303","14573213588623917823708851377700803537638194753660392663536665732379880810694","11957092005664205224141548929385856436673493267279705778466447868093190736829","2201153109770645202954444876374528386609966279164593010871872560011817397913","11082747672059648638492717211402437406817522242047530271849521934851141518229","20477546427784935443802032434219911124745095329100703429739367686725375043621","20413669078949764936443689287676556111623164824373754014432737811311226761753","12881136730064110218094313142501866107021596701447009682940537878392614463314","13227437990758291440620943688822553930025228016992494659907178847660023537124","16572644556309208037124906701824425475845839679912404017132481770297056142431","19207525364486005896906208137031026335360739161340583275343816203229308414622","13749935216854607186487641922071692492037890524402382020370477865659977471212","14305753616231100452668590820745059778506427001382290586975701645092921660548","765857276287722813531198419619164140070915902829725892404102530083930750063","17837831429010867898764848684310505000314798050293841430668793505708981358048","21265099592359165713925953648362407254559580913936166135963567928466675766562","9836732997058077094526466589020739322840803019139480203465858201631980200718","7950736069218471132276924429739021815862792210045959677128696849570697403704","4769271140055336949069111665742509949024134261124654997310716329224630277762","20393350587508813313089483176581445684689819238531002176517292760755869721350","38149718364286962749939608665460785683852940908425655353420799858383968080","294908462199902072876663185334271659283432370640074451060800538373960973112","15686183370543867546923411519048855269420334921977460677980634391907762285104","7739644896700310773878882243266703498955498777056626589614168707182557659069","8962053441358370892949398584321217001524120474906547766312555570245268276141","10485968530935240560535418413665896337924134365028112810521932629743032594567","10455176935063524730554996425761077284254888258693211809138770824018864886743","14115566565369486572031311310429302802089825334724609634263576446726737605806","20073124591363501366789760608831383241995767850640689122251701726731390338567","18044196147441334580548109144408355893452990965490068051314106336265811591526","11777763830067607118918986120012546064057341507222391327324648823238698980251","5076285475125881250450494722872064230965358749104743996583186222500686678935","9433671005987645330351463650157742363370796004102441907383343518108550265783","16007614664479860453771437441344953439396368135713518528960723657246075833228","3670983463941934079214226480204001841287142286161279531732782678406433460843","7046179718502550936980595924901442920616633571872416339261615305735715278602","17608692011920050118706235959991963886935386829021365964093748239332711649084","2996821855883838728759536316610792557284394221854997002429026293476701752866","1677231509722364930842177352080930133827209916580071048531613825027648977700","20514621385694392131023051208602786923531777062045824148198436025028161478292","18706232149332458956113227927382844148669824578035828945319576383268514596397","11536282866871845249336852725858083392404317076310198593892963050259371331649","20466198999255199834400800454553246058101307023747737024879595930133188864963","17213082575127239224295748117279913461834934345205651804512629361221712146029","19484671891372768411934382885285679105157644357942611948795072906049381809678","8503442112050525052228756834095001115345112944909240539866003384575979945546","1591002621123168604526593223171654111798901832992697089266968330710061317327","17926989791280931197506965049310631268713794343236183001990363712296100776267","9818426793010627181403113577980666147935770130277255691539405567600286312065","9942988821595010693836539395678956414086510769345202336272828286806505105690","11428337004946391003737882643329882420040707267209738526410651698195832612398","5246173256091330545722754324790141877812115594929637564770216594001202665291","9244678589481971155093167074568918052432648706230664195707777716588708425821","16484327628325306003364245414567032312084673791908596909706339237437400759774","15909549332391486405320400238323446874739232392980137232129556119929377881543","4605603680690078397409074258309278031489863163721440064230911400507819976731","11932390595676097724926919191547257683296828193773941999444763120344004292794","21261316293685003751543366541787086957146195861519918738279059420379259769912","21694342134861979785664822222441943407054500023420869221254046994410705539047","13455418065215420116004885303563860520053149691344937005371740002984186620259","21294895762334183277561199056622692153331598314844350195434334666176806203759","2298913285650149740197504916695862209035358355428627300724306426005525816892","6433628427964344837720421894751973624448162124243791938584892092692934497062","13980638727833468810299341230787216089256640947577023476618983231259366747402","16386989380774535566905941270495126370482370902137781001804268887369782038022","3779483885209758277783355831078003188483448889651898318713331166172699636659","13118689370009477102054967134335796733104690982621174244425832900274928932116","21445533669518956637854447045256826873132438263003600821648791482859243407079","5527331762329369159390944165620100309794622537826464839886395712108419580582","3982772412651522640643769699838411900841643087659996933180626455834078733729","8936887292441133154504378719580283709673438127834570894253255440130778560891","5689786437531621897454594927415077264858288108775631464102476970728285871609","6370104324738040905290397305607362815394997849284017671587890146354255852594","2562605975511809500373038481836128711166779361259424204015484454382469913903","8009939360434127939211330421690368857019489809160778015418598167076961485953","6207214611018146300599438189744645959242652217703597746064748175193260329591","16671090648797063256204148088217002774332376248497761795371610457828028740038","351920541540014679905588425887435163878844099034359672557071300875572975398","21058204412077323033815879298722170627087867902547775349664797410908803369974","14564771468858246038476497989063618180073537400380117152664301508245795360502","8272882885871254955349820427886161624704712655862030935537145720959792892274","6909321091395274276146501993203761280720491918442748432524267471458601993221","16580321413206363974123623814602922867712388513971038402753464758491015803565","843281673245380754722495246696808119685404475704137112513160388856240699325","10171659328829219575897640303524498462582095234092978615905848203599889269897","5280538311454636369301273025630273683522547291583648504386454238616356441491","16623616276068850220179897023862034811947741374757987914392112935677729609272","19853123512203259979603644963397956834690886149706076304732426191753395611491","955364103151966477697350532913523016231165744311492647080211628659701871391","20523715452656959031445477013594952421617762425683127800448733851153498579066","14293535687965811563014333045217822091100404926900397852150955930734852567984","4229676629734606989516536240720033922492197958317336524425272064033701231219","18901397382211336164186387913666617814943452495137150951121911861411601103404","14375484255313188168372529479566281408768539401520374973084172059374055840588","19545798768864804171001454865226638660566831783618291009839659068600532212741","12755887933202061913161194217993793715343250197162556258497417497956440593759","8686513030225489957270848893530798775170299685233413267611917464195410557211","5880638904324026409005302950304740533498165011473478865956931412853188357431","7354389273252412391825625422266284022910347922206550320847139744353922366698","7016237351930429912019063230239434124147424389329878468689095040305536565141","5620972089534918638996272688507749091836816762473512644976785924112182176059","20413835273287925719552648605928582957864781808563858039878873559057433938566","11990352873652827398677739409877583255209694499432033562422373811536346570826","11452116767092430632569157126777353261344552818614541313334131497235795274616","13608939909527726586864284167014632459539109382363764498491490357609068357661","19699932497952889669632765576298327295926506735107495829131115663202263356665","15251682785177950917305927011901953367908953567062062215661324049886315524643","20988180365782566790010352815052502389134630736373419926172473693216627536947","7836720310496068244885024104589560761724497802627198466406853572609572183783","8038431537840849850004264549778072928837344446259802659731886224882799164652","2029425248168573578041930579769085260473443689520829116695151637114698378179","14014583048054989975362949820515352457455051497561401705089149965549711007728","10229910039445142063805930610858936389530402461507274678278419431360560041672","18414356640728818641083254061594699427771424933767295240543780118943302353557","14385363499980792320572694168709347498076611078827580165565397937806655843600","17574003158941143569210345425977586387561202207597212418442851062273722778557","5020456663555107491462633901410150293006360280142421036527516054973198917775","20127051627292194507636525988626707066686058957062478135802400381125882156129","20897939964842847172746478761928317623445313616223360444114601438540638075545","4768232651051213290835674042772040002316324578972496328572277887954854608839","17294503583995767475859552377185515589678216285313681942711238998872988167848","14649373813471851945320940299605201018392088399780709659677169234196157620092","8780430624549024727143069679282190039037099678026940232022642526296513616209","19379993141583360349219631444991584062781246208701481966534256751049466960129","15269077688496085659395433896981555224821074535243453599961761864702497339408","5391117857262141392878145098178984215824926943428788260915775917501212609214","7908721172934600956268520018234658066175251014237965624123564978124712802362","7874341505294103336917508655326356231557632351889805234868207045464424182027","14717357719887344869049716594829853959760329970432750252010555421746110830753","3360261399639751762974090530765480555630239123582758200815794978493014885586","9821826804670125425236325658293385777765305748666267887783525427098280556536","17204157028222666500796136628457984571840002100152982240371475388423494849033","5542034861058754185477946991198906162285361355155642038893943908835601160038","3683282103686594289964931403051831385975351230136466856931777064461047733401","15224685775706801324889650391158158261567751841767486050473559405133656352415","14348433140170281101901970266749278653067511062361719376252531576778262236894","11561449914623393122383031050474623941756403082164093879442389899363860513713","18245049492685205869746697260817503761252527622829228814032380169292346673291","17504537922258513011905565287240975149408627350242698790215780212356407248353","1087354866746490755068915240098723302841828156617728293233180699369449595227","6969042902258472469564623163041902613727762494563269234625798939473325810728","19781365794109169059730125820268469324655465578674107499591208131269329184831","19197720132445970072674786026374184753486316604335554230360798533521780079016","8985344752484815619908870528789201141893762847988902632020302966238055069038","6180566225714340566468063951590163252160515912634301758875151812293005995707","7886321650473731550722613550286337225983696528924522412475864179994945154038","1770329309062897291917236776676146963443813646104822628855480965002025402285","2672465549015492990178140878418702146106524780378266324725481883753805796676","9510938473472052600166974310685487461419214920988365840433371267775469202990","8763681409640408511774703386738865004873345690332395131153581718682846235816","5086184804083998594076230176630486989159676487216439626195171443687145611476","3444180739794824231911901354495926100580172575807360182050883799956253686124","19959585945609801580752975266494803324672866918723431810286213367913961455037","3606118653399557978017653345353488674231963545742074503030228140079743128217","9802232062091145454674219420688213272404224274164975947158499021341809478056","14753794963203840670689834131757653710719077219319396758581277854471817219976","10293226843634758194510263296936027709342071523680880184525420653949365085783","12718806094899532360102670898087743973296203292888146926436211859399441382266","19720557165108559470587427734825443980468432595646509009288337442868761549209","11247390882107475711483619058539054176238525726311758865073230404212341552278","15462509904958076555211488611104595950707114200311503866776513865723341096539","19234760699502123418676309783515052697057041962626575225401675314728972650121","17158261287148866987348692179057818719922602171392849314284493894658836825746","15365955529424977292357623764025498682706496161142382817837522205572607763997","20052202240009352261741122369957280265238958638450496105242649976727648471603","423357909332235822254079656696928158152503031658093508494175901331804543226","15922263825513783744583412081948095026829380051325974037117331160273000625665","21608880876703158853582170966053859080506692816444303830697579496441737611292","14979302256083977877181830607642975718819599820161889327504074019516836927010","21610296362574306626509926774800244990065257145430368375419027492142934708446","17595716914975830356499498547074024086847211138200645735802384039048171815958","14654668119168864815561684444214692059474181246705559164525875353227464689053","7909137102568989978451284135464888703672144746229046026942372688255268205369","14812130315252358082784842576665409029101165747479648757059927502821594119043","19533381322254969505860938447353219937929507327716748825809064520539543455254","9403823843450196420799337565010549178259435908490320872849582783166065168282","10464241134417201329419510220104949346527274013274592882563416495012556125132","9301345819661937440725860028779312914339790525885214274554275091844623535968","11291714547013661830332569817711684505569815478772306103530109513027459828741","16566712313878755327910485384356179345881280692463454520410105624337016288883","9857254387540706281892224858708177932493833333242386469874406815551456850784","13235323444556237974521531300791907080635475702604350856205423158574376182435","6837328857570342508089383303046615979341710677796715226424263996563411126589","9567191971502453137803265066675229742925788197509550723183106561667775516503","13589520733675005345281874911032983354954922397198387703860557678089764021921","104175365654736775178218750541299505009591406942062749114421467907345346042","590163818614270202706155060786980081635141531931653658533034907216652933183","11630836030911095078662233290280414853525666587225870019070111475894870557937","3143463001554546949388574227992235144909572072667494575339346439434777710214","17210674657600746455132196643290051407032499980059412222084673652147666262244","19558381360647054135714232130709740454803497350056006816389092459633204536306","16883239974151654186618501613502254189172694896294262882551553603289459762207","8413661446386279271250258046703699372256294759176301597443419113141652463386","17926420509822647309653607861708033860852594098459584436645268742667896895558","19824925766389886827250259916041015429740610094218960702010388823681796598372","21569124030016608055974854740419962472020200788866623348222538997741654501795","14232424310854472834356314082148076539296957249563473004688613559676523926509","15193615028121862883292210509489791742567273312408676269715846648108564480216","4571863685585148023589373809103548979799867639025504561868195666694987162026","6206779924996162752046602034743078689551092997538497731303258570990576183904","13551354910729069809580067054835607774880530108885793285331679609370500875004","9899791381683262402504188099370233883995824403872277909479896171174493425427","19676726055572810021222964113026140207269355942060367353065169172081559784672","842852341267559061264418048500907996345833086685212080144270808293582991176","2374896551530407137601201042234188834144647343362619212010730934843698743587","7541169441788393045940373474338091879780271077778260807857446771010926024429","11136936778745143751630950186644088027953411966465838448171145474563978816093","10104692900610618203101067220992674388402050900350351026933004613495030125962","9448067584436414960964337190111983737612300524270450316697483521460203416821","8950186827869639604172647121100447815900277491673507364868135313567370094566","13506425119440201268368754328546416032565667481881592632895304755531522876713","8980168571796290804339343950808891004720242960395088290536220280570423270238","18170882696616761010489613056792567852402646771641587111297862995908970291284","17964914132412404677996740117340161470056406021410685722116447488755963163990","4999254529824068728272549382468024522346083624068028557197677399460354032302","19863286783514673257602438096028698340633489355546438580505275806712888618797","8597501472019579693110022148133358484974050449265021769883471363830981070438","15745697387452707443485700990949175358831586983137296283366195319537908003288","13137385666206357557612894624274538332141042254638811649741671391041335368023","17489444249761129472685381315022721658390849238308934118982939182052647535064","7817235089381823509145374360042255112726388997005284838446772709175711038688","14266303771668205536382691342596456410509199091923271798848518821724529136059","3636857805719964585971325322044663359458065705759731491721865284507973354939","15992868605947752108489235540799285759772965578817149705232162327368620329585","1335686142273152709365597717137409998821127623205060581051968539417021206504","6433290482925748613794540660743040431650259914794007152150057855153874666944","1361143257838811133926634806224247744517655450729374562521500236431831031476","18225681286815161411121137668234617452312048153276117017888242519394843989168","19843309075203033669895762315323851121116692526905833370940041980425774744571","15228011749951502720507138380119493145011628580619540200408217541371854380957","19619902256720178830677177598316556548461566595041053642017410940299852914682","511045245706260898110690359652263936223759289411819460157040898756960539462","7391377516085877772042712644814217270885890613808054711267621194257918442112","5891519591265284241203789998585637602270159400314233944803142442234700250863","2205432830627138420924593517638591617200352501757865976823844451062848337881","3222440233016699218240995056566298768106156979610420431469004199306974269103","8738332104312050387266272441686236247554960069301415997266286065690829290396","1551797112498648676836888480223639601740456286931633071547538018561520713544","1533866262507880248780245731190869299029017561560482981975068249985135371067","3996384786620540375232033672025195552610224229344345117985645908694200761016","16595891332727724151340175555326766529692459983213346368706615677339339240020","11523034561885962354991131363057963624098255825893327869682794018887379424097","21037920806606953471816674932313658324079485042735787472381615025003112432904","19591615019774495060998741485447874831723014393820542494077889189192102109031","9121850391530996471222427082549856324643713020999728941399437734853739817153","6849010089591794160862035089126940514820060634802302095512422500449021208898","21803985179639408855590213016678692901492191793853596659193109444086006378119","13364642672122219159126189111975702569548137252134210263160227802926124348078","16905269331135488328605515318505661227228474740876565481132283687997616028861","11264009642168330483857233256241513200490483139661004283535705073110138982890","5332394467645666696623235864746879605637402312414276534976098157513611666542","17925301199630013346486151991337546692422339664903952576083922784335751134079","11900184416418670354965232151665958518848952270854151924870211669630781631223","15562113593580216239006544427542674838265849698433044757495991364465187405884","3806304128817128192424875722779633391243742313942202394988632791379590507084","4657338409098638664678315846850627043185036888996779552648742031908099581588","15813005888849962389158961584970173978097218996267117171684509555319301477411","17056578011328104553093128374315470853531917998809681241413306393882725625198","6430589065893485715796702045939612847939363293990681504299985210155618562864","7514454699643127952791367885323645723388779246392186109883710722291187240497","7826937063653788873418085859562133984976335940156012117355343731656725674347","2225655582871701716469716244290307217751235918380896133272619906562931866876","11565133364312756310075478066314302953761772900026528225403220752431976340190","18232452026689223969965820968016739847092564814758593382764078404018135510023","1358358355244320152796507416231954843591920800744392329047477141132664693794","2597241426605278043922861599217180508175107341199392281858695037638300643180","17674515264858256312450756598079170929596539962153597882812281349637224943254","3143421480716849445957518543992988300614287126569006297241763368177602468592","15933437847230001720929677769855858682918236257655835442179345528393419564882","6733106851709743508924920069771721545927217564131624545573720030931843427107","3903499693696421946995265411390118861168305725858301760878023455038512768658","14433872132790123652832156520925166553485145595432897200832458531093296216884","7097617002748651760063122634260707663385999924497452509206216049717006887614","9196893673129829898318166605040425641260075795136163048833535143632480806738","19140091520550535179093575244921354004409797700450072348027875067724407780771","13815362122463786845354711610276132099779552968788780241453140843664912171289","132329010991610972419019365039613190472336282083377290824055198940312830513","2049181411991933045514610569712374231531845833062261528528564288748902967619","9942692693883003669846738387378238020204191501223875692726715738542841527104","6283754404754969631949771092743204859616073374053464616082489188503158661340","13531881648062996717630837244804254055395580039994975987100053481374744485749","0","0","0","0","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","16751074199471344286802035516092717228413021805857911221340709282829922649570","16607689897250896163839120369329143853138821982212506869796223602775242163908","6306670965815533610139978731151082260521747949859106157811737942199411096763","8230394042541507458651300722707802655073997691897399557296075563607891385931","9921340941556354371580059537039333469973209453102024699252654455316059290620","16798896597145667139496131042097011601219503268718208432881915127321311248865","10761622635138561113453616724326151200504548364659640959171019993528403053596","4201374595453568719536041091370119651099375260803977706482746783208488880305","9971587591474752610461421108018095077842562578014452361783151616467835435111","5516956972178305312309254917389099764623678730180225999630364134360264110082","15066785865404294422881557619360885995614121995592112712990143250762198336884","21755300202021669800310961644948292234097575522286241219994206014548021317507","44312224132391919278568080003847402581022440080536924033423180021727388015","17589524827975147485715615321649189469791625723245721893742228097834086947532","8719984869514470722047522645705044152404773497435222154684105742564180785917","12838432770668333832140112504623798777955855545564491234660602333126926294802","10962219331981126937794734082126576683795140107663121675442940913117472782171","11315763313939367564880085930200632291397536948843222126556649652575069224853","9490320164035243469515553845741859611832694165395589257142226352243136301303","14573213588623917823708851377700803537638194753660392663536665732379880810694","11957092005664205224141548929385856436673493267279705778466447868093190736829","2201153109770645202954444876374528386609966279164593010871872560011817397913","11082747672059648638492717211402437406817522242047530271849521934851141518229","20477546427784935443802032434219911124745095329100703429739367686725375043621","20413669078949764936443689287676556111623164824373754014432737811311226761753","12881136730064110218094313142501866107021596701447009682940537878392614463314","13227437990758291440620943688822553930025228016992494659907178847660023537124","16572644556309208037124906701824425475845839679912404017132481770297056142431","19207525364486005896906208137031026335360739161340583275343816203229308414622","13749935216854607186487641922071692492037890524402382020370477865659977471212","14305753616231100452668590820745059778506427001382290586975701645092921660548","765857276287722813531198419619164140070915902829725892404102530083930750063","17837831429010867898764848684310505000314798050293841430668793505708981358048","21265099592359165713925953648362407254559580913936166135963567928466675766562","9836732997058077094526466589020739322840803019139480203465858201631980200718","7950736069218471132276924429739021815862792210045959677128696849570697403704","4769271140055336949069111665742509949024134261124654997310716329224630277762","20393350587508813313089483176581445684689819238531002176517292760755869721350","38149718364286962749939608665460785683852940908425655353420799858383968080","294908462199902072876663185334271659283432370640074451060800538373960973112","15686183370543867546923411519048855269420334921977460677980634391907762285104","7739644896700310773878882243266703498955498777056626589614168707182557659069","8962053441358370892949398584321217001524120474906547766312555570245268276141","10485968530935240560535418413665896337924134365028112810521932629743032594567","10455176935063524730554996425761077284254888258693211809138770824018864886743","14115566565369486572031311310429302802089825334724609634263576446726737605806","20073124591363501366789760608831383241995767850640689122251701726731390338567","18044196147441334580548109144408355893452990965490068051314106336265811591526","11777763830067607118918986120012546064057341507222391327324648823238698980251","5076285475125881250450494722872064230965358749104743996583186222500686678935","9433671005987645330351463650157742363370796004102441907383343518108550265783","16007614664479860453771437441344953439396368135713518528960723657246075833228","3670983463941934079214226480204001841287142286161279531732782678406433460843","7046179718502550936980595924901442920616633571872416339261615305735715278602","17608692011920050118706235959991963886935386829021365964093748239332711649084","2996821855883838728759536316610792557284394221854997002429026293476701752866","1677231509722364930842177352080930133827209916580071048531613825027648977700","20514621385694392131023051208602786923531777062045824148198436025028161478292","18706232149332458956113227927382844148669824578035828945319576383268514596397","11536282866871845249336852725858083392404317076310198593892963050259371331649","20466198999255199834400800454553246058101307023747737024879595930133188864963","17213082575127239224295748117279913461834934345205651804512629361221712146029","19484671891372768411934382885285679105157644357942611948795072906049381809678","8503442112050525052228756834095001115345112944909240539866003384575979945546","1591002621123168604526593223171654111798901832992697089266968330710061317327","17926989791280931197506965049310631268713794343236183001990363712296100776267","9818426793010627181403113577980666147935770130277255691539405567600286312065","9942988821595010693836539395678956414086510769345202336272828286806505105690","11428337004946391003737882643329882420040707267209738526410651698195832612398","5246173256091330545722754324790141877812115594929637564770216594001202665291","9244678589481971155093167074568918052432648706230664195707777716588708425821","16484327628325306003364245414567032312084673791908596909706339237437400759774","15909549332391486405320400238323446874739232392980137232129556119929377881543","4605603680690078397409074258309278031489863163721440064230911400507819976731","11932390595676097724926919191547257683296828193773941999444763120344004292794","21261316293685003751543366541787086957146195861519918738279059420379259769912","21694342134861979785664822222441943407054500023420869221254046994410705539047","13455418065215420116004885303563860520053149691344937005371740002984186620259","21294895762334183277561199056622692153331598314844350195434334666176806203759","2298913285650149740197504916695862209035358355428627300724306426005525816892","6433628427964344837720421894751973624448162124243791938584892092692934497062","13980638727833468810299341230787216089256640947577023476618983231259366747402","16386989380774535566905941270495126370482370902137781001804268887369782038022","3779483885209758277783355831078003188483448889651898318713331166172699636659","13118689370009477102054967134335796733104690982621174244425832900274928932116","21445533669518956637854447045256826873132438263003600821648791482859243407079","5527331762329369159390944165620100309794622537826464839886395712108419580582","3982772412651522640643769699838411900841643087659996933180626455834078733729","8936887292441133154504378719580283709673438127834570894253255440130778560891","5689786437531621897454594927415077264858288108775631464102476970728285871609","6370104324738040905290397305607362815394997849284017671587890146354255852594","2562605975511809500373038481836128711166779361259424204015484454382469913903","8009939360434127939211330421690368857019489809160778015418598167076961485953","6207214611018146300599438189744645959242652217703597746064748175193260329591","16671090648797063256204148088217002774332376248497761795371610457828028740038","351920541540014679905588425887435163878844099034359672557071300875572975398","21058204412077323033815879298722170627087867902547775349664797410908803369974","14564771468858246038476497989063618180073537400380117152664301508245795360502","8272882885871254955349820427886161624704712655862030935537145720959792892274","6909321091395274276146501993203761280720491918442748432524267471458601993221","16580321413206363974123623814602922867712388513971038402753464758491015803565","843281673245380754722495246696808119685404475704137112513160388856240699325","10171659328829219575897640303524498462582095234092978615905848203599889269897","5280538311454636369301273025630273683522547291583648504386454238616356441491","16623616276068850220179897023862034811947741374757987914392112935677729609272","19853123512203259979603644963397956834690886149706076304732426191753395611491","955364103151966477697350532913523016231165744311492647080211628659701871391","20523715452656959031445477013594952421617762425683127800448733851153498579066","14293535687965811563014333045217822091100404926900397852150955930734852567984","4229676629734606989516536240720033922492197958317336524425272064033701231219","18901397382211336164186387913666617814943452495137150951121911861411601103404","14375484255313188168372529479566281408768539401520374973084172059374055840588","19545798768864804171001454865226638660566831783618291009839659068600532212741","12755887933202061913161194217993793715343250197162556258497417497956440593759","8686513030225489957270848893530798775170299685233413267611917464195410557211","5880638904324026409005302950304740533498165011473478865956931412853188357431","7354389273252412391825625422266284022910347922206550320847139744353922366698","7016237351930429912019063230239434124147424389329878468689095040305536565141","5620972089534918638996272688507749091836816762473512644976785924112182176059","20413835273287925719552648605928582957864781808563858039878873559057433938566","11990352873652827398677739409877583255209694499432033562422373811536346570826","11452116767092430632569157126777353261344552818614541313334131497235795274616","13608939909527726586864284167014632459539109382363764498491490357609068357661","19699932497952889669632765576298327295926506735107495829131115663202263356665","15251682785177950917305927011901953367908953567062062215661324049886315524643","20988180365782566790010352815052502389134630736373419926172473693216627536947","7836720310496068244885024104589560761724497802627198466406853572609572183783","8038431537840849850004264549778072928837344446259802659731886224882799164652","2029425248168573578041930579769085260473443689520829116695151637114698378179","14014583048054989975362949820515352457455051497561401705089149965549711007728","10229910039445142063805930610858936389530402461507274678278419431360560041672","18414356640728818641083254061594699427771424933767295240543780118943302353557","14385363499980792320572694168709347498076611078827580165565397937806655843600","17574003158941143569210345425977586387561202207597212418442851062273722778557","5020456663555107491462633901410150293006360280142421036527516054973198917775","20127051627292194507636525988626707066686058957062478135802400381125882156129","20897939964842847172746478761928317623445313616223360444114601438540638075545","4768232651051213290835674042772040002316324578972496328572277887954854608839","17294503583995767475859552377185515589678216285313681942711238998872988167848","14649373813471851945320940299605201018392088399780709659677169234196157620092","8780430624549024727143069679282190039037099678026940232022642526296513616209","19379993141583360349219631444991584062781246208701481966534256751049466960129","15269077688496085659395433896981555224821074535243453599961761864702497339408","5391117857262141392878145098178984215824926943428788260915775917501212609214","7908721172934600956268520018234658066175251014237965624123564978124712802362","7874341505294103336917508655326356231557632351889805234868207045464424182027","14717357719887344869049716594829853959760329970432750252010555421746110830753","3360261399639751762974090530765480555630239123582758200815794978493014885586","9821826804670125425236325658293385777765305748666267887783525427098280556536","17204157028222666500796136628457984571840002100152982240371475388423494849033","5542034861058754185477946991198906162285361355155642038893943908835601160038","3683282103686594289964931403051831385975351230136466856931777064461047733401","15224685775706801324889650391158158261567751841767486050473559405133656352415","14348433140170281101901970266749278653067511062361719376252531576778262236894","11561449914623393122383031050474623941756403082164093879442389899363860513713","18245049492685205869746697260817503761252527622829228814032380169292346673291","17504537922258513011905565287240975149408627350242698790215780212356407248353","1087354866746490755068915240098723302841828156617728293233180699369449595227","6969042902258472469564623163041902613727762494563269234625798939473325810728","19781365794109169059730125820268469324655465578674107499591208131269329184831","19197720132445970072674786026374184753486316604335554230360798533521780079016","8985344752484815619908870528789201141893762847988902632020302966238055069038","6180566225714340566468063951590163252160515912634301758875151812293005995707","7886321650473731550722613550286337225983696528924522412475864179994945154038","1770329309062897291917236776676146963443813646104822628855480965002025402285","2672465549015492990178140878418702146106524780378266324725481883753805796676","9510938473472052600166974310685487461419214920988365840433371267775469202990","8763681409640408511774703386738865004873345690332395131153581718682846235816","5086184804083998594076230176630486989159676487216439626195171443687145611476","3444180739794824231911901354495926100580172575807360182050883799956253686124","19959585945609801580752975266494803324672866918723431810286213367913961455037","3606118653399557978017653345353488674231963545742074503030228140079743128217","9802232062091145454674219420688213272404224274164975947158499021341809478056","14753794963203840670689834131757653710719077219319396758581277854471817219976","10293226843634758194510263296936027709342071523680880184525420653949365085783","12718806094899532360102670898087743973296203292888146926436211859399441382266","19720557165108559470587427734825443980468432595646509009288337442868761549209","11247390882107475711483619058539054176238525726311758865073230404212341552278","15462509904958076555211488611104595950707114200311503866776513865723341096539","19234760699502123418676309783515052697057041962626575225401675314728972650121","17158261287148866987348692179057818719922602171392849314284493894658836825746","15365955529424977292357623764025498682706496161142382817837522205572607763997","20052202240009352261741122369957280265238958638450496105242649976727648471603","423357909332235822254079656696928158152503031658093508494175901331804543226","15922263825513783744583412081948095026829380051325974037117331160273000625665","21608880876703158853582170966053859080506692816444303830697579496441737611292","14979302256083977877181830607642975718819599820161889327504074019516836927010","21610296362574306626509926774800244990065257145430368375419027492142934708446","17595716914975830356499498547074024086847211138200645735802384039048171815958","14654668119168864815561684444214692059474181246705559164525875353227464689053","7909137102568989978451284135464888703672144746229046026942372688255268205369","14812130315252358082784842576665409029101165747479648757059927502821594119043","19533381322254969505860938447353219937929507327716748825809064520539543455254","9403823843450196420799337565010549178259435908490320872849582783166065168282","10464241134417201329419510220104949346527274013274592882563416495012556125132","9301345819661937440725860028779312914339790525885214274554275091844623535968","11291714547013661830332569817711684505569815478772306103530109513027459828741","16566712313878755327910485384356179345881280692463454520410105624337016288883","9857254387540706281892224858708177932493833333242386469874406815551456850784","13235323444556237974521531300791907080635475702604350856205423158574376182435","6837328857570342508089383303046615979341710677796715226424263996563411126589","9567191971502453137803265066675229742925788197509550723183106561667775516503","13589520733675005345281874911032983354954922397198387703860557678089764021921","104175365654736775178218750541299505009591406942062749114421467907345346042","590163818614270202706155060786980081635141531931653658533034907216652933183","11630836030911095078662233290280414853525666587225870019070111475894870557937","3143463001554546949388574227992235144909572072667494575339346439434777710214","17210674657600746455132196643290051407032499980059412222084673652147666262244","19558381360647054135714232130709740454803497350056006816389092459633204536306","16883239974151654186618501613502254189172694896294262882551553603289459762207","8413661446386279271250258046703699372256294759176301597443419113141652463386","17926420509822647309653607861708033860852594098459584436645268742667896895558","19824925766389886827250259916041015429740610094218960702010388823681796598372","21569124030016608055974854740419962472020200788866623348222538997741654501795","14232424310854472834356314082148076539296957249563473004688613559676523926509","15193615028121862883292210509489791742567273312408676269715846648108564480216","4571863685585148023589373809103548979799867639025504561868195666694987162026","6206779924996162752046602034743078689551092997538497731303258570990576183904","13551354910729069809580067054835607774880530108885793285331679609370500875004","9899791381683262402504188099370233883995824403872277909479896171174493425427","19676726055572810021222964113026140207269355942060367353065169172081559784672","842852341267559061264418048500907996345833086685212080144270808293582991176","2374896551530407137601201042234188834144647343362619212010730934843698743587","7541169441788393045940373474338091879780271077778260807857446771010926024429","11136936778745143751630950186644088027953411966465838448171145474563978816093","10104692900610618203101067220992674388402050900350351026933004613495030125962","9448067584436414960964337190111983737612300524270450316697483521460203416821","8950186827869639604172647121100447815900277491673507364868135313567370094566","13506425119440201268368754328546416032565667481881592632895304755531522876713","8980168571796290804339343950808891004720242960395088290536220280570423270238","18170882696616761010489613056792567852402646771641587111297862995908970291284","17964914132412404677996740117340161470056406021410685722116447488755963163990","4999254529824068728272549382468024522346083624068028557197677399460354032302","19863286783514673257602438096028698340633489355546438580505275806712888618797","8597501472019579693110022148133358484974050449265021769883471363830981070438","15745697387452707443485700990949175358831586983137296283366195319537908003288","13137385666206357557612894624274538332141042254638811649741671391041335368023","17489444249761129472685381315022721658390849238308934118982939182052647535064","7817235089381823509145374360042255112726388997005284838446772709175711038688","14266303771668205536382691342596456410509199091923271798848518821724529136059","3636857805719964585971325322044663359458065705759731491721865284507973354939","15992868605947752108489235540799285759772965578817149705232162327368620329585","1335686142273152709365597717137409998821127623205060581051968539417021206504","6433290482925748613794540660743040431650259914794007152150057855153874666944","1361143257838811133926634806224247744517655450729374562521500236431831031476","18225681286815161411121137668234617452312048153276117017888242519394843989168","19843309075203033669895762315323851121116692526905833370940041980425774744571","15228011749951502720507138380119493145011628580619540200408217541371854380957","19619902256720178830677177598316556548461566595041053642017410940299852914682","511045245706260898110690359652263936223759289411819460157040898756960539462","7391377516085877772042712644814217270885890613808054711267621194257918442112","5891519591265284241203789998585637602270159400314233944803142442234700250863","2205432830627138420924593517638591617200352501757865976823844451062848337881","3222440233016699218240995056566298768106156979610420431469004199306974269103","8738332104312050387266272441686236247554960069301415997266286065690829290396","1551797112498648676836888480223639601740456286931633071547538018561520713544","1533866262507880248780245731190869299029017561560482981975068249985135371067","3996384786620540375232033672025195552610224229344345117985645908694200761016","16595891332727724151340175555326766529692459983213346368706615677339339240020","11523034561885962354991131363057963624098255825893327869682794018887379424097","21037920806606953471816674932313658324079485042735787472381615025003112432904","19591615019774495060998741485447874831723014393820542494077889189192102109031","9121850391530996471222427082549856324643713020999728941399437734853739817153","6849010089591794160862035089126940514820060634802302095512422500449021208898","21803985179639408855590213016678692901492191793853596659193109444086006378119","13364642672122219159126189111975702569548137252134210263160227802926124348078","16905269331135488328605515318505661227228474740876565481132283687997616028861","11264009642168330483857233256241513200490483139661004283535705073110138982890","5332394467645666696623235864746879605637402312414276534976098157513611666542","17925301199630013346486151991337546692422339664903952576083922784335751134079","11900184416418670354965232151665958518848952270854151924870211669630781631223","15562113593580216239006544427542674838265849698433044757495991364465187405884","3806304128817128192424875722779633391243742313942202394988632791379590507084","4657338409098638664678315846850627043185036888996779552648742031908099581588","15813005888849962389158961584970173978097218996267117171684509555319301477411","17056578011328104553093128374315470853531917998809681241413306393882725625198","6430589065893485715796702045939612847939363293990681504299985210155618562864","7514454699643127952791367885323645723388779246392186109883710722291187240497","7826937063653788873418085859562133984976335940156012117355343731656725674347","2225655582871701716469716244290307217751235918380896133272619906562931866876","11565133364312756310075478066314302953761772900026528225403220752431976340190","18232452026689223969965820968016739847092564814758593382764078404018135510023","1358358355244320152796507416231954843591920800744392329047477141132664693794","2597241426605278043922861599217180508175107341199392281858695037638300643180","17674515264858256312450756598079170929596539962153597882812281349637224943254","3143421480716849445957518543992988300614287126569006297241763368177602468592","15933437847230001720929677769855858682918236257655835442179345528393419564882","6733106851709743508924920069771721545927217564131624545573720030931843427107","3903499693696421946995265411390118861168305725858301760878023455038512768658","14433872132790123652832156520925166553485145595432897200832458531093296216884","7097617002748651760063122634260707663385999924497452509206216049717006887614","9196893673129829898318166605040425641260075795136163048833535143632480806738","19140091520550535179093575244921354004409797700450072348027875067724407780771","13815362122463786845354711610276132099779552968788780241453140843664912171289","132329010991610972419019365039613190472336282083377290824055198940312830513","2049181411991933045514610569712374231531845833062261528528564288748902967619","9942692693883003669846738387378238020204191501223875692726715738542841527104","6283754404754969631949771092743204859616073374053464616082489188503158661340","13531881648062996717630837244804254055395580039994975987100053481374744485749","0","0","0","0","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","16751074199471344286802035516092717228413021805857911221340709282829922649570","16607689897250896163839120369329143853138821982212506869796223602775242163908","6306670965815533610139978731151082260521747949859106157811737942199411096763","8230394042541507458651300722707802655073997691897399557296075563607891385931","9921340941556354371580059537039333469973209453102024699252654455316059290620","16798896597145667139496131042097011601219503268718208432881915127321311248865","10761622635138561113453616724326151200504548364659640959171019993528403053596","4201374595453568719536041091370119651099375260803977706482746783208488880305","9971587591474752610461421108018095077842562578014452361783151616467835435111","5516956972178305312309254917389099764623678730180225999630364134360264110082","15066785865404294422881557619360885995614121995592112712990143250762198336884","21755300202021669800310961644948292234097575522286241219994206014548021317507","44312224132391919278568080003847402581022440080536924033423180021727388015","17589524827975147485715615321649189469791625723245721893742228097834086947532","8719984869514470722047522645705044152404773497435222154684105742564180785917","12838432770668333832140112504623798777955855545564491234660602333126926294802","10962219331981126937794734082126576683795140107663121675442940913117472782171","11315763313939367564880085930200632291397536948843222126556649652575069224853","9490320164035243469515553845741859611832694165395589257142226352243136301303","14573213588623917823708851377700803537638194753660392663536665732379880810694","11957092005664205224141548929385856436673493267279705778466447868093190736829","2201153109770645202954444876374528386609966279164593010871872560011817397913","11082747672059648638492717211402437406817522242047530271849521934851141518229","20477546427784935443802032434219911124745095329100703429739367686725375043621","20413669078949764936443689287676556111623164824373754014432737811311226761753","12881136730064110218094313142501866107021596701447009682940537878392614463314","13227437990758291440620943688822553930025228016992494659907178847660023537124","16572644556309208037124906701824425475845839679912404017132481770297056142431","19207525364486005896906208137031026335360739161340583275343816203229308414622","13749935216854607186487641922071692492037890524402382020370477865659977471212","14305753616231100452668590820745059778506427001382290586975701645092921660548","765857276287722813531198419619164140070915902829725892404102530083930750063","17837831429010867898764848684310505000314798050293841430668793505708981358048","21265099592359165713925953648362407254559580913936166135963567928466675766562","9836732997058077094526466589020739322840803019139480203465858201631980200718","7950736069218471132276924429739021815862792210045959677128696849570697403704","4769271140055336949069111665742509949024134261124654997310716329224630277762","20393350587508813313089483176581445684689819238531002176517292760755869721350","38149718364286962749939608665460785683852940908425655353420799858383968080","294908462199902072876663185334271659283432370640074451060800538373960973112","15686183370543867546923411519048855269420334921977460677980634391907762285104","7739644896700310773878882243266703498955498777056626589614168707182557659069","8962053441358370892949398584321217001524120474906547766312555570245268276141","10485968530935240560535418413665896337924134365028112810521932629743032594567","10455176935063524730554996425761077284254888258693211809138770824018864886743","14115566565369486572031311310429302802089825334724609634263576446726737605806","20073124591363501366789760608831383241995767850640689122251701726731390338567","18044196147441334580548109144408355893452990965490068051314106336265811591526","11777763830067607118918986120012546064057341507222391327324648823238698980251","5076285475125881250450494722872064230965358749104743996583186222500686678935","9433671005987645330351463650157742363370796004102441907383343518108550265783","16007614664479860453771437441344953439396368135713518528960723657246075833228","3670983463941934079214226480204001841287142286161279531732782678406433460843","7046179718502550936980595924901442920616633571872416339261615305735715278602","17608692011920050118706235959991963886935386829021365964093748239332711649084","2996821855883838728759536316610792557284394221854997002429026293476701752866","1677231509722364930842177352080930133827209916580071048531613825027648977700","20514621385694392131023051208602786923531777062045824148198436025028161478292","18706232149332458956113227927382844148669824578035828945319576383268514596397","11536282866871845249336852725858083392404317076310198593892963050259371331649","20466198999255199834400800454553246058101307023747737024879595930133188864963","17213082575127239224295748117279913461834934345205651804512629361221712146029","19484671891372768411934382885285679105157644357942611948795072906049381809678","8503442112050525052228756834095001115345112944909240539866003384575979945546","1591002621123168604526593223171654111798901832992697089266968330710061317327","17926989791280931197506965049310631268713794343236183001990363712296100776267","9818426793010627181403113577980666147935770130277255691539405567600286312065","9942988821595010693836539395678956414086510769345202336272828286806505105690","11428337004946391003737882643329882420040707267209738526410651698195832612398","5246173256091330545722754324790141877812115594929637564770216594001202665291","9244678589481971155093167074568918052432648706230664195707777716588708425821","16484327628325306003364245414567032312084673791908596909706339237437400759774","15909549332391486405320400238323446874739232392980137232129556119929377881543","4605603680690078397409074258309278031489863163721440064230911400507819976731","11932390595676097724926919191547257683296828193773941999444763120344004292794","21261316293685003751543366541787086957146195861519918738279059420379259769912","21694342134861979785664822222441943407054500023420869221254046994410705539047","13455418065215420116004885303563860520053149691344937005371740002984186620259","21294895762334183277561199056622692153331598314844350195434334666176806203759","2298913285650149740197504916695862209035358355428627300724306426005525816892","6433628427964344837720421894751973624448162124243791938584892092692934497062","13980638727833468810299341230787216089256640947577023476618983231259366747402","16386989380774535566905941270495126370482370902137781001804268887369782038022","3779483885209758277783355831078003188483448889651898318713331166172699636659","13118689370009477102054967134335796733104690982621174244425832900274928932116","21445533669518956637854447045256826873132438263003600821648791482859243407079","5527331762329369159390944165620100309794622537826464839886395712108419580582","3982772412651522640643769699838411900841643087659996933180626455834078733729","8936887292441133154504378719580283709673438127834570894253255440130778560891","5689786437531621897454594927415077264858288108775631464102476970728285871609","6370104324738040905290397305607362815394997849284017671587890146354255852594","2562605975511809500373038481836128711166779361259424204015484454382469913903","8009939360434127939211330421690368857019489809160778015418598167076961485953","6207214611018146300599438189744645959242652217703597746064748175193260329591","16671090648797063256204148088217002774332376248497761795371610457828028740038","351920541540014679905588425887435163878844099034359672557071300875572975398","21058204412077323033815879298722170627087867902547775349664797410908803369974","14564771468858246038476497989063618180073537400380117152664301508245795360502","8272882885871254955349820427886161624704712655862030935537145720959792892274","6909321091395274276146501993203761280720491918442748432524267471458601993221","16580321413206363974123623814602922867712388513971038402753464758491015803565","843281673245380754722495246696808119685404475704137112513160388856240699325","10171659328829219575897640303524498462582095234092978615905848203599889269897","5280538311454636369301273025630273683522547291583648504386454238616356441491","16623616276068850220179897023862034811947741374757987914392112935677729609272","19853123512203259979603644963397956834690886149706076304732426191753395611491","955364103151966477697350532913523016231165744311492647080211628659701871391","20523715452656959031445477013594952421617762425683127800448733851153498579066","14293535687965811563014333045217822091100404926900397852150955930734852567984","4229676629734606989516536240720033922492197958317336524425272064033701231219","18901397382211336164186387913666617814943452495137150951121911861411601103404","14375484255313188168372529479566281408768539401520374973084172059374055840588","19545798768864804171001454865226638660566831783618291009839659068600532212741","12755887933202061913161194217993793715343250197162556258497417497956440593759","8686513030225489957270848893530798775170299685233413267611917464195410557211","5880638904324026409005302950304740533498165011473478865956931412853188357431","7354389273252412391825625422266284022910347922206550320847139744353922366698","7016237351930429912019063230239434124147424389329878468689095040305536565141","5620972089534918638996272688507749091836816762473512644976785924112182176059","20413835273287925719552648605928582957864781808563858039878873559057433938566","11990352873652827398677739409877583255209694499432033562422373811536346570826","11452116767092430632569157126777353261344552818614541313334131497235795274616","13608939909527726586864284167014632459539109382363764498491490357609068357661","19699932497952889669632765576298327295926506735107495829131115663202263356665","15251682785177950917305927011901953367908953567062062215661324049886315524643","20988180365782566790010352815052502389134630736373419926172473693216627536947","7836720310496068244885024104589560761724497802627198466406853572609572183783","8038431537840849850004264549778072928837344446259802659731886224882799164652","2029425248168573578041930579769085260473443689520829116695151637114698378179","14014583048054989975362949820515352457455051497561401705089149965549711007728","10229910039445142063805930610858936389530402461507274678278419431360560041672","18414356640728818641083254061594699427771424933767295240543780118943302353557","14385363499980792320572694168709347498076611078827580165565397937806655843600","17574003158941143569210345425977586387561202207597212418442851062273722778557","5020456663555107491462633901410150293006360280142421036527516054973198917775","20127051627292194507636525988626707066686058957062478135802400381125882156129","20897939964842847172746478761928317623445313616223360444114601438540638075545","4768232651051213290835674042772040002316324578972496328572277887954854608839","17294503583995767475859552377185515589678216285313681942711238998872988167848","14649373813471851945320940299605201018392088399780709659677169234196157620092","8780430624549024727143069679282190039037099678026940232022642526296513616209","19379993141583360349219631444991584062781246208701481966534256751049466960129","15269077688496085659395433896981555224821074535243453599961761864702497339408","5391117857262141392878145098178984215824926943428788260915775917501212609214","7908721172934600956268520018234658066175251014237965624123564978124712802362","7874341505294103336917508655326356231557632351889805234868207045464424182027","14717357719887344869049716594829853959760329970432750252010555421746110830753","3360261399639751762974090530765480555630239123582758200815794978493014885586","9821826804670125425236325658293385777765305748666267887783525427098280556536","17204157028222666500796136628457984571840002100152982240371475388423494849033","5542034861058754185477946991198906162285361355155642038893943908835601160038","3683282103686594289964931403051831385975351230136466856931777064461047733401","15224685775706801324889650391158158261567751841767486050473559405133656352415","14348433140170281101901970266749278653067511062361719376252531576778262236894","11561449914623393122383031050474623941756403082164093879442389899363860513713","18245049492685205869746697260817503761252527622829228814032380169292346673291","17504537922258513011905565287240975149408627350242698790215780212356407248353","1087354866746490755068915240098723302841828156617728293233180699369449595227","6969042902258472469564623163041902613727762494563269234625798939473325810728","19781365794109169059730125820268469324655465578674107499591208131269329184831","19197720132445970072674786026374184753486316604335554230360798533521780079016","8985344752484815619908870528789201141893762847988902632020302966238055069038","6180566225714340566468063951590163252160515912634301758875151812293005995707","7886321650473731550722613550286337225983696528924522412475864179994945154038","1770329309062897291917236776676146963443813646104822628855480965002025402285","2672465549015492990178140878418702146106524780378266324725481883753805796676","9510938473472052600166974310685487461419214920988365840433371267775469202990","8763681409640408511774703386738865004873345690332395131153581718682846235816","5086184804083998594076230176630486989159676487216439626195171443687145611476","3444180739794824231911901354495926100580172575807360182050883799956253686124","19959585945609801580752975266494803324672866918723431810286213367913961455037","3606118653399557978017653345353488674231963545742074503030228140079743128217","9802232062091145454674219420688213272404224274164975947158499021341809478056","14753794963203840670689834131757653710719077219319396758581277854471817219976","10293226843634758194510263296936027709342071523680880184525420653949365085783","12718806094899532360102670898087743973296203292888146926436211859399441382266","19720557165108559470587427734825443980468432595646509009288337442868761549209","11247390882107475711483619058539054176238525726311758865073230404212341552278","15462509904958076555211488611104595950707114200311503866776513865723341096539","19234760699502123418676309783515052697057041962626575225401675314728972650121","17158261287148866987348692179057818719922602171392849314284493894658836825746","15365955529424977292357623764025498682706496161142382817837522205572607763997","20052202240009352261741122369957280265238958638450496105242649976727648471603","423357909332235822254079656696928158152503031658093508494175901331804543226","15922263825513783744583412081948095026829380051325974037117331160273000625665","21608880876703158853582170966053859080506692816444303830697579496441737611292","14979302256083977877181830607642975718819599820161889327504074019516836927010","21610296362574306626509926774800244990065257145430368375419027492142934708446","17595716914975830356499498547074024086847211138200645735802384039048171815958","14654668119168864815561684444214692059474181246705559164525875353227464689053","7909137102568989978451284135464888703672144746229046026942372688255268205369","14812130315252358082784842576665409029101165747479648757059927502821594119043","19533381322254969505860938447353219937929507327716748825809064520539543455254","9403823843450196420799337565010549178259435908490320872849582783166065168282","10464241134417201329419510220104949346527274013274592882563416495012556125132","9301345819661937440725860028779312914339790525885214274554275091844623535968","11291714547013661830332569817711684505569815478772306103530109513027459828741","16566712313878755327910485384356179345881280692463454520410105624337016288883","9857254387540706281892224858708177932493833333242386469874406815551456850784","13235323444556237974521531300791907080635475702604350856205423158574376182435","6837328857570342508089383303046615979341710677796715226424263996563411126589","9567191971502453137803265066675229742925788197509550723183106561667775516503","13589520733675005345281874911032983354954922397198387703860557678089764021921","104175365654736775178218750541299505009591406942062749114421467907345346042","590163818614270202706155060786980081635141531931653658533034907216652933183","11630836030911095078662233290280414853525666587225870019070111475894870557937","3143463001554546949388574227992235144909572072667494575339346439434777710214","17210674657600746455132196643290051407032499980059412222084673652147666262244","19558381360647054135714232130709740454803497350056006816389092459633204536306","16883239974151654186618501613502254189172694896294262882551553603289459762207","8413661446386279271250258046703699372256294759176301597443419113141652463386","17926420509822647309653607861708033860852594098459584436645268742667896895558","19824925766389886827250259916041015429740610094218960702010388823681796598372","21569124030016608055974854740419962472020200788866623348222538997741654501795","14232424310854472834356314082148076539296957249563473004688613559676523926509","15193615028121862883292210509489791742567273312408676269715846648108564480216","4571863685585148023589373809103548979799867639025504561868195666694987162026","6206779924996162752046602034743078689551092997538497731303258570990576183904","13551354910729069809580067054835607774880530108885793285331679609370500875004","9899791381683262402504188099370233883995824403872277909479896171174493425427","19676726055572810021222964113026140207269355942060367353065169172081559784672","842852341267559061264418048500907996345833086685212080144270808293582991176","2374896551530407137601201042234188834144647343362619212010730934843698743587","7541169441788393045940373474338091879780271077778260807857446771010926024429","11136936778745143751630950186644088027953411966465838448171145474563978816093","10104692900610618203101067220992674388402050900350351026933004613495030125962","9448067584436414960964337190111983737612300524270450316697483521460203416821","8950186827869639604172647121100447815900277491673507364868135313567370094566","13506425119440201268368754328546416032565667481881592632895304755531522876713","8980168571796290804339343950808891004720242960395088290536220280570423270238","18170882696616761010489613056792567852402646771641587111297862995908970291284","17964914132412404677996740117340161470056406021410685722116447488755963163990","4999254529824068728272549382468024522346083624068028557197677399460354032302","19863286783514673257602438096028698340633489355546438580505275806712888618797","8597501472019579693110022148133358484974050449265021769883471363830981070438","15745697387452707443485700990949175358831586983137296283366195319537908003288","13137385666206357557612894624274538332141042254638811649741671391041335368023","17489444249761129472685381315022721658390849238308934118982939182052647535064","7817235089381823509145374360042255112726388997005284838446772709175711038688","14266303771668205536382691342596456410509199091923271798848518821724529136059","3636857805719964585971325322044663359458065705759731491721865284507973354939","15992868605947752108489235540799285759772965578817149705232162327368620329585","1335686142273152709365597717137409998821127623205060581051968539417021206504","6433290482925748613794540660743040431650259914794007152150057855153874666944","1361143257838811133926634806224247744517655450729374562521500236431831031476","18225681286815161411121137668234617452312048153276117017888242519394843989168","19843309075203033669895762315323851121116692526905833370940041980425774744571","15228011749951502720507138380119493145011628580619540200408217541371854380957","19619902256720178830677177598316556548461566595041053642017410940299852914682","511045245706260898110690359652263936223759289411819460157040898756960539462","7391377516085877772042712644814217270885890613808054711267621194257918442112","5891519591265284241203789998585637602270159400314233944803142442234700250863","2205432830627138420924593517638591617200352501757865976823844451062848337881","3222440233016699218240995056566298768106156979610420431469004199306974269103","8738332104312050387266272441686236247554960069301415997266286065690829290396","1551797112498648676836888480223639601740456286931633071547538018561520713544","1533866262507880248780245731190869299029017561560482981975068249985135371067","3996384786620540375232033672025195552610224229344345117985645908694200761016","16595891332727724151340175555326766529692459983213346368706615677339339240020","11523034561885962354991131363057963624098255825893327869682794018887379424097","21037920806606953471816674932313658324079485042735787472381615025003112432904","19591615019774495060998741485447874831723014393820542494077889189192102109031","9121850391530996471222427082549856324643713020999728941399437734853739817153","6849010089591794160862035089126940514820060634802302095512422500449021208898","21803985179639408855590213016678692901492191793853596659193109444086006378119","13364642672122219159126189111975702569548137252134210263160227802926124348078","16905269331135488328605515318505661227228474740876565481132283687997616028861","11264009642168330483857233256241513200490483139661004283535705073110138982890","5332394467645666696623235864746879605637402312414276534976098157513611666542","17925301199630013346486151991337546692422339664903952576083922784335751134079","11900184416418670354965232151665958518848952270854151924870211669630781631223","15562113593580216239006544427542674838265849698433044757495991364465187405884","3806304128817128192424875722779633391243742313942202394988632791379590507084","4657338409098638664678315846850627043185036888996779552648742031908099581588","15813005888849962389158961584970173978097218996267117171684509555319301477411","17056578011328104553093128374315470853531917998809681241413306393882725625198","6430589065893485715796702045939612847939363293990681504299985210155618562864","7514454699643127952791367885323645723388779246392186109883710722291187240497","7826937063653788873418085859562133984976335940156012117355343731656725674347","2225655582871701716469716244290307217751235918380896133272619906562931866876","11565133364312756310075478066314302953761772900026528225403220752431976340190","18232452026689223969965820968016739847092564814758593382764078404018135510023","1358358355244320152796507416231954843591920800744392329047477141132664693794","2597241426605278043922861599217180508175107341199392281858695037638300643180","17674515264858256312450756598079170929596539962153597882812281349637224943254","3143421480716849445957518543992988300614287126569006297241763368177602468592","15933437847230001720929677769855858682918236257655835442179345528393419564882","6733106851709743508924920069771721545927217564131624545573720030931843427107","3903499693696421946995265411390118861168305725858301760878023455038512768658","14433872132790123652832156520925166553485145595432897200832458531093296216884","7097617002748651760063122634260707663385999924497452509206216049717006887614","9196893673129829898318166605040425641260075795136163048833535143632480806738","19140091520550535179093575244921354004409797700450072348027875067724407780771","13815362122463786845354711610276132099779552968788780241453140843664912171289","132329010991610972419019365039613190472336282083377290824055198940312830513","2049181411991933045514610569712374231531845833062261528528564288748902967619","9942692693883003669846738387378238020204191501223875692726715738542841527104","6283754404754969631949771092743204859616073374053464616082489188503158661340","13531881648062996717630837244804254055395580039994975987100053481374744485749","0","4956774473297228218177808603426275447194737735524046542778880267774734984259","0","15268343501033916092396853374199187988748455820543796633535012025134089057292","1991575504460612223546114865299474646257943304515291241464893473242019507707","11901539978222853815864157529306856010584887559181293189216107644984836321368","3178881295553794239860506403451650450933820405550876097900040137017296879575","15695350304883360156960130477307936151740188875004492120906277678406001655837","16826344477007765768790409751973842888553894334227296177888903209917977713224","2009106007901283113943166088308034082354600538473906484253318833438816066532","7525444220155677323431624491196796062450779751944523627149064690527786953396","3114202767840538183458136643348998964583459476932153867036980031962630216500","894130084419891374804457629118613897039453180155016420207155096590379571637","3754100530583241061913782921521985964143185758859395900224047980883074578474","19835926942870700619272568183957007665273155871741504510470837619056870563145","15206669438158011768828946000639324293652682629446360504608348942311693201702","12893759514429389857051773396811183585585943540312231051172874714074736967045","17177418268758901697679074017597413135587647017560341550385469590292455054707","21523783649819343177656607320968296726328369806556791638567771067374155543541","17926934714980175136370185007825473093397070734787025872166057825582804883159","17172103335496635982048060007321904816970383778344287924940070445235226808229","16740394211442824929068526940423342980277871712926919740734979435694246519421","20534429616991168412824631579248633481807433008205619665399010410261851703386","7285147938824760852043379553512169493471042454820445180591294363798516953504","5858338065191558857399447934989268372377549482718256795045792280571261317676","649267084902835194895506892484476195243896686009115916268240569370720482615","4412344503212706030725332695729164257890358855855368398754391678565647710647","18112825116641850778386675294067588505837698373918324518240221651160261707525","13446941287005642598648660867624305243994406520538658464353528872741667832519","10354651613021068091280105061269139828620127206746987828693496831820991384709","14685888153730538184178501336632865156982041104412660885306971119982794203193","18951130805137323463990557961132198354618273024570578263850543915109063907214","3236986524159986738626089458635744735171106752069061563605878206760339205245","20672111644240859945752452163227865194772574062338164361402602552229632299540","20346804094507020819968047978749504635230774669530457820055786318097002987396","12177427221400458552053297752263784166814439854588025146907748683705025503990","3996793204079399282264727485456567099392754752348921747690725880902155774883","20774057399196846352489845718608549179132176576937861817866452468337600283246","7763086135164283077240542284296619630597283484252132715921373766901741661059","13192156320266213371869989251714697546302417317610411067707098188447467558294","8238415473398561129581686171879002196315831255195357045716133067849028513624","21672383245924124065509225118144789314521306926347712971658502967127711839752","13012020188926047726028750104503252116088164905278522576140239138615712886391","11531225864393872879130267963834390213135457028555196058082689632923978578504","1374429987836832024925663332381688377727183283535439399463358044766820403865","20582661762103763063532366166875823465438425236626828988386155738229497274626","18309481389731998965735505337988742256122273457572191366612888044363307609826","562305773913117542486838766414298801898118957477656487549878592277702410545","5661344675371593629781096409597824041496339269437253834648224351932645257430","14586397503536186239346683770870509842644710312929463730564598527436463692978","9546838857413394418775154878994184683591081872458942639968019116746938277253","4658406407242717241101230128271970590483603870282147488363227597433510166092","8487033676296938325562569752849951186192328003797155928293171743205223787866","13830817689267378589183429023447038311434578580343821956292500223201184276065","8527232341960925240093423454606733461221926098288184217958222517236112887462","5309819665626127251260141199519708783872167931671516622942292467800758829013","18426044073326994616926011295293612877583096735521798219254794958275996970106","10311340847007151918639209348810222528468931770232397011773810857523831534643","21372218333084513198315237631805274915148808971437236022117813339381580539314","13071258463998171088740581568457877506571845304931952853918093420392229938479","13358470148052657908379478071077874877917857080797200693638169669858410074226","4996341866536120725897007084818790395712955051004768440706180549650386359725","9245999810732205515624879891835600494908101021573195580660409568354810662111","11875891622772625040459349622604772388167406101803302091951618456850654054901","10897379450288831548596075724258446019416400381306305751899844430137451290550","21031001881432657348536049054063831665526335293110717759135830866530137577301","892399872654444337561159684752339886536591197111498717235789614721215542958","9217454942694727659283142214740373866589259280189873069616243732586004262154","3183065556397129353688953840170828971545273254343662058034962119947215914741","790061001436300500670813968286056627158323695471625604573302967314706199206","6094110202748122994882364999297794704715226174318282589357947864278534140625","3116109249531338193952352688636256706322994077028946894694080341820665229166","7070308283511555379742293522766572177284404099585736537387238626444882335176","2616215035185232844779246882667097461878620810633059006336740809881188894551","13384926003198521303447082282579113555342674460322355598715304513015516295737","15124330113880256483235539299008684969380220864662269326130288528126670818728","13103182393484386441666041524089610044109614498311759975800209774751276664476","242640624948841244551681446446860616764949736713081765695950024876924797977","6401306327267387009363875023066511762098660245437220667305511236867842354876","912158516121724360946757261638588018516344732559839393384786394370589733941","492412967391049860117888030190510117286718774561242394912681443987590808914","21468775233462144014262544317068079186166280220835341920500890437842111803911","19505618008385857991776026195606647720777707229795976329000911152729134159670","15743570610032859304902863612577958316325762049224304380049363630414876191242","7464088480431560082762430258657988736901821029940093241182933924376323036106","16259189674503681196721699370524320327422234012317071914605488973796757411689","7767696758667070766089792291118563946930123979261446866992810608914989607727","16114922267968270348578257876521155587032608455668719085462194419339532226364","2758595278431831065434780675120536664419646065702372026711392389016970114229","18686113850430112050095545567583071375793292857470663465148099499102632473309","5322569183894248800263673514874583622282627840854211368312233993262710520566","6625484671021539113351281560380355405142866337294724413032442559218736998318","15678494932063414546031234987774910766395962379039929181057832621853237355283","21044429289564547307962369331019397005789227838030127942012294995684153106988","4050352520468353076671331828580448554986143414713138398546692489036092654188","1439739037680633445304540112000249657437660715380616363849191674297153360316","17000713814571928948928596512828650057195156991943278596791869478365054048986","10039411416942330506550958143931776567211338199841725026568671831847397031229","2783913374091579171300707409294096964829607925471146417306345672104506551798","18831208237852006664103429025952176630263850450528702816723867202301425494525","2085098779219188048466154953345173682268609718189308109525769165293538377817","1061975973027025128869048938305675915509353618491584582060466050513776448218","5859169958359144313812718938573224350994660990425737360335282151756081918623","8124040687616085794332441579369944565007529336423897435297416312046654743679","1471576261258434979846610087689106111737341868166882796330645612597893060982","20096077713782165175251263772573589078961546636869869760191781291136382731114","20002169029520086001794801051926487839505647155459890398103027657173585637095","6331801728452881569711070386255679428894820373603843171016327691491354479146","7619172148835984663765033707816915118788282984654773026178320231473141279577","17258195073849769364355411475972610512919246043060024074459486058328960089122","11523331853872699658142567202962572695934907333691215222335354015651243006237","17304318129246594195502915693617224894796708659046294191109529542898384047621","12503557685051078210601858730253734848403320555769718730737467365470303706064","8597523832811491332463787989333229686410340771107146461143004365919601409981","5573808641408756617065407422920939745822915686997698756180760488431295699203","680380396063170511955934886812097722815595252098460413737851820955267163039","8712348930015407902946276402274155609654872807416667202633920963572381787777","2143256560710791052453192315538403358087069751601480750145888703451307078624","10165267555852012947690671919523590802266279591552015699909637702311266821703","6154139066586346925110455935852193710886002351660262412997170823801187658969","10797801710706169074454684753604468383030573500517082039557730174069104681837","4352510540029328744577395963422964421656494944462296812032895687721648324617","18172637147707713149277391923718739934662234396190219725555565713883085342211","13331017651337371130140111897278519298272892920042425475956549826504239775183","5096293804838394925323095609670882263918947950133415481999736312753048651626","1477954368883064545525969267932777221906039879216118233143055476101555942952","5785051025266336115174393023611611291501359164041057516562991521572201522529","10146392897807294214486414731983174724200164032512315843147088120632713387393","12362106855368077632727839538276021126255703528159840694741191987603096152682","17865840168451836787642382976979793351786456493096384077628607223640625170634","12435858343469608889189748345168550210079622384420606577144400939437690566825","250972644799670217197861620506628279104005830251498326767265313173795621470","9001223785553392683209714358621265904012695057439235774484245667613914147988","1309221989238361550533944870502285933978512176233510837702047057519043359830","8644564044205173998182078931525410917946259804224186779106747373661509836260","19624982699558820196304151432348135296945504455213926782466969453696916606489","3864421529378437699128150908697926752152026918884315700381255164087603052997","1958049682761825774417906390522999373569227917701053686252197903312948569099","12167907748329865933004053684947284030379129365128770630202470842383513251518","17408826560116516544245986948165454258732558480509024359245310150157173665554","10082438806890290593559219904867365777235436098789816845106951903520725824539","12644716140772223206205339271483990906417098607699861537319215142990085547684","5333683035288297377410555895451761420819444996948496611111835390724263244176","243060332072864390490065968940225661040364391321871587504646050584127356530","18199211436562319030481848803832082813931826084919672990110311018412407826133","15501439089553341613474441657379069434231053776909598938289026904339562776467","10211759496589822503756491422924084966612658179228530211304104147449470010167","8694526790301911899040532832909976399683855732911150828629959975665265460125","18917335890206389975142210276934292596171198392699769674208795938185779781243","20349612678925352296837761838113733555269758029206907222893840222151841845982","4711918817191370908665731294850351331492661470937334148161739728997680499491","20420930313718769240606549294796437192848049496057229249988788228004151556381","11963817253705060790735556403835107686727977102366780906012707565089958624004","18927479086766092512907063409757193407784199561377991896550147041011891954656","16086854621840714076567354556766950475380540240419236853674503374706092557562","7649813545556381889095163318053200570445747027104439942580281064681906169583","2479512249995713838311018128654752074496338305807193011347598619185330195994","2346035601324402310357559081594085679054933988920802478604068524877850016165","8355616284741545473771405721383569754997583120578798966450587860710065575348","21496298975540704215929335861534216493525290244000560032445947945485603782164","1241972191532383031210014194516191174225347001373478704376575016483446596120","8786766472153338511973666316624655064770315418111526718096759111544866972566","2790848416565784757358860123214157920808489886913855471540872549297598706625","19697267483247535705017911865295158268045154638896519829241721519500662898656","10855004975583971433505530744156157052202445376695517890491732993014943403015","3307138409419240516368553127105710179295163813339994587088795146799493191574","15071899476760622988231592898781823279231695645746570232012832365184480292781","12370370913808337832126191280163852687850585836348095262272559643754283614650","9619287458519354097076811003504062128667896608167587291870227695128479905066","7053412983942702021439666397899995720436247314245813233877959997480420996145","14336873830115607030503680640674315378851285562266113956057915302163135796126","2982459332256562153471757965199184417038573913753526444148202646059084621536","2263162485414508992438338093271132761212297813006399827398837117691893080842","6607501043765608432142359484878159163788335534386998552269157186532023292059","9458289810648986698878100050303113414880615672401029157409461366671149828256","6210563751175114358637825958428169384958432585211717149563100353809344728975","9061565527944668050570879800390996353727148706488825012048373263533460957967","7370076629450557464197799264966589599216688486111459344868817539021515588048","12785726761265753269615209982427149298165970108315769484747016554219769998789","11878087694479344057934757851109464763092847745546070478570965896990597443471","11391222998092956901470975615226364492444297516850417524619601043821719212820","221276078996291633123073491556519609534039402982765224448250964472239978217","13303819467267738582376680281528564621833366590114886958633810718235872764044","7417875460505775651394249955174491132892131966808927604723492305496341131906","2020766581450468169241576511815537903370498466044157393534317098899938241805","6294440028137816630156279162637587103755926825490729410565855128445577896052","7981790388288600144357296999402703191161930359504850289187051807778035834530","16867766050225492947997094140333889823957416992532088853574381451539577161674","20152174815336365624241530386485984852319760261776884720705806561707527615292","21605521433591925079955992983849344099581990685060614889282622278761663558980","2286860303373858708797843580152985202820815774576229020540429630068034253734","12332099424006283357272740548484988244762950910107100866085619924943832621196","14820470905339562427758929791309637474231036203230591431565123464037930230827","10656708434844362408435173201750409233112528101400499094278793363172643916458","17108304793667233809920791598656819203639526792596093761664114988130000654870","2776056854662399838577213991813944274892706180049163620697661732173438416968","4257014838677710877481260184253810428063151436900779678848411578948962418826","5050093159585158546412480617748567927812112016880240414839496170710800001765","1427314635823608480147691722001001809705237105866876885811739881560527550923","7856682833272092786224014992436092374983356055870992760391783758878943532373","11997222846668736241090844689677057174871966000282606213147356115508966327370","2633981394224615042415219599558342037076807664636376350873766413821482270489","8418793684559704515255726392210533359915714964980507264181505051470981854803","16182308147475193437792795501772907054657745460863762682060208281693449360074","6460195724997286035027662010099928664119482351968002853221029055511933699080","10942086860713563275494679565971980559253998525047642648414365582557692075947","6837348851407752128284671531402228152772091401531713757274862125320476692802","16247560353804957106084695625294264350984871862889068776851385460127061959303","19625106958920244252782365603123082965540698720846506881162808092082326452558","11904664465066223427439604734952709764641423684940638876055854929209195778504","596992363130907188298230019834975400095753761512019653738717406340170735468","19601667986638293950359301412565084476621041322890715864358600255138502148343","13323755512597739093381166653631714595776834594994383390604591519630081064352","635319023339081048884418572684131192060532929785090880064809541655956724032","1838246925016638669804090639537410806543547831682081025109597220945477003826","6957063396639585052889567910484475411107713958144190774770212006162810039977","1180029464211881174149154559623105765914162418614149520125026244406888253351","16908116785044938444516113890804284988741158512700331424311822955592610625878","19047511317391245770733548336384866723144334473969651228824781084792267718560","6431496677886142552593348803061400706409512947793604260543541320489042213509","2085706975856716043817845111247524725983792569688747134217820580802417064710","1115537774869458691540934321725770611599792846721451469791406285551276606981","7026002537300307494495439331909216065358414799222101508037688646360045099605","18130884396263326276412315018777651213919547256523617822369185259909506866144","19281260338929175730881091676996897758028583328171003716632612503005482005254","16588225225537212236652021689222338040087708398565983072730653112859609932774","15270628479944506228210873275859339540300883571757318746942561045392375516010","913642229877487927864278200010918660558298629674034607643105748738388473257","14715976480950508525942065790425683734502528748922782028224774135696744207120","13078972628916343360773748202951764256195594012695885123087240901149840845932","4942048729608056917234686680936688826917023985280996368768831507215897617015","20893794971858139489252786096429666114975805097505466451190756476932883681467","13015490760668283346847636569354065222028021012378102388437827197672584118628","6260425253543653451449270276729574291067898837831368647751150557846019741433","15923365245425515168971537301528268257372221381082153980832450078844982160690","19325485557827805129863972809470140787045220948725614656551318506266102656878","21750756342339175473834098262062989497112492015454506438667352249017294569788","2102370673968324396719114752599950196139819547315750115353646213108076712356","4998291192978343852503292600087996893642591869715997050428935676743028815672","20842299370423286594710151986946625643897640697536438338374431135541195389492","10586403989665118865526340068104904763060048914917352323191379856401112532428","4809740335351310670956646142294649972831844540363789981063786141716836290310","12401683609831156582692851843738737436320149114711815881100816554225649611253","18448848273413172901119604732207100673717679052219002564981215143860327255665","5100009475424842901004582243389236542121424367337824765690486859591754059198","15052761447822212067405216050222106162537208256668447958540169530835015064541","15203570575451941684368234745064806310935082934573870961284452290397220277537","7011500067739058094241874858440011385105123562135523418134390872645081990690","20284522327658079171256453806931620239519596408800532751630519007885849799220","4069076051897379869763734131426385973740649059610210720075367504504354993641","2783297780985287417956155801606284365270928459499385941105517247106556165919","8510591090202387138403508676716866888962470895491352804230634117706021767997","7318000136210907289537979152553438858209124950522363109906535966647009336613","17765962084307655705811295678050935179487033757998195461344713576557288765471","19587588259436856270972544685172464983467341250358633588437314101987421993981","8813299950458731729066861770423799029523263913149310364818833900860368430978","16360512882464941076332263022563180235912995063948326734474971524177813333883","21539303429249458709443918096907027023812718544674710689502070233840334338896","3194787531573319946547939620321400432538153179758058041124508989040478306247","14550263724823354762624597434286348766501934822081588334675589059707524367386","4762066029927074006557468787262677302992598560453366573279123706032017518691","3307198626653084251915858477145802723511448739653842352049492307694578789077","21503427039267419088379226163606788236114859581541934997176536618703917919565","10747872195270077093076835049659431420170298124805316539928654438399690398794","7936077029433473419850249825765589828336166328264755721818500963734671060887","18421921356520457680643410805090142837213318532677969454382843940931076456903","8795869917899145287881225926486595752236159801457409313558618232695916912781","9220418966566317012035310485032019876764484744108454038147295211893382299651","4509411175341067651418804820717502126860890538724657113392084644857054897363","18600753969592299405035242530094199444478733726104127064192859468654666596729","10100144219830699296329806757512230382270878773809615501300237958705600594411","5584392147549827507534402312439494662652570055562759610737588684342542469744","4643700462073855659415658467891388131544363621759101362202137795994593226232","14999101476838560982597529318938525107363749558426119549060180690235367377595","1749742801215464726221376113115682763119502185437942028338979018225498031836","7217214053167112972122978934836362586921988010139986135500636040464777414903","13350368314772033718223351745761596239457806203441615527738869758236136519176","3531319907680487378713359429005445544004800972187670329763680562020524605928","2617241275009032586872782369192273283211149352924265580059473448101153028492","4335568572256830794624423834281152236067439264607586340531824212026730762040","18402983565720028436985863271597586819039471794306238995563477442057619094986","17481055946625270651162595381683989493458485906220788998074635823857201759391","20678213693662454909833760153553394075445394087181580987098681423153403119252","18813252458150970201162210930039430826169533911357153642640511727456083439526","13706013703237737499951184888599169311042583332312265064831702723459992984953","5276183322797611522374357301800566272054591898551892814414663276768405505798","6220369583493884013308733411206013619096400324475864479420497513969767566943","15796441515161181042811402483908215405839700686754755812680156979577068524745","8882339836897259842652057816802624845120128920511588085166477797350766651261","18385472322902636963844486225283138325194723668732897514460264725264184886743","18245594373732537616685598877270446278729035771538482271893328862927488886822","20810927059727826691492873488353122628179338238756261487174165276561540036394","9551349055030755055111046239969931396169322570802776394837985148929110217739","17521378079931741344069826025335265620208705284376706335625199050982290155587","17449853027806717688544884433525568256647502295578720399431706934548569753809","2208173407728418249854764791574894437297135811566948439159452004438877701599","678547620830636733900467735524291466887027954585408840501510686408417041630","5017604836614881241934838437543877435687156766471893147336619935860473256797","14998643720095644268532468852767021461213698918483660074418661488108002406921","17898344110262013652390330763110560890588353123155866577387002771530665190950","17376840467006235410235393404883328056372680889805606012282782863161663875746","10113864497785684060699584364198988871370303248775082784964500855056871173062","4559202895222748568060070782182709720006136525455105143965623791506809641866","8301950795989204887708401124660719198691752284555092728571375432077438105358","16794820794362934111672146062818665846907728863622060961890966230230720824280","6308595937485122529750380234310130079369375922142927920979742309646925168983","21666215487788835037688487565043090826379731857474694573133992166768525738108","221899915559224453830708327687190978924005667567218685650885062460885415911","184093017078896451627610391377674885842010996390281170535815121123139256897","0","4956774473297228218177808603426275447194737735524046542778880267774734984259","15020599934560072742819311995443257102373150247123939115027410387178852174383","6571146414671507112385062596539640337548401531673253884883678537612139862045","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","20800852953915165279701731251313197208542053838630506717918018608743409008043","19637517025125411543094643600819326569442466502248345471095866020437323926584","17131925391885937058362808388683250733730451854841120606077116736590658055909","10275201208039256479362996766961520593397956508874680471558097955621271614549","13775445871438135597717743085601394071451098906991406527363380790460962275837","20921188461706731410257669426892072660245547106658738039672863926137956597475","7068731337741353707772677659066855028504354978163163329989946130870562802087","14492923398457611690977760765198862938916755475930529638634261396819273071710","1534567458502314451671203625376382303456773077488730271470408163975031742876","18354836306811531513969143414154384246381450892506596908347832328390268170984","5062103190874202870678977875389098512201377555551583855608475697412308156159","21863050921141162319270411552010629727018308949094968609633027550641826740489","8223687585016409650456483489058168130305896112816368995280842148036443214914","5678514600953279989581064341432760462203259070047341038758199426150714663226","5790869563885168188219394472156094596785515806323141275720187991017849379964","16408292121106481085678052064657643261083082816376367763237483327433742205108","5283007358713875716574089352637339086265741377648410420449128919948271631928","20403866156007156330177598638809149799419703185179436346409573334091110295603","3931080215402173587194987711962240938029106786078828396601706689190028306826","11180820962485005309521819111207469176176491261171652707854568914945492355370","10431100899884794357249935821834399632193310375149945138068070488162885023525","2318352549145843068967677249013967707638699794211504690819315465169075862817","147782775991416996267980707329320450334178133186634033976320891741838608853","20164175010470616883026489154582185036331706146166025182575654330739447828431","20082413891989871672665284390571617696179114795111656839508304816940972883683","13563518383615306027599983960890827912630108059077581601112276993388302166338","18331750094720289887435265582601304059173966031373353782582955679400560767183","4986461447279038243498218401523537415216600748231945581135138418026778501202","1855301108548005847265564329020111699229386336206252433922958934964260727057","202165489188669326132807606902264274563014094053205903210246124580018547334","6655371828434620793069381070451984021522613649274148767467549487940352307713","1906493706576518357804814208533412219611940642616538724388644694412047261090","5283260120021228177885521440576123782878298429517478639356327205388406146887","3457524287437302754573585166868310559470894649698441701267954345814080318909","3013319926576463129284969814498998473755714767021926618683011911770220213263","2524448462856571466507722624705430233525255657304546293742362121535437470526","7458236756997406439473578392832386717370092023346333633389128856626647251853","17276946075717024767643896419337266825098707645430284876786550033262729764663","13770360082562876550452201444608061558586008178791514017495021377429391785630","6983230762195661161111062872684498890812703398052734120062281261508572381953","11550243536486020289498173247504636462113720832953668170648807590922396468052","10743284146418616497071052531491180428329928116861554305536835001233436484222","15648489244760721907395312868398253487104638489734618268800331234852274963187","1619474093349218658754070905379214408091428551772311120346778617417747234585","7483581799045886039971638195495258310406134512831089307069369854928065216353","3305560697686400321552802584904887496583941234340660899902299420411363193841","9605016956768136946858878511011228134594480991562917428994301171940420046947","14000087697131227944183125235792191524239811939220478963875620998902378923918","21409604652967323500505645473533175991268239532258119471638457690561695823859","7416167539973463884793370714341035280490604862869902264078976311917046049818","16656748690714553961373658037649828111623804193985860876193218779037303989376","18126875283673785905463021136941960044660446456284810591440936631725862067625","15992305506590638390627912394276180953511836808058374683334394266621505097165","1500603340629377031926355750358428270340945389151979209631798539490509462313","16858740614736996272728499582568108676053182799270388444628065999791546766252","2526533860530002429832263381734908469724338499969900157304805275884976084281","14068052553272949447642598467828447796947053512343127245586466510925612650222","2595169997633131822598271573774226989886327923322777743673207893352528039782","717544360827521319573145518556015111732662241111152008214247219704688645762","21683761927605653765257555903066305704452920250993890452330089898442232581295","15017690644136973635801820985102104866896165274407812055980894786598708097716","17958178981066275624374751040166872167460968320743741549197591608274805451204","10743671881677453413206994559556913857056355225671373795144755107985058949164","14968270360636450526332875777038741015883062136885077184633194090816189537278","11036365339059614131502625911715497322523990266071121757857149248382113116229","9792617854789273803690563845446990611819772706082001052837093974113861262658","5176825492333344738861128244946472882355252850938020207007824855766170967514","1681502771573743691466896168204392110865013317893081160456825505988446428914","11274136766533675504059500458218425573372573604247375548216505874471074119093","8231953476579117928899082651669466683806231172627853588615340245444080176733","14008292228271998595079333007940094146980785460162019168891125058577411037875","9561799681581992544369447977094037689179404221082812996782923843449893438432","10837432733134321046192392439909030181002352224519385453276809203947699585642","8473576508825401914663024312011581385209483675314635453081965822651218104910","10938015929139916391501256574729469835227526158763735700288765110295864715423","10970047472783352649113368542168031197537813388748236307361519865500719892116","8217256957904405570680855987650476046040835131138759785733282910548352005760","16947759384730242837315535293307408195798333587889316777014475973462519183751","20828786081081740245197772816677699716375287470931394145103299208671137980728","4548785010718188507585256584958027182833931512721489188832467141668531530464","3444095815990163735567411376285643966393543832533624107086993851870748011591","21412351554205603558560947794046637696853821878604961240670688901535834358109","4809607585612698998163071932522742412806950821610110407272085717238387786453","18201448307727407208293135996438216164678070146671411720664697341763217892686","15148275309925046193313364074834009070693282804956177087628016957056101798361","17212189019581296994734101187479368823355718027532223901119443771333565029710","9452074805075577843977732328111072109079544577871443171118191041130221226030","1518510376928189137697592011923210522474691071478499397600878144982637239305","9105659608912038991507885305984201728084794386405880358754194125806112939402","1547007121594912409196168514201325629156228979576173723159462999233481775753","17877536886473562411651791990260330862906343337434329156199075892389033569058","20018232428841292912322236332793682964287044335047362917356229310181344094702","12795610582894453295146242025564461425830785142206046716936285872174835697173","138917001805879009238785772772727038581509098759884749801002569724589256727","20839567880827611313913067480023950531418803861937779861017293153899021874890","4693833060650845777453602416157846281709991079913390700059389719552028920586","11063830608885832898290485909602509991149870026108589659700004310017310545991","13655160511766157554909318560181656751857846987211597492841603460768442778654","13583197062396015634602398145463190601202016745073086341531287376882167999789","19593109830037210032603257626916277083757834120566284187542213115829832110896","5808045504509063029281653310463681837896726380509355951701362955953755766497","9916645817774681651828386440191225764980441377134843611957734204710402209732","21021841410452588680943768866213722730562087732566060711818235067476546332102","1328901797911920278980605322760282297690676582026575379730424555956255270287","7990014279717545852460429224653677884486427448261112721413945751528119932439","21788573547090681348494034462487537740304516272017157060728696185917160311359","7318196305184339832084514639343264649253013581475809496827174379407526573834","5121934731831852713447588944621960338030446891936535541278459223049637654108","5047296893187988423204769174098015717307734361170653795349981818324730232402","7662799757891377700716456249909632175552898602390794716114936989496604209922","8481681875283861656493858520671022184277761824008049192936786815820982029034","17384085968354796183812430182256574891337635704464041695236776677975372073608","351847291761995625299503641588532696445489644372754650102000998657130392366","18346017095827432860309117460907204230873430401265883851770003214463517895587","12530364241296294143391558013912087063511568001483137568507794924277291295622","1453319431089160978593449191277677211585847906857708739864741167563099185090","4409292638060270164528998793651815889564980014246171109319977754479235612837","4912656500609713351113974512236066601785692266861512173652568134706793536086","4858644212798333261520694726068612266732835566549406176373907341501445147003","4729796287332722014047402832191335133987382356937536253986159382952274661241","20153694902604730742266800396854044977964219406201479408628501331575554915534","2246237554154196683052229449181274361152525994319819470031299128551461172766","21446872171783539325536889070414254154753620636693569685957508948111137576705","15523806856355966439308424449616428231588735329848537617743377119161425965063","19430099545167544182363778459846178588081655328937717471365671773009202455037","17812124303569349289007889686491697667808352804902069991220159140591928786027","2615431786994166921035062630728052388038797493073765637192655817923690822296","7466575407465698872310716104947932612922177006057764525473968855471299501760","1568559646838940587422952301547054630705654939604152438798943434454905772094","16450114091237873959912800396524840399303070602965789288489241444724054340415","12544327242261247081356134780881024354609886005858079734319643263768462109298","3951189432525127718286118344860273719665578998875454166098133266801666448097","4684498636757721257672604806701649066723187747945139598693704097455330752246","7913851146292070962122661750868030665527311243664676556744302467215637604288","13693825057163630254198719260802906670395995075429822925637197637525162510800","11257936678851657411357528111784849899914875900555320409552427342018776626109","3009830878454912770286031430239990083124511083643323830025743329452432760442","11255781350895373823952671865487602212684008238766606456010353145402647299621","20703947193811759748459136395319722397893499584729354540114463717315911237904","18927236606919050665495280857793179280866899971153078091020873787561910660447","21208171312305087598895861622234435762763862899992768296682082769136982408496","13003644900902803665290247029256054448679537100575636702611458522200072408069","5473910709076170351709690614875062899058178996149854104909204655073693590718","5396740791499115651456300775929326781813959665924671440180584662261507716345","14608261260060536686613574465412211595158438369022778316883526776841385120692","11716895316353911597438772743005153995110366877152357690211038319567629681858","825291100640455876773086336494198796686944339403876997635060839259347591439","15131836487938806014426502448675727338490936870373243227752287178209774629560","9530505315934479917317575510664040836322601782081521335426112560211750963067","10076960225848838827900741485794259270198967014739774444563053174731526349476","2510923561491809223675031845489427723237847936839068014582092991310782772647","17623373863057439484514395529244363795826608326214680242497255650471737944065","19254757455558891743347449304921480210555042974764325624888942553008985088887","1308981555541762315607879574001026783189188588713693551262113824338075460083","13244418375848503929271695219020093742356576856076590172634439535108133587100","19362817571890280238405906636118193171711512699068613190741449281651186213947","15461791478280659128410317239068204606301666045485267872815292784028372519987","20415790267817442656846049153170278049323991404856454786146369061736328514282","1675425092345973426079571139973717567461162339074323918493233539973949363080","2406291853646761879939570680825607281847886147213112505748895576585158843519","8085260532616940305492373405634735216476729481754444910186903275762098872191","3912512698099563816951480690586011955756727244798542766155341341505298975111","18458146202387438386723241440394119476346283206297777332230845309804372870506","11755102566855177947535088692958671812218272433141265138394385455245793172827","15297152988073525627618405202877312206681048866156655726186038535484032545396","7164039784256021764265111842056249353019938833034024017809741044875411350177","18117693211234728313301036865827519361707977031781383859909979617555539954427","10996246499181496366801125638994134058257475270624048027175258190700427424596","7431215567561721862879796332372889653781909073175518128078996375618293800161","14392096580471347460488957898075766549739963384432083345902389045032634508216","2122192146049736861519183376657707765561457499563424195396206246579935142840","10256560709345835944687100803882590753541780961115827069187202150944107340680","16183821823551662134196784677025995628908561391637893029788657854565546003526","17799479956199141430859217440701567787136301050313443727642780551013711895518","10416914256883998062411054317760417749683325445242290590222465311236790105281","14779397864783948269364847534245295869022829926071185969628221948493790926559","16782448985807234530930392048021836422173964674956312427241645802407544090688","14321923343224701037179898406802193072768993135135381655613423115308455146996","9149186459397994047070202015755246695067694729307047224488799592236535709152","19558057485729958361934940507714021620010473760995101229249828379810281627447","12404742950531705198927681174223119696538571306856062080781751210627819272598","17369072670723312888300913605322550459382061433704673083367980516718754093119","3766761814170390381003117208546234980075440311822048827565329664575660583957","4901400009430839052255905472495426663828218482442922700340345538010440933459","5548554043405818226314898894791172369041668979252518654986931307153642154462","21515481709502223117910790816596884353079921395071223608063203457760487366134","11731067651977271844303178486259341480614085998886696632291221427316590347345","1142580132310126188845654788084195906434250024886999332926644706494983396166","7615518475005949869642573506518743949281645656979639288104391220389961787860","20643851082304414077408219942650798176193494074608766795930958482150395283941","10911465643821173067928818358919399134097282536299175752448941383520216424853","12702640540792217740436753454718920375645350058543792614948182942417115846689","449784471430716148064476341044391193387418416135616928346350591613580983713","14407044595137479434395815778260976339038265267528854273042920997958884354905","6570195508956610873426197573518874606539344909974108420277822810113641869705","9003078670028489521444785369205536341582390637339594013125206321960702984435","1573275973007329382340393629895581190144332913246810103365111711394208091694","6791168078026816421294840058822356736143214960888426142796501093416715235923","15630306348544298379217318071951550231273184428938228853896188343210470897190","4576746304196287032525847074784255599724176195692026840531484682498116377142","15864618526591215932771971137938812908783716121260351432339290319154244240191","20154317798462654520688066320551744478835081213507062396948957391183961213190","4217850033314954834518693113185374123393986948538558166596305129963326583641","739244962995441822997609491212567933809540402340960936758829105990093694875","4028226704901728469924582315757008913995336976972370070688352460945670209223","10591199388281276196076139827903028901929071722281939618112978231512165502500","20769873214273986079771211255494552368291410905831879794270214744986908114921","15912663029859676247040839483550221414191378704553985749507220595441668989890","9693027975721393095990900240985306805407152688503911448687312931574900853101","11484138150152751045203843899004183974207040034194151197586233755150141468667","16060024950720278930111806345439512258601445083798973542265137886014997752828","4065216147560638044834769735156213301682729796453975378303838760014703180171","12722196740161008042104063230600160916692591587307698282267739098104595392019","21442658871897924936434273103779296897320517827105661470249084250476899874515","13941330616661018529909436917201050211167996319696145260344766889645194016812","17946104200075105031482518856976026160272234205866287179121863864382028076689","17558354977867991058688364696361951976053210204255200572217074563658522370648","10902521568281866861523544064315280488095865806110221985358343592167540730121","10480646453511936101817842827276089617243072047003452927803825891921884883229","6643766403045495726977580197310085865588045098078258941752684370100934852836","9759297382606100166316216368175194356984391868580089414318996697912511188168","20686369114800811678648912138278012301751017059792657085899350106668064382752","2240276784633228882169355617919063914849374750013394580916118793601738807792","5389129762926746785370016690162671993854854880020955309951549075860208430217","21757828191223838980875048177672288146504494313568161156805121742619482174422","6589672340977795727478600486490482082688020181028116689423580126630216000086","8873943799620836427044171063707741355498423896746484957121164657037540932037","13160449352321991449988162050474550230515434401287357747880542980458793339102","13197501097050994905124371615976870638093928341445614314492454011032144220208","8340413740313657825973895352056539435197294761588407482889367602122602519887","7915509595726843615213771320240731347745156038257897701451096327955114641407","12716360689406071594764978435858390101997592070817784737113176977175770613855","11799168279103580012612433741693680191901212176687068912950785896805583177628","1552755957700638351598863195613840438289566583786422640903190114213936992530","7717538040594804644764198775753802442414066091823420105018618571014719890833","17869335419303568150034564173825172349391626172381176470372495087578615665039","16122846906100860579917160904118514092773318210416526909669780898790744824521","16114623241407635035253109690281710992349406337620190853935787477446564512160","8429089835636988890248325280114299822475003178580844782033335791949765717698","5021909288758969923449519368320048166705558618923758724165745045524092266753","11609780892597551938282093189666560403264400102545840409186025853398791339463","9734561960597991217192257635216971992678556710475259956187522144832750358531","10813638491244873310753483096939437342464961518696248443235952895038827482505","18663052058712080061795498100085868370958023478059914080660637096727647524975","9314525365222734972430756928736762448968996137856042241530361075805449377487","3070891224229804247627316094324225981593571222241652834112032934603492908107","16218873953268949747247900038835681418510078596341723885199658550649690425465","4393067842296990738414238004379500890796846784497932263550364506116302729814","12632418182338359794579314603327050190398968273335067439004197140400764590431","16259566184736886586335166896505547781405793629246315539479374599816810898962","2814325558055560774451012402571814942633788122220820739410071686684473280059","20338279412829767787632971674447333540274381888801095036358347594010786917874","2670741219913096168491334970723751636861418668023160348945317323630141327853","3892922157227799154715704147796797293447538770944492697942492570337305079250","5421196209553978835297307680517334106781140431673808912244126560565421048646","908236175468125124399338251190434374103447781784945338498096575397462392668","17636652273564107602080223987422514190933021331205576336366194778306365693715","13237642964137974353034360160812907385295055350391099870951039269784991779442","21221704416496446280060742130558845210799432949631006286203132118378345458707","4760938732010539612860168182130195361794840324422686826654830513617969238645","15609882888198881188317773535465797441429270866964119087978092950491961282109","3376212591015867709418028163351858870844417293825928905794220299702995650369","21425570543740282292132723103003656376617362904062035083532563051097533584212","6038202164226390018148656452648793708041019387555958551925347600525046600910","9721523909769562025273904542256123188806194958268176372877129715195649855964","12919014082719941506939437885142976246821800568119469413691028388157155818408","21047678267058890933412820510845854686111009729042350009279179228996071172314","1976349694806914063727842382214699343150764776931556073512809751095584246469","7783006621919737708273510859069326994168642573850103474571193791641445323553","13988546799117480465950733734130268128651148524257772236826468463902583439300","14358933516360269478259537430589252014348293049101099741973616463086676556175","9474800921698013823200892202591390267183628835688359957261740808407150804923","20037963706347165289902778363364556553678330389044611843700541418525546453004","19834717385187461063045168682510320544755369359400299076199146066987299539521","4620538607744049053855505445773408482178850741346990639581369035567675135548","8525603914196154577626558950234104470205987308418219670490217782779458913642","9048524527786065362533944085668320973357100178455488417116873972121025312775","9407801745735906368820522773825936338297746876589824483201629117426655995254","18458321063088465493769105335825974675378034787055416207054788511625124993063","8730753262450729445383895118589725381322125855724151334101848272326538887883","14547478919862241451106685784075048510153449024919071285440246339347145809552","13784593680788409600222260504003016581812247565511746972111819865392303462361","3420650765080622730813285352060580115144694966171377384339315837865789278996","9498478900982330956868115105655688321830657086417737707809970786192590239832","13164965619929553143332487255090729945651488864819577796986840432984858642747","12268150008840644397762847884242950933323013724025772778394784669401193356399","13188938044754060601469350653570787594998424477012300220812121256933705998025","18868615403387088416221198733774983032952549529017690432789470521164135904579","8229496080095108580918697035847521304964184769704442283730808346804969792663","8836920514787085863873040159436840030156960504558988182134965722143427786764","485860726022179166258204252374459416241771897108574947876994082085171183625","13825827330340300271940154756621989995086725025841626849532144465526715261749","3534837266022333996579426382846482531279356009099547006793408523227168632940","20861694880891403876362220464584622298009456414773768354811101113256810097364","15235466958402292861886087686722081507924755655072117045235955376958545610957","5894515418844600982921652895004096199665471191336541200960273569999551145621","18431674051297470736240376664888248824736879882201010919853670121185087280801","13163611329737748038819352294442642532280030294321129848712818446496643511212","16873948796440522592380293375331833615142971316765741607250824726656849064701","0","14352042597084731985167090523380966166849342735501537582515475409458617286578","0","184093017078896451627610391377674885842010996390281170535815121123139256897","10855480517023430349633912891071539318144989487091539966933621136564025987722","1475047252880002794117418469635715039620267508189956844949734258701523594107","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","5498573323171700318974442619770432471979388174675152408694259178961317117128","9261264167091492680322526000307190022174326030211500860420415738075544248006","2700532010941515051235117126371817675834478983550078195959484069809510166238","2614901965480154424359734022345137380599249970129627336690279167574032814318","19687862591820860089926147913441511589529440708225724639768017380338512972761","20231158944731277914957275874588281336226523231541097142445154007934345376944","9035484728985075995887083372660716228440296723601874712069882323426553142923","14028402467948526338761593336254970636019840296296546628049365548198505885422","13121808051306228808174111089630942026234886027315445815249447899750402363499","4527372625915062643209835479106309680507163243271678272729965486196852910420","16189979657721792924136577757822719385200418970252818352930222157989377257664","12164333722906565475074936982031012094208830010462001772696179692368311376875","5858370205943885943197474658221555694546571503055354486831610651631015836408","15270908199160540014367572925176882846874278865445377675710981534978223874893","11286729051408980855944168759111974269745178899257472373453896392302685435401","17289573715850909531812283193116346377931687763109543103789593448888152085453","7105741248909320113102505404513273089479652539904035618384873213091298254540","7074114940217186800406075628601455018311224185155464287511228577282040608737","715583426535854106463418752301381005500493761704686059735560513627309309179","12321604619126171361979592235460332183189160477865388902373936323802038912852","18190016005341990844148178297161190651172518846193049031369577377147984371424","17670829257462863871248629155809975849172626610799880870872305867158500188295","19594856787609999310690221094254583430514085336933115629128875588124494098855","10606612421072869162361656308145350823375991111296091340625384433072717183898","20983151867428320058845307293063785400007907380688115780148446035831321822910","1069974199764745898360103165659810005476344160960940508775094244893280452294","12079370783657983066371531276032803534378514351917926610229723180686420071082","12677296700344575464377357413681719606711607149256248374094787358863961649047","11938816100371165126976615978464798598420879993438443613074775265137702724945","18311245538233003706063069652909402120896222049718972404023109633559726294885","15794204827938797645162965750023554318501333819245289116482417688391341641595","8231534103677942875131000798848960381433781148655319271028893563889162379270","2766371540459561411737866933191660197562179823316731217303605261350998865103","174158064191872851418088934839822586856404443510475027422708748258229548733","3061293524954116761536350353370996557677749514535836027593325270861425233240","3554263895404584440154455511723512694047655420085772109708843713132375160762","7209379385057044748253261941814808569341518505007939141391123583104156927357","7306584942825882914302290894613387082682701525016374653956358033276385658392","2518149535352104381776345626886043183594674403698823901150244678327320921468","5581648650991852276927977167681766388490280842674960775941221560787230484545","17883694010798015849432367894079485717020271196567402381116192761974875572717","5977145130276793204043062269836655190783756459415218549551558044792975644158","19754386008710536525416038830817883084219899610549700326214066673104005510017","4105929946744209569133466396266046737599143563686422211800976803155222825742","21770901673960671282817451044366626054689162118590321728191276250541146147445","18554333663717636387381497437066120044065043997075943084601789352232163710118","3229944547201899627459711451241293172565108462885092439611847672015867445844","5025128695089026932637044021822414470493500183859188592019000631358582058815","21351482877833848842950048414861530988910588809336890728805799101884814110094","2580417795427688841110332802041457792912990931107885802056099046051394343208","20217453554976491856162621332289712918621552424181807185429093282741752407254","21356532404406996697081811349181897661406629246933280591113574903262463603755","4440014799478015355464075073962791955273636061611434328008981149274259385149","20843690474175127027273418888401580675425591967425767647356385165618233383167","17147970141429401025221000547342789232065463813831534845777771000391022505157","3597144142325569659839379046014686983329334622151978868165056915901645933562","6209531638366131710391199976252623036613987753076336616804848655147954394419","12924376785494490979045153483490119729324374404017188198699562863400832181416","9271954831445524937003351352270207203032987503409904688159223247456739162845","3506478951236426769115175508595425366287783691027816248862857623122706232593","3084250401572683617954076346006354865621707184383685778773665994692341858491","214937813484326003224036523827668299458243253921819586247641172841468344415","8441949007944436788468393086872889092620006653515759573245998674092919893035","5472204380982124305910371770584485273106619914000710696867278805337005048614","6957451303354569278122219961744612443655520675903833514582885389940461142337","5223695888445379151376126761842426317508027349104222088986256916070987227003","20759291015924141143489800711379500123670247171074786799669843043398508400513","20184325008178519139976204343423988714240828501622788042494704688999415735798","11094010350979218178409535436164979011221721457812496384533043506854053636902","19708018327503696718388479569347893621763926758569942481653711892940091446689","16239576760969556170245792487272775369975925096355053939862336412836709479930","12008121136322920586706238961334135492193994190852629384667755039803446647363","3938404938026443320997875488947263668426539575808147935781602032624388960567","16801713734429980792941203920003094648125183482183110723068392336325309041954","1348135736933873313759975759082842047841214037877011424039604914043212513364","10142538380243983753373248080068852715920793144614672667969585374528888041159","18286836573655984306012297166313463508450538607381625443348344786122995347402","14282178562099256241255469758055058528755211992281625357843046812099847456631","18310498504586098472829857362352463885170006582772479924761688074043255713348","20931050264933145513630154494146233109393636518003931889413900508273793152952","9117815489738355644295849428412003959081005458572860622048785525579819030131","19674676409453156577641701174130088374544719924762515855772825552204250790099","12217666530439855117870645320098850988684982441090141971279563337640081737469","6721147151554827579361586155763227090268714334062665099692917568899843175261","10393168006744278329721749418497705931750263896983902791526082297629822889476","17632382680567142321436824059295058152002507243188736047847725648421698926063","8915644815668215345087302861999208273742901368327590784358018441159811237379","19731092025693122985802144360142842146081743175693460146246146825438643278265","17653368603469212238948115034339203459550448357852824407551138265318018596240","20124759627749000772083196348479267605219009066228480442280858812864945298645","11853405674287861806396328147409404987103713520025699961317518417996316568170","10739116108352466483706634387205541202897545935029060507639823557349868929804","13870493301708581977871588064204896213315254481309505768503783016381785331655","4984277491507589099021974203166018421298409443693664313544662897676891503802","3813732491939127711872266925744617081981315718429011837147980575659381967059","5152934487799436357469531826806992991613558447322571799097305643879204994449","10475716151282745236368134769213248762564031478051618164990108824183737138343","20363281645962116706206801013109651698981355310971094340421354149812446325081","11149179791944629329084734656996501614903770068946878537396539586990604080534","20098243382461320106285402641532827367988692819387395302752081381569882348426","1753740335041062953435448145197363234707260348882068214931327343994875509340","11051255147516774647347134674124069066118855995496412182590304206776480641926","20959895544950066469347932903054230050048584659924310004082332316941759859508","18046662860504645170415451280713122498761168709387916159677756142032155910391","1755364709904298538442632773692058690935194900475887045395397423993838154905","16339606506864102980481476642574322167227419298111069541131542259980182181306","14408190339524969255388148576103299243778942876131961128354488113360949316157","9946460841813640866303402323884640663809344878510859564035517298772497437828","11219093149395628075183617779327553350908301794270546796194409084720111073341","18266139222091589375002467056650215336108288406927775427355560986457460639245","12092461750855134153263659752634687685480675014226328265844503427560199899284","12811512370756406280305371756309902128882727869228201979564338901652745554703","11494056611759290047400852808215427827865818063077750182066726283970699497313","1803103182997812362098649507425788010868991092238470914303344732612462422377","14381384503340300376969621193673109559740622823268831769681657915927479537930","20689236677701319733035204107546407443052878779597943650988887820832482502331","1248518465214635185310085763365946516309633048890537633763446119540321507061","15438668411853453212540489112724859770045942585564826504302486277163682264660","7341588775061129682139585657500389460048429249157465614228748370605121745325","4504761562080710809980598228305844612440881644633955774736651528528114010280","6768183425857782144106609917958447108911958549983993284783628330670083056936","18864432800539670157345842134501598535338024565284719980044881952181029433067","20242538135648097132855504672106382652225627231576405656996231424694213405641","1844464264083964639949284354287245336079489413185463075241207601686531360131","15911845300181463490669683845444097224126436423089406008360448429769777249021","18349594087636997940578113096804447148766618716832098484494987951204901542227","11284900867871484372816498154731023247071308261560664832246483877131493039953","13838067842390307292889016643938081307355899984423741625766940861130490334211","21262378979357100580670681435005220519933903042102444710095150612917203628780","6763823444922283981664855408288620066187523164280354839882753893730994207617","17198062372160935437857774405709773339424576390404933065772606842999255674379","4910589862759713464494680189783100142557385266784678566622717308750539574154","4495951938469765785379638928746803607434714393817532336381990527909331112082","10803423628537408724106316755720418678339457902731908590103549451586497435336","10742327604900791063375842750150159797501166658200942332917857864560095120434","9679015926270038281693237022936405908196319179165590326436004117358731369469","5859855229596809504556883163898845215505148039026600647376023403071323590229","8581194482353982229751614886354094486481078914838249180382996332495219638002","9869150423685094824044620504437355830592578599545482916582058524091976899262","10340057311908145870761282618099355730314916526724401591914529569238350632624","12842484708736224952204598365009720775499254193155989261323979859652732035384","6563574412407294097531030552666651821281370399094531096921555950933912468661","19336329742734989817981929120071722357096297178705076476273820653458140471501","10792923362080851293438248678431463349104184014136158937434524926676052138356","20665471031713454471299179907068607631127914980059325861302423029909655446881","19498075856863189474465312538175648563189747074446590367093335221830119666484","12210141297135413050283577412215336753593399088011993643006076938426450107881","12745540000965325745762732554429477978272189358622877690649886804232154058328","15419080570877769057759861677263504753328528236890174029223392763316069360176","1975708587934604012930285499355289219819427728112756325113502381852663658073","8422847378077687555385650917720234230036996957646299570659503827573008996988","8164476917417001252303510319369129362938630457787404172063532118910760052473","11109653701888095116791718755715250231427569592439609325987755597017115369531","1164045375325713841528353040032939032004151354772989040760025905459493553879","6114825241034332349878615848208065435840371956972900517509523038525294873262","21289945861044700959112897348334363812511733301272168208297533740451194472585","21503366579840938548869055939283915852891660934066087121873667092423924426009","9814493725866910528119842233630493992285550489057511124320186653893078229304","19181317395842408077869078515529437758720817083447018324521176515003658121203","10803508348256412756528470672974859990882174412771382054494808592955628600607","1383499853894667547751048998607684963022365054135499018492077124908089218954","467597696092317806685514243378304817821153329038105295482090363446426854008","6634126990851268334329622985879147606931400989679034298663845518703600812088","18316445900325501015574749152926889553256499264193184167094513613055281628332","12553617163472948590900828371992549553838996451111132020977067418024622529368","18711776837508932058595797908640031074280534633388881655129106420254077003","11423415306137320992612411701604642665147643107944435596437299409222239593753","11086115545141332550127683235360023637567089807640246203203561747435004546068","16588213891867416029248996145650171785509550670052395458837866690786128043741","6122890984368707030294350808316139003903481896452684404113672823411767976448","10245770158110495044175374357996262023745451819162550542312818378749308858319","11110298553387506419487999687023725358665784587262140579459409909133185575816","12279716397042387836021180906034916026465854018095077805204670466723514130053","18925369362678743894371007162715619310278065865461468080994071484671699901658","3730462150304384339239844018799048781880432519592563313412325919098582762357","3001670925246768025104148396008970819268699110545674656425975049467629397719","2729093747896400923881121667604602885026869700920338692253606409766253040792","7601814481566775355932596400768899503055729476380746921047852937238606050882","2180429045590997930178685510945499091793051313517761237068062499741628607039","10640962102127146206203172866519716614799115684110184500846315292600066321682","14549995177129860220283326765457689361152011864054035015409711209998745301978","7912783951395381892370861903784398511270889178023116264093895326398669440032","6677936569341470489146536051534723755962339705066712415750681884050723886720","4689039987287828844035990330511592114655778401762086802473777626638694045871","7565203297999487881299344230417955726606067489753172511296510548502450000704","16894076289281711923223371657223874097050025590789987183176804148627339921381","21769987021973538973537771295047578201770731661547614730588357565035246687083","11751090026303123550968222877559659109084228976878612812257992410322631997849","17609929111513573495171422231275155433152100855882264908396738196365944575766","991638530285351961974565729925758199525502712836532897115477564422303172858","5587820493811032168975297339648215582631464967872422044527448186701943582669","11603307219491384450184264414688236151446359836907477588488333738162703067395","2817235033002616590478273073712668220292276075342564015516365568229473060373","19173941449619955423111523731978140087089523658415950629931985410287649223040","7775902678892155277020721365799713026862432382817405723134361447854641571549","14655648660822188082994283171380679532389311925192515841619091208903510690289","1054831658900196957032995305926092688263657921859476658376407346723872871892","7910018696695413763653676079429008688524054782592388459532241363570351895559","21685667989670097838195041724962487246345909555273974130674326936124823253804","10718377430185158216011972060989907431397341634342237353240892249163825637287","3370973000491187483301765661851937061584050953941652254787113083493139110639","14644371919996480618923281639637343154335242300764339976733421198710959191972","11017976584600876609560101707758997747688081537442193105471904109059666441560","2394145884055511714450101398368242201875252603865873378540547912073267002143","16475980586795094327998812904836099235872469231110678866703229052382331906751","3393434901211683125524426394295029750077567767740366520910205802039793128604","10550241816606396205493532763321464988582716786222628438952341144255283176099","20518093270940094592138661269574403676775738830392887885121705052411686726348","18585594617777786526574165478527055353810131282858741147251146699144499611363","21273355500829751599527467120134599367717577330813929419070330486814611438255","21081927402841168319225110000333017731679819783367475410978031494152269888478","19509945338488550864013184074471765288376447125716252178043428237171491394691","21056058455809115512191988736205121822122360402123348743261753944547271505621","19045728006778800114381925014930049689524013319330613879630169959616841045616","9197604064637434475633225046925309739258545760150199201478904049528524048714","3210494913588713658633170116991575813298984483788435892775305008140239786897","20774901451275498028346805187799972580346069021281531744709122219644834387069","21523530811397236422010920557625638264916622019781698772417425258608015775205","1775555806052010318517360041281044811967018968367144818464300346428689313728","21686196627420940475797485903676443885440247308324122371073702528230919695358","18195190869178190484857892490334582166200707383696765004954115903319113066929","10980833978698361647263291367005093649906507516189313224172562733675948803021","17901978073658661162555488132404488935185267781522868431972778700748559556563","15754207966213815261985499561530265008284817026655607745108970962174201777533","7535773959690953269858712398275045838867893512018772662288091701754164978889","19696647246099647008696947079565087471154689832143022678817329904981509060181","2433926364711440080318009005753673493119257157249272327528094280882533860683","7868613416378449609675145999271678699158893521020147750593953140884080842364","15109342000414947193659770672188932250263214251312258593558002431030409885535","12669063041159174979424355802217581389306284668172481446282666755975377508106","17398054546870228083635199797478425660409075418595768390100778415191743424750","7934432584182696217164896095231362921691811768628662668373553323934305702965","14770303802705954124357958750067974610659609027343277372134946768518521159819","7064810488604233400033665884894690550179079962315061684082377962618248318965","9797211311858379764548903003139234131189138432232127015154782331493293601128","7846536474862987093883452980536159673751514303954710719133412028597973787251","4342989761844924824304575001440622309798545773745205548666129612872846145665","3891840832321639653175375576021426170078143003403021050132167038065081122204","13351528928196462891775729454342987077777540091274588067687383746747378753652","12732942825742574770068246954507030870667472655281551938966553941507387920870","2149482838844812387328352010585781629132915629500267381654136052072556537119","19337829133441271394383073296894990589126556338841438163823150597634985258989","16784790767866341338488002091883210505575076250347250794850878186894289110068","10482203233181600321241862176344006964662845307262074302437559986139232978426","8685976927427569517234915666091323888044897085837039536418091451170972722642","20490003833892240126935171211725757307488895950013800683178777452047576685042","1792162546879669313079163252446239161584700278214879718025605106631155615052","16064967547666639159515475511728654357685356010003598167585817572073379131343","2038324787232656409008948325869121177955199828854492699623048320829770467595","15696764031720860396919319001270179511581976202411361505429650947122124156312","17283377180786374956482947897724899741178434227255570834555404003835920866276","14698103524149569790301170945199793813326615628875144743246545241523694282446","6711063981137988186054169514779081438187470451686181505149070714454963101621","16857786182614103745145068620440842106806526694988538716333762769445868521130","15604931241790873830364282309087391662060266742664226964048688340766005827280","10728539105276793651897915093373411061587968279592965052697286530941365119673","8150860183442563718234800303914947876489919504227757192551478583314830059760","1426011333499250627953277387899688717943394734512178191484358329110163751144","13177021691461814757931777945341789768014185972466595046473710344010902851311","7534816129895264216878988811287428070883087362155113915366664473966664407529","14907306218199423424009247464904850993845191759256992433462632822851237612939","21163558241656044032472484534570527554368559972500360120943777980440523489115","5806397363033575426733460140404456453420455775513579380426708391441581270480","12364893884339333481523799997808990418911395791120224416361911865066875344248","3285266335096234368246532951544109732496011454251910737027849014913198987020","6738931146060499630761261653740567296043717658735751743879732171521836643264","10154452935594378204310846328036542082422689475780912228830139418160667825062","17173180625406101462429874268119575850799153984239959336167050246264875679929","11771759310671378070699571044737439373328418081704224134523199700571340453492","9201903010012294769226852618291328744138737168712562893561843081771853758430","18960575342806736097710212513078198499458264848590465526477817843282481159982","3786196741889484593648668912306452888245857791503087215320303509471899342034","9703108444393759620540983287148844030520253463014600450168885024356900554727","3705512247342131061920752676775918700002159699134352604893181674951834634263","20744380440510791068139627699555983784622526728039699416413477789335384413351","3509571601503556797669726886723663988433777922319888684019919141867536119602","13464915406622156297246286138929337387213467000995562465912367092350373336895","5184570673647053904035204849227819495776866012096422262744508501362530834642","16559518735657642074781960597600690088236852657657386047402706899970619619292","7703031445895422684034813861829354907029697524965102343228012205263910012570","4323874702421756221348476529012862396295343278223040426473174934502309285506","1578246331581202023879462895616463893909003870144121780590247241272523019641","9405879209721841317735974076209089263531676578417778981608079155139124027510","5937531089973867130316073975849611001398387503344701470438380911070861813134","7586511101544473155628541563617283123855353944073339155504232394211636103246","20859541098754048180298650325144834746110266291446964077336161796057865394130","18727398282885211934264671492551679457379492085372408843741660101013904064102","4483059390464830600305549616024869617415312489603482081489702556383536025114","569424976868306527856939406112364732378879754424510474659674031814541936764","7160289598139169925111275663988656373195647367305418507047960882110233073518","13843534446977373194157708959350809754094366991880678507495068572432492413153","1731917977665707785491091151062047912440812041201301360199112497894863675291","18299894985127633911581733626839452484292587866256917340398226423862554260919","11723161258567311533267481676341749364046177524968389565783704083380042064285","3982014996535111335264910190990826134502695803304697193896973827467806070914","5278339249940715518195486229712488968746505216413992114938342323551310357081","12034289354429946798181172311271198817161819978412411597686825724158852395415","21149441216914406541307441677139767537954931534486209534533763713444887915736","16627339685570972729527550183374933390203362464634838874586934884758332025227","0","4677130581325536491486966387607462164138332022971476080171400451642918512081","0","14352042597084731985167090523380966166849342735501537582515475409458617286578","20916834489524676120387097251535110444656698997153522703702345228187536332278","21786793935749494030701688869955871496912951351227898285599497639304771955576","10106735684790818457532258261695309347960776498772507430862800235146625135911","6428336958575254710332929958467344286379890417184593457768755197698276154344","9449357492676360883383358736330895668205912007904523605095822464017918670092","10111826883044783982102986732748653727827142675462565443846826176871513211676","1771614050520464755206567655437318955982568195475607626784805017809388908288","5181279093174687329726783812472167791709283592241840611012716019918769478996","19625330646091720298063185968805653622676674484679604912292515387337432408380","2768547782412073820810017491936220882567133374177389674714899611953029437729","17475858856642439946980886543613194476338688500709749507600444801508604750158","7936792328209678047590373229423008993770556793413258795813309943120313626362","21106911891928118227008245781708322897030448201446386484252960412614050392520","160923774132320138700309004142113885600469201993366299668857339625017763491","5648419216415384962210458616735048423783715757436852584018245551951672011375","12794453646271580692341785003470758044545839204088267229021463921856395617141","4601111709451948750538176472417274134490289312605627760161636077955943386715","10046283988380359324089468034447747413531065892268432343877377634782154660053","15887677480719890671704364987620562587954199613181979602582670224874937072060","5438806375578094804831996047256409601555998721704437116661615079052029229318","5430413829515608588299355610289879610496459872289866260579830278166710730809","8145153039485907902924794186182610289619367017177493868825686177746062074445","1928055138345427173859768658228754543158160037198012776182643107002265549313","19148490879735980915881361532422442541647190982033206577056178823663229748018","15656199054564982743907282071148579734980421838890045115571976090095098908226","154385660123514729365083840665563286612278642507487979936772015106480239271","11208063791115789664132153463836658703269005261853507810845677534632997047231","4980809440531928728382703477924651480613466034938913251377451359358208444982","1524057743203707519771353758649057348821286393731662706849362699486541753697","20665772595673886610059453735047124512981228960204655942695865552527752062241","1186807049699863402614882220003404557936839845187039754254628070626999741402","17655038260012023135991290457846630864347134132580096200058808385064420065201","8611084470868148809619940947805816480328036373935749220344165889392208549066","14142021595071918637986615420464369649728263276169785551023784313537577850888","17529646521554209382090880218011559871098272786987483465327107853286525994015","2040120642145596755572958772074026593399853090022282847294099647519752674971","17441803420271734262262418113785367400517983644769014072249558857676583365841","14156854282914612037377595913998497683980086971401899494541558075190351078424","10308221695667650140824826698531380084253631646490839038942942820966443197178","1101075129627707594434795803085623600522496293366442348748641072145714313183","19677319713816485771367212710795169913554477042767130022080162547884591626835","1236846904444624228218387816906331097034114618823114640245569332172064170170","3863999651943662904698904223317497819688544316226543069403948316601299911686","12968780794630186127894580430757459497437943814584371356170317519787096939403","18863964568216050769470855559607562761266854018811972360221119130648889660792","10980261057999539251342546154236953034152339724935668212029609846924397277909","6026183834429687141910761667665922459653205258849554538784504128540565267336","1325043933861691665819857415353543770328043482420922910524231709731813667285","10589598308619843106485973650162272837596868161731075129339123435634198572461","8357695535586512211131946173362697455939833584794382884292782320057641326258","3266373818615810805668585014538319832164771358602208992778943606894321985502","18074036499232490737494376693273339549688279163529537133214580364038088452119","14546600935577453311080433298210017583552443833692869656397239924176678151900","62421923620952991049984345814361879507286905070378237971492277578884351755","2879305999280748670279596944091327725232783479182912283150258658013359202277","7523008511464539555363599283132387734730173166982034845113285257594190534571","18414482382566740341309247583593587007335730216957603601657405131212831855483","21394158508691554288650769164250181829130540505570006604337113503793855355089","3200024352877513622415018610494358821826750054405465741396212494995821808793","18583601133576996595318160918578674678969104246013129013445112203099162324171","18145796007621772673239628826341501194293386796962167313526920065550313851669","9017311649741339502776691175400746954392649822047832536464207822656263252345","18362153168146140010215500928039287765459305871593496986566097271273730470963","8137596771531974550052910834199969557513818608344170025457145708469308409450","11489710840914658197112766295355622336099662907481775802420795475591935283516","6058418132558955183419693683832885398030980244262108898194450087280714698915","9464081716596322521583000253221386386542755701460501796887792800466818656833","4632263594413868498046387574568246343585648386718332974123490129408377035667","10864241267652382605762892597967987630991129737444544094661970984675195013148","672358381702519991326943764232335661923027122379208701880241660583211134830","3761419021881601449881516496390736400485736023258109551903848109531739223589","17584406156472306411792753846436958310897643228197558963900144344391941663268","3971086869354857837849050662671299737755403778005549416025416054070598660601","10418511769505660582145729932381356184056323802622588692263341282910371984971","4797673340500968789264941728451210426517927485539179025374975158473672144452","17506198805163936374805099938249109026161134938981585080451710783307614059632","1040538094214261382342456714209928670108244506572414582343994883081549888627","8914237510183240036197070003576388278879856057333560041693484758143675412051","14136593229869768312671049017309061304916651966018774777219667597506273214492","7527723058881573789910103935542251697457377309520228918711333293361918094559","17845034079768720633587635855803543601730406332999770754820779691546073771420","21192136449597606223524416011394268741807793865773093724735117166899780629350","17373928156792733028689348291740168640653686458686956074731612260838585734814","3575368361532172470819365421276300750922234087771221899636718765016432822727","3905671105615810841459498276679360601703611477355673076626657199152012335238","15834118966270774933036160410296424804265992656663500408606849145866701384044","11478411596860076878924788039412485713469009933305956193622571610650670207929","7974995804847810087089361516207533885924725750378272650282210229701213841341","5586865468135814967155407606864943593861544125559374266768853244327870360878","21610930713652170889166724369867254991075653160934238460190568303332119478948","17624839613117754113564249016757715027543803112272999539840841522244457629696","1022828462709321781206541996477450874052205698837736284984882458921416309143","12852628556728825566063930085359387693025047800276801998355627378544817469368","19713150109581181529955111379609486187117895722984560839793360814469629849318","5932543672239276476639392190134177610613994515130077252972000475128833993384","1756855040245189244185066341251595005826600382941410411264827521512267616126","14148960300564481641723530280760331599172711625127160077562802934651248087931","7722436309303682404542338415923946887003293553690572439820783469295411557373","20181390128258432311306385639955684507799165158513111684639997512737961800642","6968695124499410410328881418357876454538640230325461589379951362119783514335","8197346742708753490316632007085567712202839808324687455720697134891771701796","15843213830049750820258924263954632157488713493766287624725866593354019821802","1136112052222840614098601355856515069132620308582288307028750080622947127714","13793162625994519669206124932882928398981281982393461833207855953389090729236","2549722931441909802045353415509789475753004654940223515640269416534011821452","7581546647231145039357843571727876093136874076189012795251837560817987835168","3178234878552349246446888469490810586915942054809687415308617892075255307146","5572844367232517123630036487187625695440724918633434325994187425118192314983","6147217437024431580333032878654189079187266975263269529682366795273863832033","6620440888196864004957187722173623559560428983575315095984883584010044721007","21064554752872326168444667299414163879267344549714658633443512435247988295697","18733929743595219000457736481205393897675261941048819192609281544001491833918","74262819453204314187032042949667126970531919617513109699712532293153052656","19817843031215322467449239686176491022005761637072356523323167107950458594960","17905799030681814098208917555553114635617130785899988937798239849677038639072","16467541242437006000937806486215059273437333814714155998058609926643084746939","15346489018327906979341197843122942677020799582323229554312115534384342653397","6191590290363373453367278699734419696317973267689457700357234880966969607617","10102758286675126959906910166416650253569709129091664775410655517120601142533","19345352068069583849468708720227412659917406066348547053591244726672850984163","7731393168849691706965639728709077130299967496624041282922566445374035140041","13491044766832735894129095968097035809324027220821307874650319867589259203595","3396121818530974718122128988839627908492867826179873957531772192410875168730","9332629899007158487860716968279057723451833688900833510093477880802118969327","15453738946247922339645953025611193554081803042107693800193436831611064979877","18402677359691313778544318618903807830053441248686715452277393234747896261111","17699783811594016107396523745249380734146142111095573410219441912254869169388","10196184477336946429058129792284767028887210759900397352539077004940307235082","1081048751663016364559287530733941175187092360143277946288263314141267495493","15666883780225654343768337579037066221222490743521349831879191427874051214534","20749633832027356771603080252941602160804773577201846103187993006788685364493","21280720740695336860241115195812678273653215769922325592484702031848572721841","11715091083799613211838606449386038606470286291531419751520936471432739777644","1396037898644720241038825278560456606840375596186803477804350108641205306191","15435489464480645023958555741910908127252750481973327817620594589891712718687","14282884387573018248170420244473809202291838094638125538372311722152682407229","16785755960612602693943689432362361252837265428736643652531343881373589554010","18588669734727830452526286160196895687629590988754399071542510952874738180512","12615624596138008374241676364549312261205233366800097353387669050203476239049","9648392158742853026279845207386596440233628849169922788285790786793859427512","9698888851569291878440984388306084829532454035508353411131173617695243247644","4045452527076401019123537666081584366271373644567173713485050917122002019694","101447657324998084631736015602099248795440871322241237135264914140818198655","19887977951695038430455355171915333136235427746933190050840059783291674444782","16822334910906330018043211691716481949407129441464327761190020861708410637894","18340615507041879138619945991193985936475013212204746156790572162345792866934","6492538905968698744092985292745515296774117118852782830423983525862287342061","17289457466059072271961683718792741130740848154451675903698023334126055508448","8266008839223898579207482390222765707171840709376057446806430945724128446773","20281322631836696128777818154300454619146167974321171741286809497822733383238","12746883555800763712340812704068794329671259529019312662694409466617843235855","13133373844877330979353596486808474768128550677418549726414851446030432425987","8517743111398713899446180873246540129981144789135164913011851636988636618115","13615837005393800549364959510402965363495880213595575836477248190911380828159","12983933107666410088451392119104666055510683045559787526223305449120053688868","11210095788742571138423364236556478789411138223693859451543904342912495002364","1248458388163700672553156877801464658098414275847455344338444158902914342522","21778797850437966011801561278712977446470365798367850242800274294981815462344","13880604069081745993493253444562611393411922691770166198154081402037384670321","12511364708941586390568576778734983575427556616740931367145271790495459730208","10177525155508517402444519785793706138014287945026159129805018472521879196615","18767034183407827662031849034249026720831776493329956084663314282784219648016","18446075931376843256755920288797542648895543039667334053872484379686241491759","601658358420916957515968586163334467775445316575609128521317613437886137663","3048898915739540483421217565916989616820618761804173778112648328103655908071","11827742977340056738668126219168485786743305173012217923776698939463188061048","4788481611407301552917874540100877298336307972894526719774751510000838552049","5246338387032244190936197954441775026832455339739791667790183881879390270571","9275159226368331820264848636887269226318435469438425455731857596624087837070","12808344752070911920125566557523441588528570288407269312833230082265878196036","5973146863499562382214403505101202790618332541088016139487265253025760691886","181773925380621806730798516391631046341308014351545270518224656589807329007","7566230827992671316582712850385076068372183345712374598417692791055677028171","9526131204014660111263049913856679194104958295990671049477356209528752784114","13898922080711164687632728609251600884092341718724614054608878947732139781199","9952905432227502901987480392002201826693405707296187271662703679138879035421","14930221752674034213069779625709183207015296293139260536301330288552969816379","13979716509246576712581752293796296578070809352951945374143604295842108749696","8837178851583302818012250483513131287930714695742896818439916675551633921251","17035058658868065518163787706347185595648574299800222478170208759484064100629","15738790380323215659314428152342905782920004173906671949036824734994947763972","254815403416886490292404111743295451823358546736088944714228920649615908998","15250394470238044691246686241363623084771009698343500754290547823455997356247","11566604637517171511320374812623239805802465672915509885938175806142195147543","13909544979807882940486158991319404082942285644825236974944272077605416772431","20270416794122893546310457938320908979214136683492311646397353827965590669225","21767968172081220368524624319991562826785241846226894046710704992002013573687","16800864232599625404040534100536192882555443598291580184514662713361983420795","9018437577276583223596033140000559262825067868924284628710541914712593813999","3590585516955949990606168714500101791775670484479492819125441944159308337958","8628869411482005535639967600472561497587987723670328777201735626127568518719","11344013658521002344690631802764255176875963934239945695411546612896227955133","9634800889761353203457902532773470978757390784076428115678386643198076827377","16494924078532429037949061721277637940177934958917595239609127547708216863779","12260926878276473456432531895591862109231144671712827104727696685648033185731","5428065688654636694816285783430536095162717907887303462427928317699137265060","864012232016536040361697649146426591162743030823879964436643556703288058739","18972980804916582032327458886546452293316468875210766937534963000785322338703","5599238491258459247663659222094678855028764276840101552343461881384655863615","19233110274874677832163981443875790397742281594752144104059237970363891987967","14070533422982996710571410823881497484641786074835465094301713398825817547386","9087040390106271520526387144824250194454584429758165598392415155013666070093","14819826212031517347706774444287357787593103280176123143805265799607886374644","11684865548303830373818994722978439826734897501818382073998899640000510870927","13217339991743625889020912890502674388874672750242515773651723008096132322480","21561492364629846860479575968676037090993818957872067022139278078410910567556","9652657510840913687283255531884636077426604021055245139324795316395357738551","21701065316576384724378611149896850079553846404766654009198380988627043483211","8584841688366786065175191525076795440618700175375699352836665763106007596507","1732880429110977690824692669512279435946034737430630671373275790060365858760","10989384373533411398934349035597651841026223977659975686831433391964321121417","17581879464327113629598059977308188798908598477188609110903586054531568194237","4983246918614401771403238451287888499627187661559344404878266649522123415975","17927586882427310414006039408756606349269887209556172456303501611954696245883","13478550220436188194659449196266673840266672673887481049379881468314482103896","15442086590492535694878147767541594332149941518169180324695095099946497406205","15961911644462550294832022363389702798897918043174675324908361840518934169083","6587238612369334809733150808492262365086016088136623316008381683713145574529","3960401538068620934293325804257790037030208617316439118176315992164490591367","8698869664656668592923288507779934530316310776564919189820527798250200016551","14078437371642486814939418687098082732837167303385854666611389854728114512015","14014053205034671651113209176990956491085322986542282729856309547575946166798","13450217988163925031529636357261523518680682139363724402142759193061401003183","5879305527329645764719940009850187156117537246973695803381894351618252936191","9535557588636877793302277601888636736203917450339345011911698906956685327561","10829397868747239332243469182818559643011871343705715337673406183505617766695","1522649784809598252969090640089238327799394027809457268139522550823786826449","21010621436384772196881485911200543293268072660704580727505286599592716262605","8685268402649855090203988007442233833895365101294176368637668259444535742709","2134824389233360612539548607315930135387245846757533527041287607229397043898","8351869308795975651007937161652701296806688225641220735516959514932426697643","4116964139548913643112307888681197321780237983193161921752566790052896577383","19285292543161846099945364265169028621449545136076343418281390450837440032037","13724571107571584158073727547100686006873482261042052896038359220749743211002","15498274670911767846657383999478689258628277969653801065570045869462289771167","9677472299448160872635229465200146211181099620459651013350801406153798956054","8086717759962761210210905563240428172622501663215145957724065959478278408610","12923957414318231884705146440634021452985877189151701250626033861001244754537","12639886095636790755295332848615919528536316592839662017730114336822288541936","17964856986555319688390956952043468289783413082504127836350346299117842391890","4747136001097288857897375480313604426813532513951329367277792776423097788179","9788217150961472919640308563140176433847378871289282053276236344897471454491","16385218653892945650292895644891502784549657220526490179167755975423751896899","10504945336773723198014568044893572141916082439606658533571269406722305170074","3132758735905925540956018936342424212465490883344905333915386132155909641872","7693335852674675105337160825601248941673214184527772377498711774055807812727","6966877680107369034555572617658405689818681536527999611156822752308832908839","19520027782094352765595181663242314078224379050887752160323715312678492792624","19431234150682860647166802346634687870975313118689028268569515754062641181675","13364888858828568309599020886930936312758923058729592876257579650548403432380","4429336109190542545589327541163073283763313741603338777418489811338331963269","13303046617709922830900573453510706631957011412206677051964373158947396442149","19704385789638234259822975087242048608266192779802943912526366123151390535733","14045854768084475400757200889398660014059702795733639818306991084651587001283","11957619786392163964463621957378516434098941270737269121057718912597903306945","17811574064465368240747802047757187877765268944965687166508823127712743404164","15447026909359981861012600769812413786873660543547592040588530158648635889576","3652657328622525736865169151264366713720974824963609264234288227106439173821","12388551482532089134030199575537255785604909966611429793645638518342308611392","16000259395848052448009241875712240318742689059667753996130836559744974524298","15769136814449627202065272831251629709221888718931463351486243799566218755278","3129986775045982922390756625875681524153806914767530519644185715479209684678","15714806473545215061423205685798798012077459003081275714250881249451629322399","7757338970824900168178792700719148514100545244185553595939433108971748654835","9963979060542394161028821389467035220018178055792442311299464560576076577435","3231841111896678064239284790919154538046512531965913322293106284630906089404","15830824095291483834299244415818220330517778955678992920043677001616420125920","14966057823560468136917364313352333830345151306500382084656394975409255004732","12859391473658587722285604207494597829206746636757700619387211514019202884572","14310785551130071949875889448564196402099992603453536024066073362728556967323","12039768811721609412777015875459884003302443363369058125155527082563701279213","16847357014297880196342159177015958744805411492956048834636578961677311777055","1691980987335649322421188959259457482607530415243698541760108647785644142776","18666744223261778964184410220945755969726096204315886287930254587726956834075","8962457031462687192049138804348731783400445889407696098397965070905360762505","7384354940894232750810965214256843133893828234838625249184714570616029975822","21405742246651619351159096336099984397012902273001702952006932819970505943514","13716650118149995559080008009964363618246902837324171491466697424749420636843","6707613599497919386705904880086784270785884563531729415964783035104194061773","20631714840674168036171577412492662608900348900498313212512136921971259956750","134109077250314452203022315966647067839520543766217804829085439284183190730","13169651344249706869219241644867851569464128890966340534825217568668202987732","13167578019634904591546414111215492463545633998427272233699027431078968999337","10874644049757609067573478421900734068687770474279752119273092557335160517746","5041196669573658919647887109742564681935374826142416864168837598473602587238","2414830299666006258645673349772293044459144661103518188772254029962769281622","2486172372301551270005139443153384934952252396111278091785511578335654605911","12057330972659423422390731602477471176220899187703401729214830054645509582049","18399658521760301015112605843795715442296493965942591791286892061171549958324","4051995101124423356153781359967593019298253052388354167135583239078023449300","5358269630999833994345164198099784462567072582084855157913403977548512197456","4250314517292094528439701162504824105044853754117759762139820466351640555901","7048807064629087156949927187424019447786535600445056497976015327272550707975","6984580619131083356200383873039017606387471078698328791782303726902102599125","7336634356649738652656660282271341992082685709984485230251067537014255344791","10530909002106582229347273337544027855926506125004369394509193368470413384704","2435905354250757634354515411069428219702585532124951087402792008915185691998","1119619308682285200380888041816049747432661408134293078744532894417598260570","15183590380309605365392701288078748215744702705186547669038375710606027992156","1677501667477086293363082452892533260790073937459298239467226388635565927170","14384161985092103893292730106138577422172386461012454169181531673940244634553","18344264980400400742239745043250986937409895423338942347938056392929853524910","10299776350807701382858990585817991708413536318656769270728919653361249973711","0","0","19152212512859365819465605027100115702479818850364030050735928663253832433665","0","0","0","1","0"]
A
test-vectors/smtverifier10-witness.json
@@ -0,0 +1,1 @@
+ ["1","1","4677130581325536491486966387607462164138332022971476080171400451642918512081","3663166078965935940798554689567237216195612079341396621785946741270885707796","0","0","15268343501033916092396853374199187988748455820543796633535012025134089057292","0","0","0","0","0","0","0","0","0","8","88","0","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","20401005071856934512126577919502093469896998333576395423210405098533190508507","11221637573274527616863092148963749320478792326359046885677505791311769356018","8745783385554450415208935817556852505963904666879292035461030896427986458112","9244054540770593249164904411947793447281401475699918706115188959349553172609","6581545343376332934470298595303632772511109891764171139465847680676650578729","12975903254346194675529240354727255457038095804076524091329755869393139766310","19803394941685684270813854857745644278038054764942536290820369900488658686769","5585940125353456154521445874379558632458207346008607940080790213364645505640","11244506172933668759891206264732186405597437035907023598547133839316120885010","3851610976264127763238413778601510263979165838589148071349426447569686985537","7071322364577335901969711896982054043277813863419856561388537194670266500928","3422067089417484796438032477722219695118990728746401029759595625790364149058","12805072737486811772973782049375276466806793382130045923297598542528800907640","17594513878835829024628278755667566984922043736716840421722068539653840180098","11676632784204779241861891185738674481683374135588050557642915940062806296009","17029162924965293673613365522846640100950910855072609798239625459599435756432","898211697157487519549227415570576029211121292361396405283406356883749403433","14366915830202766326462188063191230174833179536088645343834382544400378063817","12664457920371440200917881112751351791448665078161964422114373799678084000050","17225831107330066355623410954976865220779035414911632504709423461069070042847","15657915420758543114125245922743178484097012107933132545134956351582036480599","19754853673624730710977384068239569426733090852240507254234975130775960609938","8198290072019908088585613427402075944609199376238991750557143368792110056917","1333407219535987206869704320213118282868594714568243577334397935211111565715","21696472737914927716029078365694485185304677066522490566902805064270348556171","21497072371838054498503157730407578511075553217113204002988434039207246371578","5716079215469010939187327511333079592012591456756259945796209224952163593487","20404170185245755308843976534997243568739930447604335283167685199377654923677","3861104375503645343253701541822050315728344764334581528650347764808466008772","12176975535856139763876059137788210748198215908393783789694770294237423844957","9247875438240158930194335478535671336864947763413807028167313109015312968497","6592516723531779047857309550899157470275721686168529216387600586493627849431","16476508353622634039502369128688793162898765582396203485037731125713134755088","16991997937888716195946864204614725755234396710735877165513368685452596661198","3914988840617461336651438811845515669502559158528622460013509105300914427028","3863115990534889945500773133511145528863330703330314568158266628528605597927","416082415334241412724663049953052712235794129102416316011799084427861582432","7012848816004284185035158201803358903539970170529540142208517967114500409289","309124229574207157014906527537525694202070019156169063436887145561949857354","4903932045637942020910927595036398365107193846462306614299284140404690065068","7000863141160564151708317534611959556176902405007176070976400358908336487170","21691282481141582101787333268357348185168707972411497385218229921979851496714","4993846952465067232508627513995021849200978865360389076614854507987120521327","13679265692718148432964414312888965754192456198167844449126675613603764431353","17066325425121808184493925216967757222883042054035551418153107722149034573896","17710845672394130184756857369322756347951455276898130666623871172064208747979","18791922148050535258510569444323003216256558953498764128968513159495756490056","21422612213975069678703444003440769029703257979189053492384391986190935853154","14074415911075350631884210592009132418311763228478585328870829236957130742199","16712164885928936209544215710602236499399381264333010921664416671110192821993","3890144174096543702457795424381092106714103806060869185105952186578895867756","11411603826185899674971789468779496707097420392589574681030457227865151634051","11278134006242651868902384814455424534094895878266224494208932651040997774068","1357976199171393844376689379124945751111697904858997084755974405416513135130","4343153040657565323028111840502007152428817003888600450694507961870476715049","9181377387595337580491416874175160168294493245080934245751816446388796751333","2425255305536196957205709729120798214436921859930479453252945270807748959831","6578001121361113879940172957236491457133313864689528387979479021821170227528","6164826779736626116597963547825155927772940310941968391447058498265132941261","3700108232241915958613696304948507201904544448046297515460883207338904971957","6190605837118282399165843470388989860287782868077605535985954418426816486848","6106138037438722673902364538115559045760636760660522230477535279666035413187","7405964407182383200594638786755813280180795146585621289192941432152439440086","2200073129892824111028068225485916839587213026436809124266199233346024821857","777319442678688744821482923415270381777286492397327378325402245889926113240","4017789474855628294606140402010623796688815094558205632387074072916552303805","11541270330683062542002567459358015349727014574901601721365737063538627848784","2823446574700218657249665947434174672382654962132488646881644193852571932673","18645589912182584889008316601334376095060638659765559115298650825082369851287","3680029750573981264593517375834933811009820922904952587272493770675150374356","2929666058350115345342236274632809166146917579536660504655231315555436676586","8320637811295883468181433499036831046557397880226343311828585289892587214515","16591937026101200113681836715463161062807490929046078632696350632714015846273","8795690113722596255446828902343872522907104874764323843148878360839846919788","20366663702866348723626834188465001593290575846081185935326903927067034107252","12342598629879250444478089943466892992579599146445696118318894716353479374633","16259012922543827169350964030933195000537381418255367480041281802653105554367","12727226511659528038841457459572229869377155257323116804496913969535909098288","4163951756144334245982358155937243341098470553469840012078653410810603589985","16103760585047488043518047184267211279733736508403896735104081570559394710718","17968408395015647153390654310047841793100589888981506050760915440531564687486","16351568846757948082188054307032332134518555898871318879812972448998152306907","6342581867536954425364947512495207954907702963409018744505216713745289776619","9363831508530600700698420618137039463907207123540773426371039894423765974248","20075832863770169333140290362784679987512130747407669117958068862238087506494","21580125495149521509798300361163549289523125106301210180275602913697795554567","1937040316623820023960935271645884612309404618891512677359910025188104033226","21517678618944895039240977900966127769332156048840516238088842026700305705012","20728974232879640650907968365809502694287999028914817913019859489247556584657","3409922081783949327397585571502224023322363594505140360630521720238096632048","4352570094213759068010467281635359513546837716394971164736674562929400659212","18092743800455456886347218203111800469191995169022333387522916747113632570721","2720063087673413801723557690255579841302823358803320266748888047895700178045","17175110071593084131946893556501435042165047431415201347091813354122835260983","9564979330152443288757003931479794587522179114133060435658579983149254930452","3347318299939765106607470741145767094546236829410691679119011792301797632966","14304502015050510948444307105619853777717641581631912930792268465609404021745","13092175495279360971869065949746520811223147791128757546399480296412351058636","1707262360973913201290435384049854356393578103195212390738103913777738765421","19547205526504752356643386138961952832928916942163722567977251224617238914117","9085154959324178162089071949842580458454326822530247712634309003141924702486","12814237133700871021032361735785084146217842200097327414960119130631110311442","1359758249310568523959159411473149159617592555982101840296408398338014100783","3104980275139829931512442595755479318019380107275848824776224035187014631003","5493324324817078234775956780046158417049208997028274089444829337603296722426","1681520132627660515759216226058108884817107492719428021074441745269746284718","13662965712161503073421247925426256337681191812734409004926825920787983550049","13953690466383149502155233198046014428345178899886405774602488957627161563198","19508620792125602182604291052414997117479520340671156481638198006380435206454","15585806510286403785339305494026941066403103642461231767248063552270235798329","10591076546558341465956035434738467664797258248905485988162498958505153513549","7303414353594474076771047430548081276179918923761331892484251075976564495075","17809199738317839532834887681838755795863975391799342593236782185975857238832","16604278472391565348616039444424523867654345641807562460418656489568589645032","8237960180613089133251894643818308954848678663543875572693460953231041608999","20252627952247442853516997323335870309495884623902725391299640626806641363419","13010139359466442214028326184148905507075133675038826752784828106826780272511","10593150018938904650239309235782794716816364828345398853512108236577076228427","21367786691449289003262284660230829190347540659543560982766812158031120620473","6451648692626028930093936406515211657854909709777953110081985716539273220516","12766739823382181891283205641808414952509826741782530753613193983744392728448","4152627578387185259720856370164111187765235611908230932235714802983217744703","20559441146863706706612756361694163338214336751967192218824662904135304898265","21585694903436710940838237655335883320936489820548029731069199515972395902380","20086222984858344510153414643427012481264615220408902558799562092479204992935","4412297587711446043658653737773520913552739358415225931706151379637525239477","2018569567026351713371810181667215232974538547903561168814261759374068701803","19991380241176495288021205698639569317246725881199633001218387487225194499399","16690616887676576899275604530394123990808241817956807416089902772332005033784","12197411165633993311637818946920192462264030916481390428255919160240064902539","21360178049769523245638150201112394465160991252228772394025429826522876900707","12042620832074551150671733150982473051019870966564909661218834109744780832683","7575945236670015505297026945469622313829376830393540658820227626247404896917","1177554713186658763324413579030047150809337955329593674502439221398324469772","20701437816539673739193127221977693028818199043643329736436109179070047986613","21277375846212685001160649578521759416533171901229920395278837137843958994298","5167361814658027993443792587272450359866078492250847529914167555027021088752","15491994655976316629130032876017990030761400577254625018363825894120530242078","11227788182697009408713227845225539812449541448277168680929743423822707529016","6805999662232917683088357937775508272384308252402567889259796646010812882509","19147779879984705098129733151170417062086581671669029655550877954792558142120","6767138719486424092389456488423146405376629165433241332938689996397685776600","7930912798246568183862348412267808581384988460482027147004935278632461616331","2840685718056113649483300108416912411553089383486903035854107190428939595608","5168388012160650046818706408111785055211044776154200232884758331702687554334","10804401084335200432200234570784426047440267309244921012516844845499016980664","5879447319630148454436579568803516195284192221266612058486316005113897095930","13917146744616545927466577242504887257092990414335537997096436089688482879066","7281193707760517178701005290717080306813564631661049871540602881963365683570","4714562661041331587767734533894097091396488088860418963518426473589804557487","13887563944098051139877147513872141311344298949607520302221303592669471460570","16579059176161881255591784547021600660183776427736277671308519582581979168878","8694977228299859841175623888800715810340720419926627503988818183239920254073","2172253260743250401035024421278379777916382490227575054809637917357788441312","14665571968318605496084681499335240332202318897099276835041940682766807976907","13788414596479781830905239782377049622946683526352305364078392223659290971584","18846694414052465556659565992225098024384646887582834683138263144484156013216","18909694294096613181566240927846162134571252858203666549730835332103200690035","11302305857141628538629953629326471087204891592808197565589978544546426632081","6227200756618295061351735117380809309630763426846510648575304931856516037841","8021312996668423572838508273377537114213652367510483138732039589143910942285","21388094391985017261787469872068829174474019054586123619541825509796561450790","21885651340100197866119915077229901141001400587163480023167719003850464453378","1608755743284263772124938006622577179113688179673570557030033176267563213041","13050375867717790111352186875571909444667320683101020630233156531382762997902","4180493677097985629503954411759408181273462596141906530266328347694482447964","16811998889189663419776324321715740745154975581084585098481145952898063763925","16612502123140902787932370622659883066359797218657937716504038581027498683678","15769175760205404886801504889168121006624730224917112560602404161996659168361","20052131037268168276455630892186744046507841591520494885002299620411034571862","11286349682428768936719355726833992780573753672773572798304688720131939941802","15293151422103730504035658386990919038025737188769598280820302135301927386912","18703537633868269115461117846009556047576534581284962047788460371685925813668","19816902833644091320363126330118840288762510118845312064098145305766287003223","6949529972860419420429881205468865348186754309617968830960173223899557068871","21769760420707708407196283509804176958755850063132524803247207048895874481547","16473440670711897050313900169854568259807762012647829221269081056318792356126","5755517310638949109705199598640619834726909253002725292857053231304608155045","18514834954938936122733927663845294725735316174228237138021110413393046162581","17571597077800905223425674691799272951518841099899533191990592453235956462954","10343484121259456581495033186763792506225736617417894740287403400452942118070","8186370189144040948121370788563796344048042083081451096538106522673478588702","8995025199059491390637130758318854239417833814558039265434685177008885657376","3031472894766219059858005879618131510547478592444817981222996099059821846881","2096428173458244970035526371806757154215216540598106496719732366873152520837","8675946050592777564397329804724481502039667147072709891128997869096929909302","17906690355906715260861029848190721333178832439438757851850849610334161786543","4384788675154419950337779244254851527639700456846122803163036431404897343108","10634747710354045161595825225067140147638177833819964359291109028759478763621","4580007891428170105461347466211733339661434246730887454077503547854614786950","6720944024268957202412287014295868893359381461158140752090329880073245402319","21067675131658633409859213918385464384511429181488894854369374713210855461815","16177587773864804257177452843060500221886822743222984664060487906675527734703","13079635341912832179522112507633850975262973331265925673861158474356511611384","16236233157426847369987516405740925840383712577721411003080927736978196366559","17097099286724890492201072326079274906042444622668857230524228768759306104985","12374897587824358200842113460666498015857548278280740473550475324753591770620","3743009308795546792486590404059394908393015243149251676878652068279426604464","13432526247494961087744035539077952702179727966783485855320023422065068950252","14688776804642386173370616887634934837860201468381553713589845678935220814417","20904319181107930591693522497108668757957419786841420945208626464814153089193","19407641638080623902880021605403902459599192981944013662244523661942092202498","21720689962955897879072073704808757982038470068030781698960518758667577129677","11556047135933626896991588396593649827497284072272132683055383198656940349048","19257583335877403011481825317736793499880424865167133441637092959749399313502","13275085742513982073825903569505547173921689074792003972342829667341416493126","18186872120656666367984034318751888935557574116281525928633345317144781969073","14599117383639859062997186133227491056306039136668700051238992695822329595098","19740951317365036802810812995171476018610554899213047341766274684214000740145","9232422044771875096580864407828551184325758239361884860195530069570407413318","5782771296280052360904902126779087649052846261379285480209334847379086457360","17775282817901904888330413443189119364682659487019158676987538587625189917675","1066561985776794466121987377463909476153575322506563004801404340179984503358","916610154805361771422714723232443767291038192009867156950524039746086028401","4263481370387913376337920860725556717557869034134864109920649685553200846737","21527423542512274990094513736693705044639494441663212768988971472445510517978","10772690412778715474843013948287122660611007948917009503717928759138195613014","18989845603394891199611627052394615555798122422360150509305595512430227212110","1487098483796490147575884469388782159299789468561110722348429487198102511632","11667047470399501056529839354106390056855239389300339367976940850340830689602","5338067017433143995924920876000505719377099047442243276435769640883922280642","1639154030154468844685352572728959965411397422368845217263926967377984087918","13132630700141676106323558960818397425405595913465552969558631534061094705576","2458781772273794819307075201130420262482061223367508169648376645311313254366","6989078751359738075626608779501110225709667509447635458687084301860445414746","20836197943088438759206423067022986510252062173602603489446775527012291159050","18390977497454237569981882804497550599991431944174604456803823228635067811916","4479367924266739311074668717226301598844575048116616983202084854079931435570","2372419656930102328120568984777773190858918440893623551278564788948605764950","17424291298284456433265316564330140848645960802620988826169646524423608305736","5191605225433260421899104272077087002740218354346855625304698999580323149994","17898440187463079591870946871304745777602605814215664686278564822325291419191","17611859793190030697270091204050783889385403582777422405706234317717780973100","6588587992156876940819466372868592907549272382061712287684384984996473409069","7571197384407543438573501918487955350438229069418009632490500922685766556226","19622703780298965679676905213767547082077482457947888893360172083867854718926","21446166290358832595129109900917818945140329225281180988061882531971704945157","14649292190763374051361083505220623580043497183975221593597470501022875986346","9250214836887340715465257774381457509613303863101998855836867422306668714320","3799607608415765239282726340696436000586985801883310385292182905931378559808","17716236540211356810682240131328879925291668848938188875646461996226633603517","3887247465597261866432589749777530709095472168951470811122850860456882054277","6525687314391411916112093511825672263789004056033625391579990650584140851278","18592972741726720044072476390541116995214640896242376564042077906654954615137","12997212889971214092134739212016042815399565774915015723654277172229677291011","4254868471812137051590028129329703685529333363876224691622049514478855958366","14077966582517650919095650571577815704088597646103632306418723366506982670177","2119040149469535235354287029771330452747208537753577105519400357108434620411","21207697933470223869807555124325166307406257362044904072363334745276665314519","7190349195858345271646884052209071028827286750667738554028330712093377579936","16265488593955930172602312822419213417723968840302817494967024427075137839227","3815741010043562088607530283042787457524759791192323981761722086661415318698","583720915355772636555020703257046532442295128724429828849982324889318921432","1102170375893401441969298656526252647564281790059860493515220468546293038983","20767630688965793693794841558983931333464021565935903930902434604933701634957","21616121155846316756550750706226004899196665451412952515147921487185019383040","5002740013222387832459522707343247526776565128458994065010013201054029150030","6422077943179130803411797212230074834259655685154616288632319414611811921679","6019275795713350605150056395270079054684805603375188442442583000164536600669","17914078933612908061224514463417935922110346592944014164310000755613126054170","884772023111484045899873716128401230350003279147268331381189004763305996576","17473959651366673630198321431736393430579835044648223641744676465172539467775","15447258812182481040301268885975493988884370066061371405663840836784218216964","8635047604843668793061248505841409069840701926714186786314566959169242448865","1913175376077276449938876878307650673449443092618268439860264573460817155356","17706537122791580851807813119734656545999717631833479323944583835616042046747","12713533224713702620572061555868239494560543672613943047779079905883794270793","15335431588644804698232638554832153707521179263496428095244719330764160979536","16972338882045649714960232935724128881358002139149662161855864918611719193447","20510265683377915239031331609931077634777511282902061740535762044318011447054","14348591232319171989710953381320670528467798633079274942581439677296902359507","7268761067249240551039469436291066141493626057753839932909829536129404405943","11177503563612935234878370475564044265033655526751198478229137454476060257389","20518306225043379063486161411895415905822729807964259472068843201645131954257","17274735491667046764616117425484985780921016176546365036792978392889983447275","3422727355178567490283294271244869036734587792776225423412684863858585667355","16361499482646211891495144643544799199439460048105681752590733351645896563991","9831378251659910502475468716900359141926459444308789377882824537354952704571","610751981717624005026256857476647225087205352593680510310135048655409805665","1274705802853698530896831887960868150413512303073765020858441284767481108557","12911573265070499437820407902233678187536367292819490176599490719474506679709","838780343058487840022597119049399265615305670097910639521946026305859537822","21886817593090220196061836652905990482772534345601206284920261819623544068569","13045057626386605209435393764744146030789888964374754365611177028824591744466","6872197446001880821713864607137207074245510844558962930055703063293109109677","9851117414973500062343684294511405799095673206164177441983808850858510638197","10356153918708276096440724514334813427938372190784074162287576232344370795144","5422236224208691735064222120059315321102696977576093626421991175019644275419","9270939530192661239044458014881210314222813499613547255416257255885663545705","17875006811148349666757764655667275519374986324184686591199872639841653267451","14223311161352757642768299768200066774808435309343986292557601348729896785348","15426232126866833911689462701146039651872381668257636712453957459186675608824","7341609890003755608731719926354383413086148334559783936923856681083371751858","2522916755395592528799997935331603289350745805903534350854142361512185858526","7975672719323847188584994034813755253910739379403210188890471743868304156385","10361152088869789372664667844034575270433189615534296913541908638779984022220","12565165574657902894308498356020741523059341649671415591209990377145546349749","8751927430299691834222222528273367980786855265571692230466656313501870515928","3782747889242504906539232417313404774472163523681147906451826831235080368272","2357908358798385925981298822139313965517778558204913007219318504379373437268","18858304770874740039984686448203470834562578493921595648210975754608317345623","7675993016512283682207173403605941444327148756612111199564173985331381488683","18818890453076413887523765231615383836499382990172339300581405948672279661939","20252144571549047445847058871179203700989782831670248309822846431530401883720","1548099034248382487438231907714050431020571588355663997785662562789965803980","16804474097957695744497077255787193298059334569168351136160606040471620694477","19508191667931806758288226550226059879657814340243709578088346681152392462495","1728719999167062338488031868382015025692441998348761079303220639921123256253","3604348649226051022337575722529270125804601416032976114063695533907383376063","10603799316068953108041964397928911876756607480893951394891306679070664686941","11648836007515467240952473614276607091898134725313122196877249156490523356027","20304987071409008531291607394096634487514970541849677970364964525409317001703","16887097190060385275598534531462546504328245264471846147005445996927829539625","3866748619116340790322227095657732028265396618488150952705187965765394142344","2338553626517986088379244573542094345133876349395153534676872066555319122659","2989903198038977576699565058449844165648971727702772542926261896668111017225","14278108812091993370081347429490097324884501265196936847107187781917283188596","11380653571214536036495190297205289870093439158653307679146162820611556102008","10728370069888852342064543039072884588207288307463842575342439018507973749875","6397015059973528659997355436100884860480194279234476207371274262619351989712","541153916915028861555802627075793763065968288425448237372538721080483579866","18703944686825210001777887304396928822416474276215979439014172442048460507918","14758294058966360999395530764869560471829375974872409340898445816910150933642","16526931650578182231679662261327171662688393688603926959024262791659875401297","602976647786763241606729968150119992779405527249465670521719980888114456911","18058348521510457484238468261675615616734549390787035210695832199652030799290","3408352310769542203249747633896333727677518788800695461819894477600392750387","13813696926749566428491595164396687786753780912143355428869363417663150103299","19226110628051298554688993880923837902732997396390909485477580979796568268253","1751416741656305902722022764840854257058950958650470467036624232208612663135","14273497410104557864925816124947236175101464480860485988459705747849145681216","17015769229295700838532275937420211087470832686975726393205562687498866290956","14317743544567964828895913664482783398948360705243772246269021084945454695426","1163710387996022107448633858536432008182893204461095765258858907535290527398","1157472141102273214560586147623465021722506106484968954764968896766765161328","11681638321160186580228856179688445951029310816905220272006101003142657558151","7819383141229404988917287897793820336725988282324748328500126584790204946216","4951737109128262717496808639553648804593962078862416064602914582392219323452","3442536812713619147824039056757226293704728452919903288417441857326983315172","10972029915673903790920684428014880528769637778570023451906625828019451706493","14773388161979847043531770832479609075984091647516302841116078929938077685390","6832011488895261587794164577700291580520309532692302077020376875264467715555","17143902297385696174135078846256591193632419203064831489933616909690183265289","17963799875997102172022690183795592375198545029882913008170902194968455818572","18877959338292270131211824401179673216317987726501062994411176561346079618062","14358101523035386382208062475555490310717442823564620083001831011989304676139","15796568151681791272753262366429731017034321762865614705556398537444716949893","13594857027304532283889325823930658134430393819837961037773389277784045884187","12136189727726413275229170388027187858694486236901282556934338668968776031849","1878632778304231028304727355487330626473470046303885272219164588770349458891","16873156099807728926852233664688168784075341453512083976642291718576315890258","11888191400576547298317080753543279148265645791517177796081641411013662826267","12210018620533033404291042202232857902072819731256915890812287001012514424820","2720995111620673475976904476404847046702162392875915718272984382599949577930","15740015006700066587650738996931848298647799054109075680819419326780689301412","18792314519811779877573893617497033030062705897791012092700956142509339219587","4533063041836045489675809767596619288203889485091241212692263726853545243001","20087279194440392445388020521232352321771796905350016545006792036125962969008","7662598580271470898701419629406835755452899820387556478370304330574127888110","2044322434996628951886285591950247795571711833625611674952208584770381736486","9298086345190166002533620311111572062855266053987387718138964764033420577753","899023757360740488398947202266024685219176491069483977212238341721384465909","20010267753246295660761776949157831033584594444801325360922807083432616388000","4450168704469888293988828437399020403079513401850888103443449346484211800937","14818763657168994501241419792426650382460802911500420715192462379889014218887","17499922386950534814980392095212646829833012336949589738217695906642893333161","4725703200623869934067110781096149110080128914289809281524369625038851276728","21835965127088232500387522593299395557327989607714564030101094338431057597467","5820797066449247361552221309787436085379889805203375090244078627730164212530","10690618433287001275009978059717247672897362692985112411393484683451942079152","6042827480936488655202996967650552195596171412588631273445587685915755805839","2124979120726636017099604334751505752148470044032645004013782814693996776755","5330435275056975088743051229223220800904435190882376049131249876689777155160","10124640773832184137904971182012863119485346620571202390914900093461027458298","4792024075244123098429550700645522059707473361886941368732914916479154714143","19199265391861538037180779666995909618497861428521118501466940732045803109056","4847826399302624775401994843815425199296930699401308990787135212735355431038","6407450376417859266449821859393770958635892367401690415325194496013043677136","1826395464858704884123218795787675583917701212492065945897042270085201498824","15238350515275529718536633219359365300853538429543725551430697362918415181074","21884720716136022005919093587710286615177807981683063472262896460904606628205","11689623546966353939670252259858789076351178209866822513410564961318335022311","7012794711375761331676943528254022381176901806276543398707129348614811953364","7180386038316110601441275181186218169286243634048902624801201568432593598141","13992917683661928463383695371898592624570240528944920013143005531297360192342","20034382193406507934708640117013118683945312285636692120801926999004026442192","14938652037071147313292164890053271808218189916901397934979103168334918558363","6648656337341126044962186909579051464159388727291296359968541322347995250420","12687003636792713485597279951140994909100599482079709621716948174519718796052","5108026212737931447624617494967304196499275147503023686887173141950819456829","13237879168621780799452013770046455143623364293054791609245436247351123437547","4341628653085149506528562773616721450933762016986791665663158769077061948538","2872050032952832698964730829903028920310787582321093426023746057532106397812","1367067391257975331756935824189631175172150708192657401957557819332219873827","2510908003064509602380389482004083587572613328572081988132878417052528058870","7084003845943087385716519398984211467638527143523438844810938260869100814307","21021470589871879755146279959973770415620667125847333514170945742003965711484","18375929337749007201709778590417087272057251219761079367326499808386163199502","3165201527196484602864016786637760443866722821135007004482670717537305516789","16717649565776057036320806132383209226780464215331716681516324418665003576180","20084295757088902108975491392002149988322839073620040409242765620165003006690","19241439593234676080041039883677491849402159269654950325486169959046767303641","4275910305427071218515830496145381854241709860849136935348204612634119544809","12898354034815273049223090812634413302174170749584845355813712153571284519914","1832136847875618967387144179529385178062929371405576686128489060593804295801","6069947755267812432913347261315755057349276133831784919354196155981254082646","11766183173827664081811296117089138123797414603598518127011517445259099898091","3993663602157055910018053040318139873694801305099748688074646613364745456069","15977276649214691975175801642730396873722756384246035320089179093520841000256","20303338735673445164192456383185100079100313199924244751665084177273928289523","20078019286098604448173211316407882189295460838424433108031089458601795603798","3307945001378206345398846558075581322286376391921099092518022108700861563718","21251247831852952153335635921612511638716100986041125503837495470248973341708","16246658361510148897664309243464380229567944126043953870011393349640538010692","1780654817260938957384325125461246845814503286839545932803113565621260161576","18710920936002511033230033673354693186030823806023934261043809330225688019647","9909111894805078760429022088296773927960051970891988461264950755997874666368","4345705541817674840760552109695955140943188102322798018969285864074427755164","4218015441219662255997165544650931566353829817981176787648891923654028187504","14312948242537810365234703004108012126182512780396291296729098565955837200965","295429846515676001104835276665049934394487183477715755147863239617239603688","15662344495653911375885561867591476367861074324822203271697194851167934401197","4793902408684290068019571137097387781094250811250560723390621410227755625428","4917605387106365671936349402138022267056891394874514471401018603057541394966","12993315137821697215971205486742231731559446527233973456459030184764267833130","16524985806030765353574471797740141094531695570270767498985348130558921348427","17013745813130281919891782917152585107471370145883327936054547011802523582182","17100361367645562641951805935367684861196104993797463923886759602641481183803","18833494072617086391597832039235402246961190856658717439789773239549364133295","20157866969311886681148400462214545913907226429163925709394672179635388896518","239609839853616379785377333442787354361568308011318294445268661600284057373","12020614379209217917047110972341532122216802896668712785859434794471240569360","1248739678507170190094138204517434142149054474900589856533653488451999142610","347915422993469780317591223477066986796955479205331632188505297615283578389","7999351262004511546770814747439380767590917178796919996885684840970542675481","20967594534594815486207550915474044087229684419402104901430196899850653362067","12899121896433082785388065281401431678366644722544051956929985724649596205064","18983588687933404065713078913700781650024901175649432230763486533515462594521","10766551589014395287410716892733848848003231068450440677265375421579008245609","20169652396045174249228895132866242783042168925415971892597182614884452884464","8957813983054350321796051550969191364715748771015789590569930810320606596431","9643155271414084161531721957806730069165955979114015273977651814640128472366","14700897093031440778526140571254449874936272810108988470714238171786681228615","14253815871028211364121586455534782624539734061148936548728775279097248553246","12623686528624702687438004549592639102850653340068344303348073426554835546383","10887499024511455665783360424280990671057735891551733295390571273395259237282","16792183329149820420875049780284492322598361840397896565294020303662868308403","9761704149743627159698957629672578406325922760477174888401254285722061841549","12931048515074471565571865161878351893082622778237083696666972505231964577505","15634847659877970105363072070507485783478919227149202058826464081071643773101","2906908506833041965320370496001711113060506302861350052429818849770038069678","8699899202483882769321195990250850850577555890082198906596960575592479589201","42373252218515653405393706267826997457994495485868519711417565290528955998","13298926901628935863638570113103068562843821480959781806957648334812991282309","11340495629472361531751136493827214341448466196267950757968881545938240013043","4410162973634101037164287543635784419735236595410876302496731409711464203560","6770504591846631067009674695263383781064304620185766583378598703662090659608","803268033919858655611811794309731920699017330011910045611157093721121626734","12911506200920624526864882942275121636127997230823935902940985092979574078964","17918643324157271778766566567889948352259699059171047284794326313189880774701","7009959043684140466581557454305689161448928833856327927307997281234391362846","13608676044229669503858530637021492044621349605932764029187667136233188902261","8469042229294487154908793664586203937411909612880073031669159370098423984545","6503765897633991782175459954225585422528890847227322728737944812623475852139","9715672328228477028203852818176561465039698179069163699650993321831992888477","17660990464121635097256814738911507903541707401612095639122186321774484595557","14804081443437546771116013793618853310717593234517633753124568696591221419786","6724218330718468523063558898686833457277735121312680344450184429142318815032","11402319676983861046390626662653884449314993741931036168486829754142513828259","16169080210743684844396699122536061698227435085322952297967432264699685757856","7675907879276133953708522162728651878121131686921572128914246808579870005917","4230211911914155476612752596599592280759202092722649006427735130558128219337","19994913083264981050872215776005351950306358251618357787279433070487904484823","14226987613623192001061092270841034855848619059750529499586599879686324456714","7045706519369812325556555256874783203298277170448306853617215815294968449904","2062849677144799356514567881687217598261884486125775155904626936404918986032","17601920854716323001594362511208188462850993131871853150842482389118606277711","3114106057124321155037877509199474249372783266108754138849102106650508205535","15465747930743984970223812683747855883693317069587253229201455749955846107163","3334494231965751270647811534096470335132564873859376879858935312105589711885","9823807746394349345368616975004290248806613677673994895815373421919965602266","5400271608648346754918607312792816605467323464770476391129036476619221125765","11770821436383451310596048403074829165521108637308954395370893718334054277368","20773403632811810296516343407006579798380994788000675726989846280765214549663","19605822286773678860331719553999804483779045012091324038328721032301094265056","7506448280816146246231851040199126517175663891590862860617123356646005555345","18126684419189656267813215765438780356938370095844302451607818952534708829765","13515823872008853824996025558859393212682839451413033376269220015533372008124","11462818572865227301821439771555025107926322021541096417968595142068838678265","387527620292599706620064005572533814830769480236179918610678629811523562236","21160096138473093258283714457499392397390620540060924570049011188639238085803","4354453094935226486359014408208016656075153446280746499510554516975950297130","1149854953378540661435822397775744272093475010171290951176022231193252054454","4886874912923569255211212213751909431336552875722832209717634183141312835459","8121417973301734978350814829063219763930505331511762446382376103512670333855","10397108991421661604545471702024443403572229499221138846385420184468156248436","135592906362394068721135816280006619658575717043549038357198542574796191751","12470986481443840884498861270893844690324714017774615057320249066166810815131","20711627617123608281465397514094515604912076289675946973464843147332653924743","19936523306637884947878303702523543831272475518000646601478891393886307224894","6610180504156263317235179434459908562313719468361106154297126173324848499090","2835947021190105212771241626312472117135141182807194884209080228417103438754","14991719226605127306441066466338764291641727399261080758950782642427317493566","3224955852105064561373076563380816036656741761437324050875349423939116643826","17986913328344175363997927083146937336279613526299537730298828188126021779067","14956620466071915113707982931908833123655918488965732670821007021323695567331","8273230426812750549513268262802322378227809250991622030042205458961448559361","12864204175590457893253605551535554300512181117280069428500328714508946474596","3856747252245224166966728227308235343017242206197065871162867092702777748228","5064589380721614521620432648404726474344877858870050645117028128155890472157","17855084468176511297023651008689325974304699449897905618704009760228510867305","10592444459552152581761051586259401938596901225175489278318737616663685510540","6169879685391435858857691820131996505378957223607348917145825765418631880515","8113562783193356344318894437081098186897299591291373320406057303483148742065","21628375570977952288299958796859480513666871363598101523098963887399205929440","2134865132164751654161455518567670919392897747989349525945201224885061887279","19429744046477844402907598398585600388537641557514304476273967618904065097380","10334858431682540793324733752716409902705019287129525537434622640519791881859","20898874645461345309219443195795227020136151785431504665854615665433057656034","21758936607630402529195006563442025392002485085893619072588368460552039953657","6658767622080579375212702865672225131694187648045659659491640133964821409021","15945223109716077813697724894481072775767923725068384358165128896271885377185","7493788631544480359761010651349903811913677854977183784782164761002795001013","1591024071527067760292081143937838601494082577069154394739643638063130650847","12619889692927553488927714722921271374516407458651205979102849490293579412361","13544060486316243019111794113241157741412385204952590231446494676348138782433","2887841573309108233158231126323775418060676605741555803818569347039364806120","11036140437691913600589642507367009124853186496834027940452890971374326749644","13459410879887221125208802127286738607219329998144370393597168847217136752309","14138446918712369212513361591812053045469401743940362364452295564191258618071","15139494420493896979465536772798315576661564585009975882149046490426430943584","2680555907002159385123500413017583949180278933797222446966030933631028615392","15487403918133177809118221011827665334424270640296194179725020674859862311148","2253081490999534554527627661799880907320552244022209364079259863144124063204","11191815691711088981123145114348502329836887875342463606897269964110132026398","5109339959165897707712238280262288223228410318321865982030257634795492624075","4228877585466284848766757257455261240377460433844128878744325273017336623330","362614992692373963638010157404324560163964919752108254809408812315768440698","5497792324848207351089823477182027421661697005728339438037281493209918368532","18300280641113926020062358545714253222621042370181649338471915860636927514005","5165038560428976080842235638073800522486475602829240088348607001517236391108","2008091893886066583601032642095457476875986236627706624298412511701486682373","18855234687460732907670779566552575320366460980688149277845081203486429085196","13389943196844183901355127422435750731202929208969262430001608034764394210668","7021308455275082494090292683339579828621547308114648482192389995456759019483","6585222136111747436624886140691552835483743497794532311521040071922248443420","21715523680622751847043762670484689094478706333228979861445139700243365776594","13416504159545791441009914591308927615633686498715702676442432727915988269082","2248673097632858668765361179839205001457921928295571511512730199800584213625","8201617310205868515409198034710234660861203915866715605849930565273415152742","15680268660957381191262801077602444572267901505301952184208993099935462124810","16104837654487289387088073687347866178758228946202427776701306205624672792028","13684332979506205929903153264861964109520505064291381840093693876889335151993","14298782347976668524645278060067709431261037349301522981877578968571565556100","14146039703163289539879685125644412698975703808605016607740716155671097450434","11934833171060725907314404100396400102926313444214797514298446783806475079254","5914086988947997830012843744355360132724998743777726913294864331058879138715","10659686720196564899287303479729456926962280252284297382118982673601141180405","1692869277894986008249025777573665756719181333137351109659460920317143830734","11121687568974872103818642807085399340558431041449573582444977407542211264004","3501050053396506996742711102422431158646670397678002654123600295042244164171","14984319169585253070148527069125354016209833099403929166529971220165461080109","11039249245607138942408416774669487123603045223333515097649259364656805712742","2859932898082976799590321590558908799276823987835443387471293467877754277565","19478458481483880492508096426388037208182771578389243036459312837722364528292","12681295366282558699393012939095360477842070047616469520212796398808404284054","13010182377434613954012233404363979798719688181232968966240632263017157983618","16037260491735954899197790080305488568587224615297648089505787564736457655504","3774943811190403499690974560575281409833645236366071596666126241657610017452","21814452909632353471149869440665903500310360262001108752776562989491779018263","52072281042752561123298216211920776224842140069522348353471850133101459444","5393226600522078959309667664647807969543977428132923032121300709179500319576","2535335411461130857251786076113019736467112607101573495446575260857514915285","3223186631939230423000089008145326734853542787816950488463620916770299441548","7203210648731017372643394417187027255626158150779569672743304509771556031568","7365613311894109391567490056887433110920012927687918796539454353472662806193","14706919882948918903316502617047588031491849474605859994059009247259486020572","3455208500142568951439012515724503646898391143487306421264185506460408250399","6176697988969134956767325675724315996342279819575423735264769950348921409207","12951834853082027138974145617464147922857695533654628319949695487103738097783","21540266130478603719496842280607306809615541536701125437958624893911805143507","15841251123604012933249526821849462516847731497880691132669932653838678041593","18948683310275384847923387957211395414092251858762610439160163446326775365243","21295038317344811116316108726319045473711109917897691371510311266185853001380","9095729641247909707668520027352422462525417609968833674217396882088429011133","7748284092532915876871264327404847715957163892603821067089338023968276636762","15504838028731494447984781439562882212473223734774564943920587671282013892783","17710545040585682988241551019670248079649743911204771375834642632997788982222","10356848241091081418291575127603139858556280821909592538600302788565231776573","2135069867766629257670982448236296634454202981621983661012300557748557064120","17125626450944567520231005064919628723567428206918336867263540842196820837720","4339710247506255212189027358431803298527452960376838551044914736673354018926","6930242572932818307072016665941050027383664335148847099555399010971211803352","4540469819839984928572435092473380609832679284334795966063195919694411877587","16628353401446674199275380109941591337811739913828377380737794433676215960528","11535473251411739443035362528505534882481533559097828804136416323035986938254","19579697444869757236996156907979434468393725881854767726694937129865836699720","9122237435448224029760899946316303693350992158431420619823600405922536098176","14160660546759582304436411024155309006194269578272087613920265117044205512077","18077708722465603517949588398649463852351624681209651633613380178864514332020","6241268709545939837365635267975060746505512224966727723691581500981526218338","14888529711719706713295983706169954857641487121071161174594422218430859599969","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","16384","32768","65536","0","262144","524288","1048576","2097152","4194304","8388608","16777216","0","67108864","134217728","268435456","0","0","2147483648","4294967296","0","17179869184","34359738368","0","0","274877906944","549755813888","1099511627776","2199023255552","4398046511104","8796093022208","17592186044416","35184372088832","70368744177664","140737488355328","0","562949953421312","0","2251799813685248","0","9007199254740992","18014398509481984","36028797018963968","72057594037927936","0","288230376151711744","0","0","2305843009213693952","4611686018427387904","0","18446744073709551616","36893488147419103232","73786976294838206464","147573952589676412928","0","590295810358705651712","1180591620717411303424","2361183241434822606848","4722366482869645213696","0","0","37778931862957161709568","75557863725914323419136","0","0","604462909807314587353088","1208925819614629174706176","2417851639229258349412352","4835703278458516698824704","9671406556917033397649408","19342813113834066795298816","38685626227668133590597632","0","154742504910672534362390528","0","0","1237940039285380274899124224","2475880078570760549798248448","0","9903520314283042199192993792","19807040628566084398385987584","39614081257132168796771975168","79228162514264337593543950336","158456325028528675187087900672","316912650057057350374175801344","0","0","0","5070602400912917605986812821504","10141204801825835211973625643008","20282409603651670423947251286016","0","81129638414606681695789005144064","0","324518553658426726783156020576256","0","1298074214633706907132624082305024","2596148429267413814265248164610048","5192296858534827628530496329220096","0","20769187434139310514121985316880384","41538374868278621028243970633760768","83076749736557242056487941267521536","166153499473114484112975882535043072","0","664613997892457936451903530140172288","0","2658455991569831745807614120560689152","5316911983139663491615228241121378304","10633823966279326983230456482242756608","0","0","85070591730234615865843651857942052864","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","1","0","1","1","1","1","1","1","1","0","1","1","1","0","0","1","1","0","1","1","0","0","1","1","1","1","1","1","1","1","1","1","0","1","0","1","0","1","1","1","1","0","1","0","0","1","1","0","1","1","1","1","0","1","1","1","1","0","0","1","1","0","0","1","1","1","1","1","1","1","0","1","0","0","1","1","0","1","1","1","1","1","1","0","0","0","1","1","1","0","1","0","1","0","1","1","1","0","1","1","1","1","0","1","0","1","1","1","0","0","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","340282366920938463463374607431768211454","0","0","0","0","0","0","0","0","0","0","0","0","16384","32768","65536","0","262144","524288","1048576","2097152","4194304","8388608","16777216","0","67108864","134217728","268435456","0","0","2147483648","4294967296","0","17179869184","34359738368","0","0","274877906944","549755813888","1099511627776","2199023255552","4398046511104","8796093022208","17592186044416","35184372088832","70368744177664","140737488355328","0","562949953421312","0","2251799813685248","0","9007199254740992","18014398509481984","36028797018963968","72057594037927936","0","288230376151711744","0","0","2305843009213693952","4611686018427387904","0","18446744073709551616","36893488147419103232","73786976294838206464","147573952589676412928","0","590295810358705651712","1180591620717411303424","2361183241434822606848","4722366482869645213696","0","0","37778931862957161709568","75557863725914323419136","0","0","604462909807314587353088","1208925819614629174706176","2417851639229258349412352","4835703278458516698824704","9671406556917033397649408","19342813113834066795298816","38685626227668133590597632","0","154742504910672534362390528","0","0","1237940039285380274899124224","2475880078570760549798248448","0","9903520314283042199192993792","19807040628566084398385987584","39614081257132168796771975168","79228162514264337593543950336","158456325028528675187087900672","316912650057057350374175801344","0","0","0","5070602400912917605986812821504","10141204801825835211973625643008","20282409603651670423947251286016","0","81129638414606681695789005144064","0","324518553658426726783156020576256","0","1298074214633706907132624082305024","2596148429267413814265248164610048","5192296858534827628530496329220096","0","20769187434139310514121985316880384","41538374868278621028243970633760768","83076749736557242056487941267521536","166153499473114484112975882535043072","0","664613997892457936451903530140172288","0","2658455991569831745807614120560689152","5316911983139663491615228241121378304","10633823966279326983230456482242756608","0","0","85070591730234615865843651857942052864","0","1","1","1","1","1","1","1","1","1","1","1","1","1","0","1","1","0","1","1","1","1","1","1","1","0","1","1","1","0","0","1","1","0","1","1","0","0","1","1","1","1","1","1","1","1","1","1","0","1","0","1","0","1","1","1","1","0","1","0","0","1","1","0","1","1","1","1","0","1","1","1","1","0","0","1","1","0","0","1","1","1","1","1","1","1","0","1","0","0","1","1","0","1","1","1","1","1","1","0","0","0","1","1","1","0","1","0","1","0","1","1","1","0","1","1","1","1","0","1","0","1","1","1","0","0","1","1","0","0","0","0","0","0","1","1","1","1","0","0","0","0","0","3403282052539321372122021860745657553680346102370129270104818183970772517761","1","0","1","0","0","3966084645890315710559696097731071392208711270577602201535613204174857094254","1","0","1","0","1","0","1","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","0","0","1","0","0","0","1","0","0","0","1","0","0","0","0","1","0","0","0","0","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","16751074199471344286802035516092717228413021805857911221340709282829922649570","16607689897250896163839120369329143853138821982212506869796223602775242163908","6306670965815533610139978731151082260521747949859106157811737942199411096763","8230394042541507458651300722707802655073997691897399557296075563607891385931","9921340941556354371580059537039333469973209453102024699252654455316059290620","16798896597145667139496131042097011601219503268718208432881915127321311248865","10761622635138561113453616724326151200504548364659640959171019993528403053596","4201374595453568719536041091370119651099375260803977706482746783208488880305","9971587591474752610461421108018095077842562578014452361783151616467835435111","5516956972178305312309254917389099764623678730180225999630364134360264110082","15066785865404294422881557619360885995614121995592112712990143250762198336884","21755300202021669800310961644948292234097575522286241219994206014548021317507","44312224132391919278568080003847402581022440080536924033423180021727388015","17589524827975147485715615321649189469791625723245721893742228097834086947532","8719984869514470722047522645705044152404773497435222154684105742564180785917","12838432770668333832140112504623798777955855545564491234660602333126926294802","10962219331981126937794734082126576683795140107663121675442940913117472782171","11315763313939367564880085930200632291397536948843222126556649652575069224853","9490320164035243469515553845741859611832694165395589257142226352243136301303","14573213588623917823708851377700803537638194753660392663536665732379880810694","11957092005664205224141548929385856436673493267279705778466447868093190736829","2201153109770645202954444876374528386609966279164593010871872560011817397913","11082747672059648638492717211402437406817522242047530271849521934851141518229","20477546427784935443802032434219911124745095329100703429739367686725375043621","20413669078949764936443689287676556111623164824373754014432737811311226761753","12881136730064110218094313142501866107021596701447009682940537878392614463314","13227437990758291440620943688822553930025228016992494659907178847660023537124","16572644556309208037124906701824425475845839679912404017132481770297056142431","19207525364486005896906208137031026335360739161340583275343816203229308414622","13749935216854607186487641922071692492037890524402382020370477865659977471212","14305753616231100452668590820745059778506427001382290586975701645092921660548","765857276287722813531198419619164140070915902829725892404102530083930750063","17837831429010867898764848684310505000314798050293841430668793505708981358048","21265099592359165713925953648362407254559580913936166135963567928466675766562","9836732997058077094526466589020739322840803019139480203465858201631980200718","7950736069218471132276924429739021815862792210045959677128696849570697403704","4769271140055336949069111665742509949024134261124654997310716329224630277762","20393350587508813313089483176581445684689819238531002176517292760755869721350","38149718364286962749939608665460785683852940908425655353420799858383968080","294908462199902072876663185334271659283432370640074451060800538373960973112","15686183370543867546923411519048855269420334921977460677980634391907762285104","7739644896700310773878882243266703498955498777056626589614168707182557659069","8962053441358370892949398584321217001524120474906547766312555570245268276141","10485968530935240560535418413665896337924134365028112810521932629743032594567","10455176935063524730554996425761077284254888258693211809138770824018864886743","14115566565369486572031311310429302802089825334724609634263576446726737605806","20073124591363501366789760608831383241995767850640689122251701726731390338567","18044196147441334580548109144408355893452990965490068051314106336265811591526","11777763830067607118918986120012546064057341507222391327324648823238698980251","5076285475125881250450494722872064230965358749104743996583186222500686678935","9433671005987645330351463650157742363370796004102441907383343518108550265783","16007614664479860453771437441344953439396368135713518528960723657246075833228","3670983463941934079214226480204001841287142286161279531732782678406433460843","7046179718502550936980595924901442920616633571872416339261615305735715278602","17608692011920050118706235959991963886935386829021365964093748239332711649084","2996821855883838728759536316610792557284394221854997002429026293476701752866","1677231509722364930842177352080930133827209916580071048531613825027648977700","20514621385694392131023051208602786923531777062045824148198436025028161478292","18706232149332458956113227927382844148669824578035828945319576383268514596397","11536282866871845249336852725858083392404317076310198593892963050259371331649","20466198999255199834400800454553246058101307023747737024879595930133188864963","17213082575127239224295748117279913461834934345205651804512629361221712146029","19484671891372768411934382885285679105157644357942611948795072906049381809678","8503442112050525052228756834095001115345112944909240539866003384575979945546","1591002621123168604526593223171654111798901832992697089266968330710061317327","17926989791280931197506965049310631268713794343236183001990363712296100776267","9818426793010627181403113577980666147935770130277255691539405567600286312065","9942988821595010693836539395678956414086510769345202336272828286806505105690","11428337004946391003737882643329882420040707267209738526410651698195832612398","5246173256091330545722754324790141877812115594929637564770216594001202665291","9244678589481971155093167074568918052432648706230664195707777716588708425821","16484327628325306003364245414567032312084673791908596909706339237437400759774","15909549332391486405320400238323446874739232392980137232129556119929377881543","4605603680690078397409074258309278031489863163721440064230911400507819976731","11932390595676097724926919191547257683296828193773941999444763120344004292794","21261316293685003751543366541787086957146195861519918738279059420379259769912","21694342134861979785664822222441943407054500023420869221254046994410705539047","13455418065215420116004885303563860520053149691344937005371740002984186620259","21294895762334183277561199056622692153331598314844350195434334666176806203759","2298913285650149740197504916695862209035358355428627300724306426005525816892","6433628427964344837720421894751973624448162124243791938584892092692934497062","13980638727833468810299341230787216089256640947577023476618983231259366747402","16386989380774535566905941270495126370482370902137781001804268887369782038022","3779483885209758277783355831078003188483448889651898318713331166172699636659","13118689370009477102054967134335796733104690982621174244425832900274928932116","21445533669518956637854447045256826873132438263003600821648791482859243407079","5527331762329369159390944165620100309794622537826464839886395712108419580582","3982772412651522640643769699838411900841643087659996933180626455834078733729","8936887292441133154504378719580283709673438127834570894253255440130778560891","5689786437531621897454594927415077264858288108775631464102476970728285871609","6370104324738040905290397305607362815394997849284017671587890146354255852594","2562605975511809500373038481836128711166779361259424204015484454382469913903","8009939360434127939211330421690368857019489809160778015418598167076961485953","6207214611018146300599438189744645959242652217703597746064748175193260329591","16671090648797063256204148088217002774332376248497761795371610457828028740038","351920541540014679905588425887435163878844099034359672557071300875572975398","21058204412077323033815879298722170627087867902547775349664797410908803369974","14564771468858246038476497989063618180073537400380117152664301508245795360502","8272882885871254955349820427886161624704712655862030935537145720959792892274","6909321091395274276146501993203761280720491918442748432524267471458601993221","16580321413206363974123623814602922867712388513971038402753464758491015803565","843281673245380754722495246696808119685404475704137112513160388856240699325","10171659328829219575897640303524498462582095234092978615905848203599889269897","5280538311454636369301273025630273683522547291583648504386454238616356441491","16623616276068850220179897023862034811947741374757987914392112935677729609272","19853123512203259979603644963397956834690886149706076304732426191753395611491","955364103151966477697350532913523016231165744311492647080211628659701871391","20523715452656959031445477013594952421617762425683127800448733851153498579066","14293535687965811563014333045217822091100404926900397852150955930734852567984","4229676629734606989516536240720033922492197958317336524425272064033701231219","18901397382211336164186387913666617814943452495137150951121911861411601103404","14375484255313188168372529479566281408768539401520374973084172059374055840588","19545798768864804171001454865226638660566831783618291009839659068600532212741","12755887933202061913161194217993793715343250197162556258497417497956440593759","8686513030225489957270848893530798775170299685233413267611917464195410557211","5880638904324026409005302950304740533498165011473478865956931412853188357431","7354389273252412391825625422266284022910347922206550320847139744353922366698","7016237351930429912019063230239434124147424389329878468689095040305536565141","5620972089534918638996272688507749091836816762473512644976785924112182176059","20413835273287925719552648605928582957864781808563858039878873559057433938566","11990352873652827398677739409877583255209694499432033562422373811536346570826","11452116767092430632569157126777353261344552818614541313334131497235795274616","13608939909527726586864284167014632459539109382363764498491490357609068357661","19699932497952889669632765576298327295926506735107495829131115663202263356665","15251682785177950917305927011901953367908953567062062215661324049886315524643","20988180365782566790010352815052502389134630736373419926172473693216627536947","7836720310496068244885024104589560761724497802627198466406853572609572183783","8038431537840849850004264549778072928837344446259802659731886224882799164652","2029425248168573578041930579769085260473443689520829116695151637114698378179","14014583048054989975362949820515352457455051497561401705089149965549711007728","10229910039445142063805930610858936389530402461507274678278419431360560041672","18414356640728818641083254061594699427771424933767295240543780118943302353557","14385363499980792320572694168709347498076611078827580165565397937806655843600","17574003158941143569210345425977586387561202207597212418442851062273722778557","5020456663555107491462633901410150293006360280142421036527516054973198917775","20127051627292194507636525988626707066686058957062478135802400381125882156129","20897939964842847172746478761928317623445313616223360444114601438540638075545","4768232651051213290835674042772040002316324578972496328572277887954854608839","17294503583995767475859552377185515589678216285313681942711238998872988167848","14649373813471851945320940299605201018392088399780709659677169234196157620092","8780430624549024727143069679282190039037099678026940232022642526296513616209","19379993141583360349219631444991584062781246208701481966534256751049466960129","15269077688496085659395433896981555224821074535243453599961761864702497339408","5391117857262141392878145098178984215824926943428788260915775917501212609214","7908721172934600956268520018234658066175251014237965624123564978124712802362","7874341505294103336917508655326356231557632351889805234868207045464424182027","14717357719887344869049716594829853959760329970432750252010555421746110830753","3360261399639751762974090530765480555630239123582758200815794978493014885586","9821826804670125425236325658293385777765305748666267887783525427098280556536","17204157028222666500796136628457984571840002100152982240371475388423494849033","5542034861058754185477946991198906162285361355155642038893943908835601160038","3683282103686594289964931403051831385975351230136466856931777064461047733401","15224685775706801324889650391158158261567751841767486050473559405133656352415","14348433140170281101901970266749278653067511062361719376252531576778262236894","11561449914623393122383031050474623941756403082164093879442389899363860513713","18245049492685205869746697260817503761252527622829228814032380169292346673291","17504537922258513011905565287240975149408627350242698790215780212356407248353","1087354866746490755068915240098723302841828156617728293233180699369449595227","6969042902258472469564623163041902613727762494563269234625798939473325810728","19781365794109169059730125820268469324655465578674107499591208131269329184831","19197720132445970072674786026374184753486316604335554230360798533521780079016","8985344752484815619908870528789201141893762847988902632020302966238055069038","6180566225714340566468063951590163252160515912634301758875151812293005995707","7886321650473731550722613550286337225983696528924522412475864179994945154038","1770329309062897291917236776676146963443813646104822628855480965002025402285","2672465549015492990178140878418702146106524780378266324725481883753805796676","9510938473472052600166974310685487461419214920988365840433371267775469202990","8763681409640408511774703386738865004873345690332395131153581718682846235816","5086184804083998594076230176630486989159676487216439626195171443687145611476","3444180739794824231911901354495926100580172575807360182050883799956253686124","19959585945609801580752975266494803324672866918723431810286213367913961455037","3606118653399557978017653345353488674231963545742074503030228140079743128217","9802232062091145454674219420688213272404224274164975947158499021341809478056","14753794963203840670689834131757653710719077219319396758581277854471817219976","10293226843634758194510263296936027709342071523680880184525420653949365085783","12718806094899532360102670898087743973296203292888146926436211859399441382266","19720557165108559470587427734825443980468432595646509009288337442868761549209","11247390882107475711483619058539054176238525726311758865073230404212341552278","15462509904958076555211488611104595950707114200311503866776513865723341096539","19234760699502123418676309783515052697057041962626575225401675314728972650121","17158261287148866987348692179057818719922602171392849314284493894658836825746","15365955529424977292357623764025498682706496161142382817837522205572607763997","20052202240009352261741122369957280265238958638450496105242649976727648471603","423357909332235822254079656696928158152503031658093508494175901331804543226","15922263825513783744583412081948095026829380051325974037117331160273000625665","21608880876703158853582170966053859080506692816444303830697579496441737611292","14979302256083977877181830607642975718819599820161889327504074019516836927010","21610296362574306626509926774800244990065257145430368375419027492142934708446","17595716914975830356499498547074024086847211138200645735802384039048171815958","14654668119168864815561684444214692059474181246705559164525875353227464689053","7909137102568989978451284135464888703672144746229046026942372688255268205369","14812130315252358082784842576665409029101165747479648757059927502821594119043","19533381322254969505860938447353219937929507327716748825809064520539543455254","9403823843450196420799337565010549178259435908490320872849582783166065168282","10464241134417201329419510220104949346527274013274592882563416495012556125132","9301345819661937440725860028779312914339790525885214274554275091844623535968","11291714547013661830332569817711684505569815478772306103530109513027459828741","16566712313878755327910485384356179345881280692463454520410105624337016288883","9857254387540706281892224858708177932493833333242386469874406815551456850784","13235323444556237974521531300791907080635475702604350856205423158574376182435","6837328857570342508089383303046615979341710677796715226424263996563411126589","9567191971502453137803265066675229742925788197509550723183106561667775516503","13589520733675005345281874911032983354954922397198387703860557678089764021921","104175365654736775178218750541299505009591406942062749114421467907345346042","590163818614270202706155060786980081635141531931653658533034907216652933183","11630836030911095078662233290280414853525666587225870019070111475894870557937","3143463001554546949388574227992235144909572072667494575339346439434777710214","17210674657600746455132196643290051407032499980059412222084673652147666262244","19558381360647054135714232130709740454803497350056006816389092459633204536306","16883239974151654186618501613502254189172694896294262882551553603289459762207","8413661446386279271250258046703699372256294759176301597443419113141652463386","17926420509822647309653607861708033860852594098459584436645268742667896895558","19824925766389886827250259916041015429740610094218960702010388823681796598372","21569124030016608055974854740419962472020200788866623348222538997741654501795","14232424310854472834356314082148076539296957249563473004688613559676523926509","15193615028121862883292210509489791742567273312408676269715846648108564480216","4571863685585148023589373809103548979799867639025504561868195666694987162026","6206779924996162752046602034743078689551092997538497731303258570990576183904","13551354910729069809580067054835607774880530108885793285331679609370500875004","9899791381683262402504188099370233883995824403872277909479896171174493425427","19676726055572810021222964113026140207269355942060367353065169172081559784672","842852341267559061264418048500907996345833086685212080144270808293582991176","2374896551530407137601201042234188834144647343362619212010730934843698743587","7541169441788393045940373474338091879780271077778260807857446771010926024429","11136936778745143751630950186644088027953411966465838448171145474563978816093","10104692900610618203101067220992674388402050900350351026933004613495030125962","9448067584436414960964337190111983737612300524270450316697483521460203416821","8950186827869639604172647121100447815900277491673507364868135313567370094566","13506425119440201268368754328546416032565667481881592632895304755531522876713","8980168571796290804339343950808891004720242960395088290536220280570423270238","18170882696616761010489613056792567852402646771641587111297862995908970291284","17964914132412404677996740117340161470056406021410685722116447488755963163990","4999254529824068728272549382468024522346083624068028557197677399460354032302","19863286783514673257602438096028698340633489355546438580505275806712888618797","8597501472019579693110022148133358484974050449265021769883471363830981070438","15745697387452707443485700990949175358831586983137296283366195319537908003288","13137385666206357557612894624274538332141042254638811649741671391041335368023","17489444249761129472685381315022721658390849238308934118982939182052647535064","7817235089381823509145374360042255112726388997005284838446772709175711038688","14266303771668205536382691342596456410509199091923271798848518821724529136059","3636857805719964585971325322044663359458065705759731491721865284507973354939","15992868605947752108489235540799285759772965578817149705232162327368620329585","1335686142273152709365597717137409998821127623205060581051968539417021206504","6433290482925748613794540660743040431650259914794007152150057855153874666944","1361143257838811133926634806224247744517655450729374562521500236431831031476","18225681286815161411121137668234617452312048153276117017888242519394843989168","19843309075203033669895762315323851121116692526905833370940041980425774744571","15228011749951502720507138380119493145011628580619540200408217541371854380957","19619902256720178830677177598316556548461566595041053642017410940299852914682","511045245706260898110690359652263936223759289411819460157040898756960539462","7391377516085877772042712644814217270885890613808054711267621194257918442112","5891519591265284241203789998585637602270159400314233944803142442234700250863","2205432830627138420924593517638591617200352501757865976823844451062848337881","3222440233016699218240995056566298768106156979610420431469004199306974269103","8738332104312050387266272441686236247554960069301415997266286065690829290396","1551797112498648676836888480223639601740456286931633071547538018561520713544","1533866262507880248780245731190869299029017561560482981975068249985135371067","3996384786620540375232033672025195552610224229344345117985645908694200761016","16595891332727724151340175555326766529692459983213346368706615677339339240020","11523034561885962354991131363057963624098255825893327869682794018887379424097","21037920806606953471816674932313658324079485042735787472381615025003112432904","19591615019774495060998741485447874831723014393820542494077889189192102109031","9121850391530996471222427082549856324643713020999728941399437734853739817153","6849010089591794160862035089126940514820060634802302095512422500449021208898","21803985179639408855590213016678692901492191793853596659193109444086006378119","13364642672122219159126189111975702569548137252134210263160227802926124348078","16905269331135488328605515318505661227228474740876565481132283687997616028861","11264009642168330483857233256241513200490483139661004283535705073110138982890","5332394467645666696623235864746879605637402312414276534976098157513611666542","17925301199630013346486151991337546692422339664903952576083922784335751134079","11900184416418670354965232151665958518848952270854151924870211669630781631223","15562113593580216239006544427542674838265849698433044757495991364465187405884","3806304128817128192424875722779633391243742313942202394988632791379590507084","4657338409098638664678315846850627043185036888996779552648742031908099581588","15813005888849962389158961584970173978097218996267117171684509555319301477411","17056578011328104553093128374315470853531917998809681241413306393882725625198","6430589065893485715796702045939612847939363293990681504299985210155618562864","7514454699643127952791367885323645723388779246392186109883710722291187240497","7826937063653788873418085859562133984976335940156012117355343731656725674347","2225655582871701716469716244290307217751235918380896133272619906562931866876","11565133364312756310075478066314302953761772900026528225403220752431976340190","18232452026689223969965820968016739847092564814758593382764078404018135510023","1358358355244320152796507416231954843591920800744392329047477141132664693794","2597241426605278043922861599217180508175107341199392281858695037638300643180","17674515264858256312450756598079170929596539962153597882812281349637224943254","3143421480716849445957518543992988300614287126569006297241763368177602468592","15933437847230001720929677769855858682918236257655835442179345528393419564882","6733106851709743508924920069771721545927217564131624545573720030931843427107","3903499693696421946995265411390118861168305725858301760878023455038512768658","14433872132790123652832156520925166553485145595432897200832458531093296216884","7097617002748651760063122634260707663385999924497452509206216049717006887614","9196893673129829898318166605040425641260075795136163048833535143632480806738","19140091520550535179093575244921354004409797700450072348027875067724407780771","13815362122463786845354711610276132099779552968788780241453140843664912171289","132329010991610972419019365039613190472336282083377290824055198940312830513","2049181411991933045514610569712374231531845833062261528528564288748902967619","9942692693883003669846738387378238020204191501223875692726715738542841527104","6283754404754969631949771092743204859616073374053464616082489188503158661340","13531881648062996717630837244804254055395580039994975987100053481374744485749","0","0","0","0","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","16751074199471344286802035516092717228413021805857911221340709282829922649570","16607689897250896163839120369329143853138821982212506869796223602775242163908","6306670965815533610139978731151082260521747949859106157811737942199411096763","8230394042541507458651300722707802655073997691897399557296075563607891385931","9921340941556354371580059537039333469973209453102024699252654455316059290620","16798896597145667139496131042097011601219503268718208432881915127321311248865","10761622635138561113453616724326151200504548364659640959171019993528403053596","4201374595453568719536041091370119651099375260803977706482746783208488880305","9971587591474752610461421108018095077842562578014452361783151616467835435111","5516956972178305312309254917389099764623678730180225999630364134360264110082","15066785865404294422881557619360885995614121995592112712990143250762198336884","21755300202021669800310961644948292234097575522286241219994206014548021317507","44312224132391919278568080003847402581022440080536924033423180021727388015","17589524827975147485715615321649189469791625723245721893742228097834086947532","8719984869514470722047522645705044152404773497435222154684105742564180785917","12838432770668333832140112504623798777955855545564491234660602333126926294802","10962219331981126937794734082126576683795140107663121675442940913117472782171","11315763313939367564880085930200632291397536948843222126556649652575069224853","9490320164035243469515553845741859611832694165395589257142226352243136301303","14573213588623917823708851377700803537638194753660392663536665732379880810694","11957092005664205224141548929385856436673493267279705778466447868093190736829","2201153109770645202954444876374528386609966279164593010871872560011817397913","11082747672059648638492717211402437406817522242047530271849521934851141518229","20477546427784935443802032434219911124745095329100703429739367686725375043621","20413669078949764936443689287676556111623164824373754014432737811311226761753","12881136730064110218094313142501866107021596701447009682940537878392614463314","13227437990758291440620943688822553930025228016992494659907178847660023537124","16572644556309208037124906701824425475845839679912404017132481770297056142431","19207525364486005896906208137031026335360739161340583275343816203229308414622","13749935216854607186487641922071692492037890524402382020370477865659977471212","14305753616231100452668590820745059778506427001382290586975701645092921660548","765857276287722813531198419619164140070915902829725892404102530083930750063","17837831429010867898764848684310505000314798050293841430668793505708981358048","21265099592359165713925953648362407254559580913936166135963567928466675766562","9836732997058077094526466589020739322840803019139480203465858201631980200718","7950736069218471132276924429739021815862792210045959677128696849570697403704","4769271140055336949069111665742509949024134261124654997310716329224630277762","20393350587508813313089483176581445684689819238531002176517292760755869721350","38149718364286962749939608665460785683852940908425655353420799858383968080","294908462199902072876663185334271659283432370640074451060800538373960973112","15686183370543867546923411519048855269420334921977460677980634391907762285104","7739644896700310773878882243266703498955498777056626589614168707182557659069","8962053441358370892949398584321217001524120474906547766312555570245268276141","10485968530935240560535418413665896337924134365028112810521932629743032594567","10455176935063524730554996425761077284254888258693211809138770824018864886743","14115566565369486572031311310429302802089825334724609634263576446726737605806","20073124591363501366789760608831383241995767850640689122251701726731390338567","18044196147441334580548109144408355893452990965490068051314106336265811591526","11777763830067607118918986120012546064057341507222391327324648823238698980251","5076285475125881250450494722872064230965358749104743996583186222500686678935","9433671005987645330351463650157742363370796004102441907383343518108550265783","16007614664479860453771437441344953439396368135713518528960723657246075833228","3670983463941934079214226480204001841287142286161279531732782678406433460843","7046179718502550936980595924901442920616633571872416339261615305735715278602","17608692011920050118706235959991963886935386829021365964093748239332711649084","2996821855883838728759536316610792557284394221854997002429026293476701752866","1677231509722364930842177352080930133827209916580071048531613825027648977700","20514621385694392131023051208602786923531777062045824148198436025028161478292","18706232149332458956113227927382844148669824578035828945319576383268514596397","11536282866871845249336852725858083392404317076310198593892963050259371331649","20466198999255199834400800454553246058101307023747737024879595930133188864963","17213082575127239224295748117279913461834934345205651804512629361221712146029","19484671891372768411934382885285679105157644357942611948795072906049381809678","8503442112050525052228756834095001115345112944909240539866003384575979945546","1591002621123168604526593223171654111798901832992697089266968330710061317327","17926989791280931197506965049310631268713794343236183001990363712296100776267","9818426793010627181403113577980666147935770130277255691539405567600286312065","9942988821595010693836539395678956414086510769345202336272828286806505105690","11428337004946391003737882643329882420040707267209738526410651698195832612398","5246173256091330545722754324790141877812115594929637564770216594001202665291","9244678589481971155093167074568918052432648706230664195707777716588708425821","16484327628325306003364245414567032312084673791908596909706339237437400759774","15909549332391486405320400238323446874739232392980137232129556119929377881543","4605603680690078397409074258309278031489863163721440064230911400507819976731","11932390595676097724926919191547257683296828193773941999444763120344004292794","21261316293685003751543366541787086957146195861519918738279059420379259769912","21694342134861979785664822222441943407054500023420869221254046994410705539047","13455418065215420116004885303563860520053149691344937005371740002984186620259","21294895762334183277561199056622692153331598314844350195434334666176806203759","2298913285650149740197504916695862209035358355428627300724306426005525816892","6433628427964344837720421894751973624448162124243791938584892092692934497062","13980638727833468810299341230787216089256640947577023476618983231259366747402","16386989380774535566905941270495126370482370902137781001804268887369782038022","3779483885209758277783355831078003188483448889651898318713331166172699636659","13118689370009477102054967134335796733104690982621174244425832900274928932116","21445533669518956637854447045256826873132438263003600821648791482859243407079","5527331762329369159390944165620100309794622537826464839886395712108419580582","3982772412651522640643769699838411900841643087659996933180626455834078733729","8936887292441133154504378719580283709673438127834570894253255440130778560891","5689786437531621897454594927415077264858288108775631464102476970728285871609","6370104324738040905290397305607362815394997849284017671587890146354255852594","2562605975511809500373038481836128711166779361259424204015484454382469913903","8009939360434127939211330421690368857019489809160778015418598167076961485953","6207214611018146300599438189744645959242652217703597746064748175193260329591","16671090648797063256204148088217002774332376248497761795371610457828028740038","351920541540014679905588425887435163878844099034359672557071300875572975398","21058204412077323033815879298722170627087867902547775349664797410908803369974","14564771468858246038476497989063618180073537400380117152664301508245795360502","8272882885871254955349820427886161624704712655862030935537145720959792892274","6909321091395274276146501993203761280720491918442748432524267471458601993221","16580321413206363974123623814602922867712388513971038402753464758491015803565","843281673245380754722495246696808119685404475704137112513160388856240699325","10171659328829219575897640303524498462582095234092978615905848203599889269897","5280538311454636369301273025630273683522547291583648504386454238616356441491","16623616276068850220179897023862034811947741374757987914392112935677729609272","19853123512203259979603644963397956834690886149706076304732426191753395611491","955364103151966477697350532913523016231165744311492647080211628659701871391","20523715452656959031445477013594952421617762425683127800448733851153498579066","14293535687965811563014333045217822091100404926900397852150955930734852567984","4229676629734606989516536240720033922492197958317336524425272064033701231219","18901397382211336164186387913666617814943452495137150951121911861411601103404","14375484255313188168372529479566281408768539401520374973084172059374055840588","19545798768864804171001454865226638660566831783618291009839659068600532212741","12755887933202061913161194217993793715343250197162556258497417497956440593759","8686513030225489957270848893530798775170299685233413267611917464195410557211","5880638904324026409005302950304740533498165011473478865956931412853188357431","7354389273252412391825625422266284022910347922206550320847139744353922366698","7016237351930429912019063230239434124147424389329878468689095040305536565141","5620972089534918638996272688507749091836816762473512644976785924112182176059","20413835273287925719552648605928582957864781808563858039878873559057433938566","11990352873652827398677739409877583255209694499432033562422373811536346570826","11452116767092430632569157126777353261344552818614541313334131497235795274616","13608939909527726586864284167014632459539109382363764498491490357609068357661","19699932497952889669632765576298327295926506735107495829131115663202263356665","15251682785177950917305927011901953367908953567062062215661324049886315524643","20988180365782566790010352815052502389134630736373419926172473693216627536947","7836720310496068244885024104589560761724497802627198466406853572609572183783","8038431537840849850004264549778072928837344446259802659731886224882799164652","2029425248168573578041930579769085260473443689520829116695151637114698378179","14014583048054989975362949820515352457455051497561401705089149965549711007728","10229910039445142063805930610858936389530402461507274678278419431360560041672","18414356640728818641083254061594699427771424933767295240543780118943302353557","14385363499980792320572694168709347498076611078827580165565397937806655843600","17574003158941143569210345425977586387561202207597212418442851062273722778557","5020456663555107491462633901410150293006360280142421036527516054973198917775","20127051627292194507636525988626707066686058957062478135802400381125882156129","20897939964842847172746478761928317623445313616223360444114601438540638075545","4768232651051213290835674042772040002316324578972496328572277887954854608839","17294503583995767475859552377185515589678216285313681942711238998872988167848","14649373813471851945320940299605201018392088399780709659677169234196157620092","8780430624549024727143069679282190039037099678026940232022642526296513616209","19379993141583360349219631444991584062781246208701481966534256751049466960129","15269077688496085659395433896981555224821074535243453599961761864702497339408","5391117857262141392878145098178984215824926943428788260915775917501212609214","7908721172934600956268520018234658066175251014237965624123564978124712802362","7874341505294103336917508655326356231557632351889805234868207045464424182027","14717357719887344869049716594829853959760329970432750252010555421746110830753","3360261399639751762974090530765480555630239123582758200815794978493014885586","9821826804670125425236325658293385777765305748666267887783525427098280556536","17204157028222666500796136628457984571840002100152982240371475388423494849033","5542034861058754185477946991198906162285361355155642038893943908835601160038","3683282103686594289964931403051831385975351230136466856931777064461047733401","15224685775706801324889650391158158261567751841767486050473559405133656352415","14348433140170281101901970266749278653067511062361719376252531576778262236894","11561449914623393122383031050474623941756403082164093879442389899363860513713","18245049492685205869746697260817503761252527622829228814032380169292346673291","17504537922258513011905565287240975149408627350242698790215780212356407248353","1087354866746490755068915240098723302841828156617728293233180699369449595227","6969042902258472469564623163041902613727762494563269234625798939473325810728","19781365794109169059730125820268469324655465578674107499591208131269329184831","19197720132445970072674786026374184753486316604335554230360798533521780079016","8985344752484815619908870528789201141893762847988902632020302966238055069038","6180566225714340566468063951590163252160515912634301758875151812293005995707","7886321650473731550722613550286337225983696528924522412475864179994945154038","1770329309062897291917236776676146963443813646104822628855480965002025402285","2672465549015492990178140878418702146106524780378266324725481883753805796676","9510938473472052600166974310685487461419214920988365840433371267775469202990","8763681409640408511774703386738865004873345690332395131153581718682846235816","5086184804083998594076230176630486989159676487216439626195171443687145611476","3444180739794824231911901354495926100580172575807360182050883799956253686124","19959585945609801580752975266494803324672866918723431810286213367913961455037","3606118653399557978017653345353488674231963545742074503030228140079743128217","9802232062091145454674219420688213272404224274164975947158499021341809478056","14753794963203840670689834131757653710719077219319396758581277854471817219976","10293226843634758194510263296936027709342071523680880184525420653949365085783","12718806094899532360102670898087743973296203292888146926436211859399441382266","19720557165108559470587427734825443980468432595646509009288337442868761549209","11247390882107475711483619058539054176238525726311758865073230404212341552278","15462509904958076555211488611104595950707114200311503866776513865723341096539","19234760699502123418676309783515052697057041962626575225401675314728972650121","17158261287148866987348692179057818719922602171392849314284493894658836825746","15365955529424977292357623764025498682706496161142382817837522205572607763997","20052202240009352261741122369957280265238958638450496105242649976727648471603","423357909332235822254079656696928158152503031658093508494175901331804543226","15922263825513783744583412081948095026829380051325974037117331160273000625665","21608880876703158853582170966053859080506692816444303830697579496441737611292","14979302256083977877181830607642975718819599820161889327504074019516836927010","21610296362574306626509926774800244990065257145430368375419027492142934708446","17595716914975830356499498547074024086847211138200645735802384039048171815958","14654668119168864815561684444214692059474181246705559164525875353227464689053","7909137102568989978451284135464888703672144746229046026942372688255268205369","14812130315252358082784842576665409029101165747479648757059927502821594119043","19533381322254969505860938447353219937929507327716748825809064520539543455254","9403823843450196420799337565010549178259435908490320872849582783166065168282","10464241134417201329419510220104949346527274013274592882563416495012556125132","9301345819661937440725860028779312914339790525885214274554275091844623535968","11291714547013661830332569817711684505569815478772306103530109513027459828741","16566712313878755327910485384356179345881280692463454520410105624337016288883","9857254387540706281892224858708177932493833333242386469874406815551456850784","13235323444556237974521531300791907080635475702604350856205423158574376182435","6837328857570342508089383303046615979341710677796715226424263996563411126589","9567191971502453137803265066675229742925788197509550723183106561667775516503","13589520733675005345281874911032983354954922397198387703860557678089764021921","104175365654736775178218750541299505009591406942062749114421467907345346042","590163818614270202706155060786980081635141531931653658533034907216652933183","11630836030911095078662233290280414853525666587225870019070111475894870557937","3143463001554546949388574227992235144909572072667494575339346439434777710214","17210674657600746455132196643290051407032499980059412222084673652147666262244","19558381360647054135714232130709740454803497350056006816389092459633204536306","16883239974151654186618501613502254189172694896294262882551553603289459762207","8413661446386279271250258046703699372256294759176301597443419113141652463386","17926420509822647309653607861708033860852594098459584436645268742667896895558","19824925766389886827250259916041015429740610094218960702010388823681796598372","21569124030016608055974854740419962472020200788866623348222538997741654501795","14232424310854472834356314082148076539296957249563473004688613559676523926509","15193615028121862883292210509489791742567273312408676269715846648108564480216","4571863685585148023589373809103548979799867639025504561868195666694987162026","6206779924996162752046602034743078689551092997538497731303258570990576183904","13551354910729069809580067054835607774880530108885793285331679609370500875004","9899791381683262402504188099370233883995824403872277909479896171174493425427","19676726055572810021222964113026140207269355942060367353065169172081559784672","842852341267559061264418048500907996345833086685212080144270808293582991176","2374896551530407137601201042234188834144647343362619212010730934843698743587","7541169441788393045940373474338091879780271077778260807857446771010926024429","11136936778745143751630950186644088027953411966465838448171145474563978816093","10104692900610618203101067220992674388402050900350351026933004613495030125962","9448067584436414960964337190111983737612300524270450316697483521460203416821","8950186827869639604172647121100447815900277491673507364868135313567370094566","13506425119440201268368754328546416032565667481881592632895304755531522876713","8980168571796290804339343950808891004720242960395088290536220280570423270238","18170882696616761010489613056792567852402646771641587111297862995908970291284","17964914132412404677996740117340161470056406021410685722116447488755963163990","4999254529824068728272549382468024522346083624068028557197677399460354032302","19863286783514673257602438096028698340633489355546438580505275806712888618797","8597501472019579693110022148133358484974050449265021769883471363830981070438","15745697387452707443485700990949175358831586983137296283366195319537908003288","13137385666206357557612894624274538332141042254638811649741671391041335368023","17489444249761129472685381315022721658390849238308934118982939182052647535064","7817235089381823509145374360042255112726388997005284838446772709175711038688","14266303771668205536382691342596456410509199091923271798848518821724529136059","3636857805719964585971325322044663359458065705759731491721865284507973354939","15992868605947752108489235540799285759772965578817149705232162327368620329585","1335686142273152709365597717137409998821127623205060581051968539417021206504","6433290482925748613794540660743040431650259914794007152150057855153874666944","1361143257838811133926634806224247744517655450729374562521500236431831031476","18225681286815161411121137668234617452312048153276117017888242519394843989168","19843309075203033669895762315323851121116692526905833370940041980425774744571","15228011749951502720507138380119493145011628580619540200408217541371854380957","19619902256720178830677177598316556548461566595041053642017410940299852914682","511045245706260898110690359652263936223759289411819460157040898756960539462","7391377516085877772042712644814217270885890613808054711267621194257918442112","5891519591265284241203789998585637602270159400314233944803142442234700250863","2205432830627138420924593517638591617200352501757865976823844451062848337881","3222440233016699218240995056566298768106156979610420431469004199306974269103","8738332104312050387266272441686236247554960069301415997266286065690829290396","1551797112498648676836888480223639601740456286931633071547538018561520713544","1533866262507880248780245731190869299029017561560482981975068249985135371067","3996384786620540375232033672025195552610224229344345117985645908694200761016","16595891332727724151340175555326766529692459983213346368706615677339339240020","11523034561885962354991131363057963624098255825893327869682794018887379424097","21037920806606953471816674932313658324079485042735787472381615025003112432904","19591615019774495060998741485447874831723014393820542494077889189192102109031","9121850391530996471222427082549856324643713020999728941399437734853739817153","6849010089591794160862035089126940514820060634802302095512422500449021208898","21803985179639408855590213016678692901492191793853596659193109444086006378119","13364642672122219159126189111975702569548137252134210263160227802926124348078","16905269331135488328605515318505661227228474740876565481132283687997616028861","11264009642168330483857233256241513200490483139661004283535705073110138982890","5332394467645666696623235864746879605637402312414276534976098157513611666542","17925301199630013346486151991337546692422339664903952576083922784335751134079","11900184416418670354965232151665958518848952270854151924870211669630781631223","15562113593580216239006544427542674838265849698433044757495991364465187405884","3806304128817128192424875722779633391243742313942202394988632791379590507084","4657338409098638664678315846850627043185036888996779552648742031908099581588","15813005888849962389158961584970173978097218996267117171684509555319301477411","17056578011328104553093128374315470853531917998809681241413306393882725625198","6430589065893485715796702045939612847939363293990681504299985210155618562864","7514454699643127952791367885323645723388779246392186109883710722291187240497","7826937063653788873418085859562133984976335940156012117355343731656725674347","2225655582871701716469716244290307217751235918380896133272619906562931866876","11565133364312756310075478066314302953761772900026528225403220752431976340190","18232452026689223969965820968016739847092564814758593382764078404018135510023","1358358355244320152796507416231954843591920800744392329047477141132664693794","2597241426605278043922861599217180508175107341199392281858695037638300643180","17674515264858256312450756598079170929596539962153597882812281349637224943254","3143421480716849445957518543992988300614287126569006297241763368177602468592","15933437847230001720929677769855858682918236257655835442179345528393419564882","6733106851709743508924920069771721545927217564131624545573720030931843427107","3903499693696421946995265411390118861168305725858301760878023455038512768658","14433872132790123652832156520925166553485145595432897200832458531093296216884","7097617002748651760063122634260707663385999924497452509206216049717006887614","9196893673129829898318166605040425641260075795136163048833535143632480806738","19140091520550535179093575244921354004409797700450072348027875067724407780771","13815362122463786845354711610276132099779552968788780241453140843664912171289","132329010991610972419019365039613190472336282083377290824055198940312830513","2049181411991933045514610569712374231531845833062261528528564288748902967619","9942692693883003669846738387378238020204191501223875692726715738542841527104","6283754404754969631949771092743204859616073374053464616082489188503158661340","13531881648062996717630837244804254055395580039994975987100053481374744485749","0","0","0","0","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","16751074199471344286802035516092717228413021805857911221340709282829922649570","16607689897250896163839120369329143853138821982212506869796223602775242163908","6306670965815533610139978731151082260521747949859106157811737942199411096763","8230394042541507458651300722707802655073997691897399557296075563607891385931","9921340941556354371580059537039333469973209453102024699252654455316059290620","16798896597145667139496131042097011601219503268718208432881915127321311248865","10761622635138561113453616724326151200504548364659640959171019993528403053596","4201374595453568719536041091370119651099375260803977706482746783208488880305","9971587591474752610461421108018095077842562578014452361783151616467835435111","5516956972178305312309254917389099764623678730180225999630364134360264110082","15066785865404294422881557619360885995614121995592112712990143250762198336884","21755300202021669800310961644948292234097575522286241219994206014548021317507","44312224132391919278568080003847402581022440080536924033423180021727388015","17589524827975147485715615321649189469791625723245721893742228097834086947532","8719984869514470722047522645705044152404773497435222154684105742564180785917","12838432770668333832140112504623798777955855545564491234660602333126926294802","10962219331981126937794734082126576683795140107663121675442940913117472782171","11315763313939367564880085930200632291397536948843222126556649652575069224853","9490320164035243469515553845741859611832694165395589257142226352243136301303","14573213588623917823708851377700803537638194753660392663536665732379880810694","11957092005664205224141548929385856436673493267279705778466447868093190736829","2201153109770645202954444876374528386609966279164593010871872560011817397913","11082747672059648638492717211402437406817522242047530271849521934851141518229","20477546427784935443802032434219911124745095329100703429739367686725375043621","20413669078949764936443689287676556111623164824373754014432737811311226761753","12881136730064110218094313142501866107021596701447009682940537878392614463314","13227437990758291440620943688822553930025228016992494659907178847660023537124","16572644556309208037124906701824425475845839679912404017132481770297056142431","19207525364486005896906208137031026335360739161340583275343816203229308414622","13749935216854607186487641922071692492037890524402382020370477865659977471212","14305753616231100452668590820745059778506427001382290586975701645092921660548","765857276287722813531198419619164140070915902829725892404102530083930750063","17837831429010867898764848684310505000314798050293841430668793505708981358048","21265099592359165713925953648362407254559580913936166135963567928466675766562","9836732997058077094526466589020739322840803019139480203465858201631980200718","7950736069218471132276924429739021815862792210045959677128696849570697403704","4769271140055336949069111665742509949024134261124654997310716329224630277762","20393350587508813313089483176581445684689819238531002176517292760755869721350","38149718364286962749939608665460785683852940908425655353420799858383968080","294908462199902072876663185334271659283432370640074451060800538373960973112","15686183370543867546923411519048855269420334921977460677980634391907762285104","7739644896700310773878882243266703498955498777056626589614168707182557659069","8962053441358370892949398584321217001524120474906547766312555570245268276141","10485968530935240560535418413665896337924134365028112810521932629743032594567","10455176935063524730554996425761077284254888258693211809138770824018864886743","14115566565369486572031311310429302802089825334724609634263576446726737605806","20073124591363501366789760608831383241995767850640689122251701726731390338567","18044196147441334580548109144408355893452990965490068051314106336265811591526","11777763830067607118918986120012546064057341507222391327324648823238698980251","5076285475125881250450494722872064230965358749104743996583186222500686678935","9433671005987645330351463650157742363370796004102441907383343518108550265783","16007614664479860453771437441344953439396368135713518528960723657246075833228","3670983463941934079214226480204001841287142286161279531732782678406433460843","7046179718502550936980595924901442920616633571872416339261615305735715278602","17608692011920050118706235959991963886935386829021365964093748239332711649084","2996821855883838728759536316610792557284394221854997002429026293476701752866","1677231509722364930842177352080930133827209916580071048531613825027648977700","20514621385694392131023051208602786923531777062045824148198436025028161478292","18706232149332458956113227927382844148669824578035828945319576383268514596397","11536282866871845249336852725858083392404317076310198593892963050259371331649","20466198999255199834400800454553246058101307023747737024879595930133188864963","17213082575127239224295748117279913461834934345205651804512629361221712146029","19484671891372768411934382885285679105157644357942611948795072906049381809678","8503442112050525052228756834095001115345112944909240539866003384575979945546","1591002621123168604526593223171654111798901832992697089266968330710061317327","17926989791280931197506965049310631268713794343236183001990363712296100776267","9818426793010627181403113577980666147935770130277255691539405567600286312065","9942988821595010693836539395678956414086510769345202336272828286806505105690","11428337004946391003737882643329882420040707267209738526410651698195832612398","5246173256091330545722754324790141877812115594929637564770216594001202665291","9244678589481971155093167074568918052432648706230664195707777716588708425821","16484327628325306003364245414567032312084673791908596909706339237437400759774","15909549332391486405320400238323446874739232392980137232129556119929377881543","4605603680690078397409074258309278031489863163721440064230911400507819976731","11932390595676097724926919191547257683296828193773941999444763120344004292794","21261316293685003751543366541787086957146195861519918738279059420379259769912","21694342134861979785664822222441943407054500023420869221254046994410705539047","13455418065215420116004885303563860520053149691344937005371740002984186620259","21294895762334183277561199056622692153331598314844350195434334666176806203759","2298913285650149740197504916695862209035358355428627300724306426005525816892","6433628427964344837720421894751973624448162124243791938584892092692934497062","13980638727833468810299341230787216089256640947577023476618983231259366747402","16386989380774535566905941270495126370482370902137781001804268887369782038022","3779483885209758277783355831078003188483448889651898318713331166172699636659","13118689370009477102054967134335796733104690982621174244425832900274928932116","21445533669518956637854447045256826873132438263003600821648791482859243407079","5527331762329369159390944165620100309794622537826464839886395712108419580582","3982772412651522640643769699838411900841643087659996933180626455834078733729","8936887292441133154504378719580283709673438127834570894253255440130778560891","5689786437531621897454594927415077264858288108775631464102476970728285871609","6370104324738040905290397305607362815394997849284017671587890146354255852594","2562605975511809500373038481836128711166779361259424204015484454382469913903","8009939360434127939211330421690368857019489809160778015418598167076961485953","6207214611018146300599438189744645959242652217703597746064748175193260329591","16671090648797063256204148088217002774332376248497761795371610457828028740038","351920541540014679905588425887435163878844099034359672557071300875572975398","21058204412077323033815879298722170627087867902547775349664797410908803369974","14564771468858246038476497989063618180073537400380117152664301508245795360502","8272882885871254955349820427886161624704712655862030935537145720959792892274","6909321091395274276146501993203761280720491918442748432524267471458601993221","16580321413206363974123623814602922867712388513971038402753464758491015803565","843281673245380754722495246696808119685404475704137112513160388856240699325","10171659328829219575897640303524498462582095234092978615905848203599889269897","5280538311454636369301273025630273683522547291583648504386454238616356441491","16623616276068850220179897023862034811947741374757987914392112935677729609272","19853123512203259979603644963397956834690886149706076304732426191753395611491","955364103151966477697350532913523016231165744311492647080211628659701871391","20523715452656959031445477013594952421617762425683127800448733851153498579066","14293535687965811563014333045217822091100404926900397852150955930734852567984","4229676629734606989516536240720033922492197958317336524425272064033701231219","18901397382211336164186387913666617814943452495137150951121911861411601103404","14375484255313188168372529479566281408768539401520374973084172059374055840588","19545798768864804171001454865226638660566831783618291009839659068600532212741","12755887933202061913161194217993793715343250197162556258497417497956440593759","8686513030225489957270848893530798775170299685233413267611917464195410557211","5880638904324026409005302950304740533498165011473478865956931412853188357431","7354389273252412391825625422266284022910347922206550320847139744353922366698","7016237351930429912019063230239434124147424389329878468689095040305536565141","5620972089534918638996272688507749091836816762473512644976785924112182176059","20413835273287925719552648605928582957864781808563858039878873559057433938566","11990352873652827398677739409877583255209694499432033562422373811536346570826","11452116767092430632569157126777353261344552818614541313334131497235795274616","13608939909527726586864284167014632459539109382363764498491490357609068357661","19699932497952889669632765576298327295926506735107495829131115663202263356665","15251682785177950917305927011901953367908953567062062215661324049886315524643","20988180365782566790010352815052502389134630736373419926172473693216627536947","7836720310496068244885024104589560761724497802627198466406853572609572183783","8038431537840849850004264549778072928837344446259802659731886224882799164652","2029425248168573578041930579769085260473443689520829116695151637114698378179","14014583048054989975362949820515352457455051497561401705089149965549711007728","10229910039445142063805930610858936389530402461507274678278419431360560041672","18414356640728818641083254061594699427771424933767295240543780118943302353557","14385363499980792320572694168709347498076611078827580165565397937806655843600","17574003158941143569210345425977586387561202207597212418442851062273722778557","5020456663555107491462633901410150293006360280142421036527516054973198917775","20127051627292194507636525988626707066686058957062478135802400381125882156129","20897939964842847172746478761928317623445313616223360444114601438540638075545","4768232651051213290835674042772040002316324578972496328572277887954854608839","17294503583995767475859552377185515589678216285313681942711238998872988167848","14649373813471851945320940299605201018392088399780709659677169234196157620092","8780430624549024727143069679282190039037099678026940232022642526296513616209","19379993141583360349219631444991584062781246208701481966534256751049466960129","15269077688496085659395433896981555224821074535243453599961761864702497339408","5391117857262141392878145098178984215824926943428788260915775917501212609214","7908721172934600956268520018234658066175251014237965624123564978124712802362","7874341505294103336917508655326356231557632351889805234868207045464424182027","14717357719887344869049716594829853959760329970432750252010555421746110830753","3360261399639751762974090530765480555630239123582758200815794978493014885586","9821826804670125425236325658293385777765305748666267887783525427098280556536","17204157028222666500796136628457984571840002100152982240371475388423494849033","5542034861058754185477946991198906162285361355155642038893943908835601160038","3683282103686594289964931403051831385975351230136466856931777064461047733401","15224685775706801324889650391158158261567751841767486050473559405133656352415","14348433140170281101901970266749278653067511062361719376252531576778262236894","11561449914623393122383031050474623941756403082164093879442389899363860513713","18245049492685205869746697260817503761252527622829228814032380169292346673291","17504537922258513011905565287240975149408627350242698790215780212356407248353","1087354866746490755068915240098723302841828156617728293233180699369449595227","6969042902258472469564623163041902613727762494563269234625798939473325810728","19781365794109169059730125820268469324655465578674107499591208131269329184831","19197720132445970072674786026374184753486316604335554230360798533521780079016","8985344752484815619908870528789201141893762847988902632020302966238055069038","6180566225714340566468063951590163252160515912634301758875151812293005995707","7886321650473731550722613550286337225983696528924522412475864179994945154038","1770329309062897291917236776676146963443813646104822628855480965002025402285","2672465549015492990178140878418702146106524780378266324725481883753805796676","9510938473472052600166974310685487461419214920988365840433371267775469202990","8763681409640408511774703386738865004873345690332395131153581718682846235816","5086184804083998594076230176630486989159676487216439626195171443687145611476","3444180739794824231911901354495926100580172575807360182050883799956253686124","19959585945609801580752975266494803324672866918723431810286213367913961455037","3606118653399557978017653345353488674231963545742074503030228140079743128217","9802232062091145454674219420688213272404224274164975947158499021341809478056","14753794963203840670689834131757653710719077219319396758581277854471817219976","10293226843634758194510263296936027709342071523680880184525420653949365085783","12718806094899532360102670898087743973296203292888146926436211859399441382266","19720557165108559470587427734825443980468432595646509009288337442868761549209","11247390882107475711483619058539054176238525726311758865073230404212341552278","15462509904958076555211488611104595950707114200311503866776513865723341096539","19234760699502123418676309783515052697057041962626575225401675314728972650121","17158261287148866987348692179057818719922602171392849314284493894658836825746","15365955529424977292357623764025498682706496161142382817837522205572607763997","20052202240009352261741122369957280265238958638450496105242649976727648471603","423357909332235822254079656696928158152503031658093508494175901331804543226","15922263825513783744583412081948095026829380051325974037117331160273000625665","21608880876703158853582170966053859080506692816444303830697579496441737611292","14979302256083977877181830607642975718819599820161889327504074019516836927010","21610296362574306626509926774800244990065257145430368375419027492142934708446","17595716914975830356499498547074024086847211138200645735802384039048171815958","14654668119168864815561684444214692059474181246705559164525875353227464689053","7909137102568989978451284135464888703672144746229046026942372688255268205369","14812130315252358082784842576665409029101165747479648757059927502821594119043","19533381322254969505860938447353219937929507327716748825809064520539543455254","9403823843450196420799337565010549178259435908490320872849582783166065168282","10464241134417201329419510220104949346527274013274592882563416495012556125132","9301345819661937440725860028779312914339790525885214274554275091844623535968","11291714547013661830332569817711684505569815478772306103530109513027459828741","16566712313878755327910485384356179345881280692463454520410105624337016288883","9857254387540706281892224858708177932493833333242386469874406815551456850784","13235323444556237974521531300791907080635475702604350856205423158574376182435","6837328857570342508089383303046615979341710677796715226424263996563411126589","9567191971502453137803265066675229742925788197509550723183106561667775516503","13589520733675005345281874911032983354954922397198387703860557678089764021921","104175365654736775178218750541299505009591406942062749114421467907345346042","590163818614270202706155060786980081635141531931653658533034907216652933183","11630836030911095078662233290280414853525666587225870019070111475894870557937","3143463001554546949388574227992235144909572072667494575339346439434777710214","17210674657600746455132196643290051407032499980059412222084673652147666262244","19558381360647054135714232130709740454803497350056006816389092459633204536306","16883239974151654186618501613502254189172694896294262882551553603289459762207","8413661446386279271250258046703699372256294759176301597443419113141652463386","17926420509822647309653607861708033860852594098459584436645268742667896895558","19824925766389886827250259916041015429740610094218960702010388823681796598372","21569124030016608055974854740419962472020200788866623348222538997741654501795","14232424310854472834356314082148076539296957249563473004688613559676523926509","15193615028121862883292210509489791742567273312408676269715846648108564480216","4571863685585148023589373809103548979799867639025504561868195666694987162026","6206779924996162752046602034743078689551092997538497731303258570990576183904","13551354910729069809580067054835607774880530108885793285331679609370500875004","9899791381683262402504188099370233883995824403872277909479896171174493425427","19676726055572810021222964113026140207269355942060367353065169172081559784672","842852341267559061264418048500907996345833086685212080144270808293582991176","2374896551530407137601201042234188834144647343362619212010730934843698743587","7541169441788393045940373474338091879780271077778260807857446771010926024429","11136936778745143751630950186644088027953411966465838448171145474563978816093","10104692900610618203101067220992674388402050900350351026933004613495030125962","9448067584436414960964337190111983737612300524270450316697483521460203416821","8950186827869639604172647121100447815900277491673507364868135313567370094566","13506425119440201268368754328546416032565667481881592632895304755531522876713","8980168571796290804339343950808891004720242960395088290536220280570423270238","18170882696616761010489613056792567852402646771641587111297862995908970291284","17964914132412404677996740117340161470056406021410685722116447488755963163990","4999254529824068728272549382468024522346083624068028557197677399460354032302","19863286783514673257602438096028698340633489355546438580505275806712888618797","8597501472019579693110022148133358484974050449265021769883471363830981070438","15745697387452707443485700990949175358831586983137296283366195319537908003288","13137385666206357557612894624274538332141042254638811649741671391041335368023","17489444249761129472685381315022721658390849238308934118982939182052647535064","7817235089381823509145374360042255112726388997005284838446772709175711038688","14266303771668205536382691342596456410509199091923271798848518821724529136059","3636857805719964585971325322044663359458065705759731491721865284507973354939","15992868605947752108489235540799285759772965578817149705232162327368620329585","1335686142273152709365597717137409998821127623205060581051968539417021206504","6433290482925748613794540660743040431650259914794007152150057855153874666944","1361143257838811133926634806224247744517655450729374562521500236431831031476","18225681286815161411121137668234617452312048153276117017888242519394843989168","19843309075203033669895762315323851121116692526905833370940041980425774744571","15228011749951502720507138380119493145011628580619540200408217541371854380957","19619902256720178830677177598316556548461566595041053642017410940299852914682","511045245706260898110690359652263936223759289411819460157040898756960539462","7391377516085877772042712644814217270885890613808054711267621194257918442112","5891519591265284241203789998585637602270159400314233944803142442234700250863","2205432830627138420924593517638591617200352501757865976823844451062848337881","3222440233016699218240995056566298768106156979610420431469004199306974269103","8738332104312050387266272441686236247554960069301415997266286065690829290396","1551797112498648676836888480223639601740456286931633071547538018561520713544","1533866262507880248780245731190869299029017561560482981975068249985135371067","3996384786620540375232033672025195552610224229344345117985645908694200761016","16595891332727724151340175555326766529692459983213346368706615677339339240020","11523034561885962354991131363057963624098255825893327869682794018887379424097","21037920806606953471816674932313658324079485042735787472381615025003112432904","19591615019774495060998741485447874831723014393820542494077889189192102109031","9121850391530996471222427082549856324643713020999728941399437734853739817153","6849010089591794160862035089126940514820060634802302095512422500449021208898","21803985179639408855590213016678692901492191793853596659193109444086006378119","13364642672122219159126189111975702569548137252134210263160227802926124348078","16905269331135488328605515318505661227228474740876565481132283687997616028861","11264009642168330483857233256241513200490483139661004283535705073110138982890","5332394467645666696623235864746879605637402312414276534976098157513611666542","17925301199630013346486151991337546692422339664903952576083922784335751134079","11900184416418670354965232151665958518848952270854151924870211669630781631223","15562113593580216239006544427542674838265849698433044757495991364465187405884","3806304128817128192424875722779633391243742313942202394988632791379590507084","4657338409098638664678315846850627043185036888996779552648742031908099581588","15813005888849962389158961584970173978097218996267117171684509555319301477411","17056578011328104553093128374315470853531917998809681241413306393882725625198","6430589065893485715796702045939612847939363293990681504299985210155618562864","7514454699643127952791367885323645723388779246392186109883710722291187240497","7826937063653788873418085859562133984976335940156012117355343731656725674347","2225655582871701716469716244290307217751235918380896133272619906562931866876","11565133364312756310075478066314302953761772900026528225403220752431976340190","18232452026689223969965820968016739847092564814758593382764078404018135510023","1358358355244320152796507416231954843591920800744392329047477141132664693794","2597241426605278043922861599217180508175107341199392281858695037638300643180","17674515264858256312450756598079170929596539962153597882812281349637224943254","3143421480716849445957518543992988300614287126569006297241763368177602468592","15933437847230001720929677769855858682918236257655835442179345528393419564882","6733106851709743508924920069771721545927217564131624545573720030931843427107","3903499693696421946995265411390118861168305725858301760878023455038512768658","14433872132790123652832156520925166553485145595432897200832458531093296216884","7097617002748651760063122634260707663385999924497452509206216049717006887614","9196893673129829898318166605040425641260075795136163048833535143632480806738","19140091520550535179093575244921354004409797700450072348027875067724407780771","13815362122463786845354711610276132099779552968788780241453140843664912171289","132329010991610972419019365039613190472336282083377290824055198940312830513","2049181411991933045514610569712374231531845833062261528528564288748902967619","9942692693883003669846738387378238020204191501223875692726715738542841527104","6283754404754969631949771092743204859616073374053464616082489188503158661340","13531881648062996717630837244804254055395580039994975987100053481374744485749","0","0","0","0","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","16751074199471344286802035516092717228413021805857911221340709282829922649570","16607689897250896163839120369329143853138821982212506869796223602775242163908","6306670965815533610139978731151082260521747949859106157811737942199411096763","8230394042541507458651300722707802655073997691897399557296075563607891385931","9921340941556354371580059537039333469973209453102024699252654455316059290620","16798896597145667139496131042097011601219503268718208432881915127321311248865","10761622635138561113453616724326151200504548364659640959171019993528403053596","4201374595453568719536041091370119651099375260803977706482746783208488880305","9971587591474752610461421108018095077842562578014452361783151616467835435111","5516956972178305312309254917389099764623678730180225999630364134360264110082","15066785865404294422881557619360885995614121995592112712990143250762198336884","21755300202021669800310961644948292234097575522286241219994206014548021317507","44312224132391919278568080003847402581022440080536924033423180021727388015","17589524827975147485715615321649189469791625723245721893742228097834086947532","8719984869514470722047522645705044152404773497435222154684105742564180785917","12838432770668333832140112504623798777955855545564491234660602333126926294802","10962219331981126937794734082126576683795140107663121675442940913117472782171","11315763313939367564880085930200632291397536948843222126556649652575069224853","9490320164035243469515553845741859611832694165395589257142226352243136301303","14573213588623917823708851377700803537638194753660392663536665732379880810694","11957092005664205224141548929385856436673493267279705778466447868093190736829","2201153109770645202954444876374528386609966279164593010871872560011817397913","11082747672059648638492717211402437406817522242047530271849521934851141518229","20477546427784935443802032434219911124745095329100703429739367686725375043621","20413669078949764936443689287676556111623164824373754014432737811311226761753","12881136730064110218094313142501866107021596701447009682940537878392614463314","13227437990758291440620943688822553930025228016992494659907178847660023537124","16572644556309208037124906701824425475845839679912404017132481770297056142431","19207525364486005896906208137031026335360739161340583275343816203229308414622","13749935216854607186487641922071692492037890524402382020370477865659977471212","14305753616231100452668590820745059778506427001382290586975701645092921660548","765857276287722813531198419619164140070915902829725892404102530083930750063","17837831429010867898764848684310505000314798050293841430668793505708981358048","21265099592359165713925953648362407254559580913936166135963567928466675766562","9836732997058077094526466589020739322840803019139480203465858201631980200718","7950736069218471132276924429739021815862792210045959677128696849570697403704","4769271140055336949069111665742509949024134261124654997310716329224630277762","20393350587508813313089483176581445684689819238531002176517292760755869721350","38149718364286962749939608665460785683852940908425655353420799858383968080","294908462199902072876663185334271659283432370640074451060800538373960973112","15686183370543867546923411519048855269420334921977460677980634391907762285104","7739644896700310773878882243266703498955498777056626589614168707182557659069","8962053441358370892949398584321217001524120474906547766312555570245268276141","10485968530935240560535418413665896337924134365028112810521932629743032594567","10455176935063524730554996425761077284254888258693211809138770824018864886743","14115566565369486572031311310429302802089825334724609634263576446726737605806","20073124591363501366789760608831383241995767850640689122251701726731390338567","18044196147441334580548109144408355893452990965490068051314106336265811591526","11777763830067607118918986120012546064057341507222391327324648823238698980251","5076285475125881250450494722872064230965358749104743996583186222500686678935","9433671005987645330351463650157742363370796004102441907383343518108550265783","16007614664479860453771437441344953439396368135713518528960723657246075833228","3670983463941934079214226480204001841287142286161279531732782678406433460843","7046179718502550936980595924901442920616633571872416339261615305735715278602","17608692011920050118706235959991963886935386829021365964093748239332711649084","2996821855883838728759536316610792557284394221854997002429026293476701752866","1677231509722364930842177352080930133827209916580071048531613825027648977700","20514621385694392131023051208602786923531777062045824148198436025028161478292","18706232149332458956113227927382844148669824578035828945319576383268514596397","11536282866871845249336852725858083392404317076310198593892963050259371331649","20466198999255199834400800454553246058101307023747737024879595930133188864963","17213082575127239224295748117279913461834934345205651804512629361221712146029","19484671891372768411934382885285679105157644357942611948795072906049381809678","8503442112050525052228756834095001115345112944909240539866003384575979945546","1591002621123168604526593223171654111798901832992697089266968330710061317327","17926989791280931197506965049310631268713794343236183001990363712296100776267","9818426793010627181403113577980666147935770130277255691539405567600286312065","9942988821595010693836539395678956414086510769345202336272828286806505105690","11428337004946391003737882643329882420040707267209738526410651698195832612398","5246173256091330545722754324790141877812115594929637564770216594001202665291","9244678589481971155093167074568918052432648706230664195707777716588708425821","16484327628325306003364245414567032312084673791908596909706339237437400759774","15909549332391486405320400238323446874739232392980137232129556119929377881543","4605603680690078397409074258309278031489863163721440064230911400507819976731","11932390595676097724926919191547257683296828193773941999444763120344004292794","21261316293685003751543366541787086957146195861519918738279059420379259769912","21694342134861979785664822222441943407054500023420869221254046994410705539047","13455418065215420116004885303563860520053149691344937005371740002984186620259","21294895762334183277561199056622692153331598314844350195434334666176806203759","2298913285650149740197504916695862209035358355428627300724306426005525816892","6433628427964344837720421894751973624448162124243791938584892092692934497062","13980638727833468810299341230787216089256640947577023476618983231259366747402","16386989380774535566905941270495126370482370902137781001804268887369782038022","3779483885209758277783355831078003188483448889651898318713331166172699636659","13118689370009477102054967134335796733104690982621174244425832900274928932116","21445533669518956637854447045256826873132438263003600821648791482859243407079","5527331762329369159390944165620100309794622537826464839886395712108419580582","3982772412651522640643769699838411900841643087659996933180626455834078733729","8936887292441133154504378719580283709673438127834570894253255440130778560891","5689786437531621897454594927415077264858288108775631464102476970728285871609","6370104324738040905290397305607362815394997849284017671587890146354255852594","2562605975511809500373038481836128711166779361259424204015484454382469913903","8009939360434127939211330421690368857019489809160778015418598167076961485953","6207214611018146300599438189744645959242652217703597746064748175193260329591","16671090648797063256204148088217002774332376248497761795371610457828028740038","351920541540014679905588425887435163878844099034359672557071300875572975398","21058204412077323033815879298722170627087867902547775349664797410908803369974","14564771468858246038476497989063618180073537400380117152664301508245795360502","8272882885871254955349820427886161624704712655862030935537145720959792892274","6909321091395274276146501993203761280720491918442748432524267471458601993221","16580321413206363974123623814602922867712388513971038402753464758491015803565","843281673245380754722495246696808119685404475704137112513160388856240699325","10171659328829219575897640303524498462582095234092978615905848203599889269897","5280538311454636369301273025630273683522547291583648504386454238616356441491","16623616276068850220179897023862034811947741374757987914392112935677729609272","19853123512203259979603644963397956834690886149706076304732426191753395611491","955364103151966477697350532913523016231165744311492647080211628659701871391","20523715452656959031445477013594952421617762425683127800448733851153498579066","14293535687965811563014333045217822091100404926900397852150955930734852567984","4229676629734606989516536240720033922492197958317336524425272064033701231219","18901397382211336164186387913666617814943452495137150951121911861411601103404","14375484255313188168372529479566281408768539401520374973084172059374055840588","19545798768864804171001454865226638660566831783618291009839659068600532212741","12755887933202061913161194217993793715343250197162556258497417497956440593759","8686513030225489957270848893530798775170299685233413267611917464195410557211","5880638904324026409005302950304740533498165011473478865956931412853188357431","7354389273252412391825625422266284022910347922206550320847139744353922366698","7016237351930429912019063230239434124147424389329878468689095040305536565141","5620972089534918638996272688507749091836816762473512644976785924112182176059","20413835273287925719552648605928582957864781808563858039878873559057433938566","11990352873652827398677739409877583255209694499432033562422373811536346570826","11452116767092430632569157126777353261344552818614541313334131497235795274616","13608939909527726586864284167014632459539109382363764498491490357609068357661","19699932497952889669632765576298327295926506735107495829131115663202263356665","15251682785177950917305927011901953367908953567062062215661324049886315524643","20988180365782566790010352815052502389134630736373419926172473693216627536947","7836720310496068244885024104589560761724497802627198466406853572609572183783","8038431537840849850004264549778072928837344446259802659731886224882799164652","2029425248168573578041930579769085260473443689520829116695151637114698378179","14014583048054989975362949820515352457455051497561401705089149965549711007728","10229910039445142063805930610858936389530402461507274678278419431360560041672","18414356640728818641083254061594699427771424933767295240543780118943302353557","14385363499980792320572694168709347498076611078827580165565397937806655843600","17574003158941143569210345425977586387561202207597212418442851062273722778557","5020456663555107491462633901410150293006360280142421036527516054973198917775","20127051627292194507636525988626707066686058957062478135802400381125882156129","20897939964842847172746478761928317623445313616223360444114601438540638075545","4768232651051213290835674042772040002316324578972496328572277887954854608839","17294503583995767475859552377185515589678216285313681942711238998872988167848","14649373813471851945320940299605201018392088399780709659677169234196157620092","8780430624549024727143069679282190039037099678026940232022642526296513616209","19379993141583360349219631444991584062781246208701481966534256751049466960129","15269077688496085659395433896981555224821074535243453599961761864702497339408","5391117857262141392878145098178984215824926943428788260915775917501212609214","7908721172934600956268520018234658066175251014237965624123564978124712802362","7874341505294103336917508655326356231557632351889805234868207045464424182027","14717357719887344869049716594829853959760329970432750252010555421746110830753","3360261399639751762974090530765480555630239123582758200815794978493014885586","9821826804670125425236325658293385777765305748666267887783525427098280556536","17204157028222666500796136628457984571840002100152982240371475388423494849033","5542034861058754185477946991198906162285361355155642038893943908835601160038","3683282103686594289964931403051831385975351230136466856931777064461047733401","15224685775706801324889650391158158261567751841767486050473559405133656352415","14348433140170281101901970266749278653067511062361719376252531576778262236894","11561449914623393122383031050474623941756403082164093879442389899363860513713","18245049492685205869746697260817503761252527622829228814032380169292346673291","17504537922258513011905565287240975149408627350242698790215780212356407248353","1087354866746490755068915240098723302841828156617728293233180699369449595227","6969042902258472469564623163041902613727762494563269234625798939473325810728","19781365794109169059730125820268469324655465578674107499591208131269329184831","19197720132445970072674786026374184753486316604335554230360798533521780079016","8985344752484815619908870528789201141893762847988902632020302966238055069038","6180566225714340566468063951590163252160515912634301758875151812293005995707","7886321650473731550722613550286337225983696528924522412475864179994945154038","1770329309062897291917236776676146963443813646104822628855480965002025402285","2672465549015492990178140878418702146106524780378266324725481883753805796676","9510938473472052600166974310685487461419214920988365840433371267775469202990","8763681409640408511774703386738865004873345690332395131153581718682846235816","5086184804083998594076230176630486989159676487216439626195171443687145611476","3444180739794824231911901354495926100580172575807360182050883799956253686124","19959585945609801580752975266494803324672866918723431810286213367913961455037","3606118653399557978017653345353488674231963545742074503030228140079743128217","9802232062091145454674219420688213272404224274164975947158499021341809478056","14753794963203840670689834131757653710719077219319396758581277854471817219976","10293226843634758194510263296936027709342071523680880184525420653949365085783","12718806094899532360102670898087743973296203292888146926436211859399441382266","19720557165108559470587427734825443980468432595646509009288337442868761549209","11247390882107475711483619058539054176238525726311758865073230404212341552278","15462509904958076555211488611104595950707114200311503866776513865723341096539","19234760699502123418676309783515052697057041962626575225401675314728972650121","17158261287148866987348692179057818719922602171392849314284493894658836825746","15365955529424977292357623764025498682706496161142382817837522205572607763997","20052202240009352261741122369957280265238958638450496105242649976727648471603","423357909332235822254079656696928158152503031658093508494175901331804543226","15922263825513783744583412081948095026829380051325974037117331160273000625665","21608880876703158853582170966053859080506692816444303830697579496441737611292","14979302256083977877181830607642975718819599820161889327504074019516836927010","21610296362574306626509926774800244990065257145430368375419027492142934708446","17595716914975830356499498547074024086847211138200645735802384039048171815958","14654668119168864815561684444214692059474181246705559164525875353227464689053","7909137102568989978451284135464888703672144746229046026942372688255268205369","14812130315252358082784842576665409029101165747479648757059927502821594119043","19533381322254969505860938447353219937929507327716748825809064520539543455254","9403823843450196420799337565010549178259435908490320872849582783166065168282","10464241134417201329419510220104949346527274013274592882563416495012556125132","9301345819661937440725860028779312914339790525885214274554275091844623535968","11291714547013661830332569817711684505569815478772306103530109513027459828741","16566712313878755327910485384356179345881280692463454520410105624337016288883","9857254387540706281892224858708177932493833333242386469874406815551456850784","13235323444556237974521531300791907080635475702604350856205423158574376182435","6837328857570342508089383303046615979341710677796715226424263996563411126589","9567191971502453137803265066675229742925788197509550723183106561667775516503","13589520733675005345281874911032983354954922397198387703860557678089764021921","104175365654736775178218750541299505009591406942062749114421467907345346042","590163818614270202706155060786980081635141531931653658533034907216652933183","11630836030911095078662233290280414853525666587225870019070111475894870557937","3143463001554546949388574227992235144909572072667494575339346439434777710214","17210674657600746455132196643290051407032499980059412222084673652147666262244","19558381360647054135714232130709740454803497350056006816389092459633204536306","16883239974151654186618501613502254189172694896294262882551553603289459762207","8413661446386279271250258046703699372256294759176301597443419113141652463386","17926420509822647309653607861708033860852594098459584436645268742667896895558","19824925766389886827250259916041015429740610094218960702010388823681796598372","21569124030016608055974854740419962472020200788866623348222538997741654501795","14232424310854472834356314082148076539296957249563473004688613559676523926509","15193615028121862883292210509489791742567273312408676269715846648108564480216","4571863685585148023589373809103548979799867639025504561868195666694987162026","6206779924996162752046602034743078689551092997538497731303258570990576183904","13551354910729069809580067054835607774880530108885793285331679609370500875004","9899791381683262402504188099370233883995824403872277909479896171174493425427","19676726055572810021222964113026140207269355942060367353065169172081559784672","842852341267559061264418048500907996345833086685212080144270808293582991176","2374896551530407137601201042234188834144647343362619212010730934843698743587","7541169441788393045940373474338091879780271077778260807857446771010926024429","11136936778745143751630950186644088027953411966465838448171145474563978816093","10104692900610618203101067220992674388402050900350351026933004613495030125962","9448067584436414960964337190111983737612300524270450316697483521460203416821","8950186827869639604172647121100447815900277491673507364868135313567370094566","13506425119440201268368754328546416032565667481881592632895304755531522876713","8980168571796290804339343950808891004720242960395088290536220280570423270238","18170882696616761010489613056792567852402646771641587111297862995908970291284","17964914132412404677996740117340161470056406021410685722116447488755963163990","4999254529824068728272549382468024522346083624068028557197677399460354032302","19863286783514673257602438096028698340633489355546438580505275806712888618797","8597501472019579693110022148133358484974050449265021769883471363830981070438","15745697387452707443485700990949175358831586983137296283366195319537908003288","13137385666206357557612894624274538332141042254638811649741671391041335368023","17489444249761129472685381315022721658390849238308934118982939182052647535064","7817235089381823509145374360042255112726388997005284838446772709175711038688","14266303771668205536382691342596456410509199091923271798848518821724529136059","3636857805719964585971325322044663359458065705759731491721865284507973354939","15992868605947752108489235540799285759772965578817149705232162327368620329585","1335686142273152709365597717137409998821127623205060581051968539417021206504","6433290482925748613794540660743040431650259914794007152150057855153874666944","1361143257838811133926634806224247744517655450729374562521500236431831031476","18225681286815161411121137668234617452312048153276117017888242519394843989168","19843309075203033669895762315323851121116692526905833370940041980425774744571","15228011749951502720507138380119493145011628580619540200408217541371854380957","19619902256720178830677177598316556548461566595041053642017410940299852914682","511045245706260898110690359652263936223759289411819460157040898756960539462","7391377516085877772042712644814217270885890613808054711267621194257918442112","5891519591265284241203789998585637602270159400314233944803142442234700250863","2205432830627138420924593517638591617200352501757865976823844451062848337881","3222440233016699218240995056566298768106156979610420431469004199306974269103","8738332104312050387266272441686236247554960069301415997266286065690829290396","1551797112498648676836888480223639601740456286931633071547538018561520713544","1533866262507880248780245731190869299029017561560482981975068249985135371067","3996384786620540375232033672025195552610224229344345117985645908694200761016","16595891332727724151340175555326766529692459983213346368706615677339339240020","11523034561885962354991131363057963624098255825893327869682794018887379424097","21037920806606953471816674932313658324079485042735787472381615025003112432904","19591615019774495060998741485447874831723014393820542494077889189192102109031","9121850391530996471222427082549856324643713020999728941399437734853739817153","6849010089591794160862035089126940514820060634802302095512422500449021208898","21803985179639408855590213016678692901492191793853596659193109444086006378119","13364642672122219159126189111975702569548137252134210263160227802926124348078","16905269331135488328605515318505661227228474740876565481132283687997616028861","11264009642168330483857233256241513200490483139661004283535705073110138982890","5332394467645666696623235864746879605637402312414276534976098157513611666542","17925301199630013346486151991337546692422339664903952576083922784335751134079","11900184416418670354965232151665958518848952270854151924870211669630781631223","15562113593580216239006544427542674838265849698433044757495991364465187405884","3806304128817128192424875722779633391243742313942202394988632791379590507084","4657338409098638664678315846850627043185036888996779552648742031908099581588","15813005888849962389158961584970173978097218996267117171684509555319301477411","17056578011328104553093128374315470853531917998809681241413306393882725625198","6430589065893485715796702045939612847939363293990681504299985210155618562864","7514454699643127952791367885323645723388779246392186109883710722291187240497","7826937063653788873418085859562133984976335940156012117355343731656725674347","2225655582871701716469716244290307217751235918380896133272619906562931866876","11565133364312756310075478066314302953761772900026528225403220752431976340190","18232452026689223969965820968016739847092564814758593382764078404018135510023","1358358355244320152796507416231954843591920800744392329047477141132664693794","2597241426605278043922861599217180508175107341199392281858695037638300643180","17674515264858256312450756598079170929596539962153597882812281349637224943254","3143421480716849445957518543992988300614287126569006297241763368177602468592","15933437847230001720929677769855858682918236257655835442179345528393419564882","6733106851709743508924920069771721545927217564131624545573720030931843427107","3903499693696421946995265411390118861168305725858301760878023455038512768658","14433872132790123652832156520925166553485145595432897200832458531093296216884","7097617002748651760063122634260707663385999924497452509206216049717006887614","9196893673129829898318166605040425641260075795136163048833535143632480806738","19140091520550535179093575244921354004409797700450072348027875067724407780771","13815362122463786845354711610276132099779552968788780241453140843664912171289","132329010991610972419019365039613190472336282083377290824055198940312830513","2049181411991933045514610569712374231531845833062261528528564288748902967619","9942692693883003669846738387378238020204191501223875692726715738542841527104","6283754404754969631949771092743204859616073374053464616082489188503158661340","13531881648062996717630837244804254055395580039994975987100053481374744485749","0","0","0","0","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","16751074199471344286802035516092717228413021805857911221340709282829922649570","16607689897250896163839120369329143853138821982212506869796223602775242163908","6306670965815533610139978731151082260521747949859106157811737942199411096763","8230394042541507458651300722707802655073997691897399557296075563607891385931","9921340941556354371580059537039333469973209453102024699252654455316059290620","16798896597145667139496131042097011601219503268718208432881915127321311248865","10761622635138561113453616724326151200504548364659640959171019993528403053596","4201374595453568719536041091370119651099375260803977706482746783208488880305","9971587591474752610461421108018095077842562578014452361783151616467835435111","5516956972178305312309254917389099764623678730180225999630364134360264110082","15066785865404294422881557619360885995614121995592112712990143250762198336884","21755300202021669800310961644948292234097575522286241219994206014548021317507","44312224132391919278568080003847402581022440080536924033423180021727388015","17589524827975147485715615321649189469791625723245721893742228097834086947532","8719984869514470722047522645705044152404773497435222154684105742564180785917","12838432770668333832140112504623798777955855545564491234660602333126926294802","10962219331981126937794734082126576683795140107663121675442940913117472782171","11315763313939367564880085930200632291397536948843222126556649652575069224853","9490320164035243469515553845741859611832694165395589257142226352243136301303","14573213588623917823708851377700803537638194753660392663536665732379880810694","11957092005664205224141548929385856436673493267279705778466447868093190736829","2201153109770645202954444876374528386609966279164593010871872560011817397913","11082747672059648638492717211402437406817522242047530271849521934851141518229","20477546427784935443802032434219911124745095329100703429739367686725375043621","20413669078949764936443689287676556111623164824373754014432737811311226761753","12881136730064110218094313142501866107021596701447009682940537878392614463314","13227437990758291440620943688822553930025228016992494659907178847660023537124","16572644556309208037124906701824425475845839679912404017132481770297056142431","19207525364486005896906208137031026335360739161340583275343816203229308414622","13749935216854607186487641922071692492037890524402382020370477865659977471212","14305753616231100452668590820745059778506427001382290586975701645092921660548","765857276287722813531198419619164140070915902829725892404102530083930750063","17837831429010867898764848684310505000314798050293841430668793505708981358048","21265099592359165713925953648362407254559580913936166135963567928466675766562","9836732997058077094526466589020739322840803019139480203465858201631980200718","7950736069218471132276924429739021815862792210045959677128696849570697403704","4769271140055336949069111665742509949024134261124654997310716329224630277762","20393350587508813313089483176581445684689819238531002176517292760755869721350","38149718364286962749939608665460785683852940908425655353420799858383968080","294908462199902072876663185334271659283432370640074451060800538373960973112","15686183370543867546923411519048855269420334921977460677980634391907762285104","7739644896700310773878882243266703498955498777056626589614168707182557659069","8962053441358370892949398584321217001524120474906547766312555570245268276141","10485968530935240560535418413665896337924134365028112810521932629743032594567","10455176935063524730554996425761077284254888258693211809138770824018864886743","14115566565369486572031311310429302802089825334724609634263576446726737605806","20073124591363501366789760608831383241995767850640689122251701726731390338567","18044196147441334580548109144408355893452990965490068051314106336265811591526","11777763830067607118918986120012546064057341507222391327324648823238698980251","5076285475125881250450494722872064230965358749104743996583186222500686678935","9433671005987645330351463650157742363370796004102441907383343518108550265783","16007614664479860453771437441344953439396368135713518528960723657246075833228","3670983463941934079214226480204001841287142286161279531732782678406433460843","7046179718502550936980595924901442920616633571872416339261615305735715278602","17608692011920050118706235959991963886935386829021365964093748239332711649084","2996821855883838728759536316610792557284394221854997002429026293476701752866","1677231509722364930842177352080930133827209916580071048531613825027648977700","20514621385694392131023051208602786923531777062045824148198436025028161478292","18706232149332458956113227927382844148669824578035828945319576383268514596397","11536282866871845249336852725858083392404317076310198593892963050259371331649","20466198999255199834400800454553246058101307023747737024879595930133188864963","17213082575127239224295748117279913461834934345205651804512629361221712146029","19484671891372768411934382885285679105157644357942611948795072906049381809678","8503442112050525052228756834095001115345112944909240539866003384575979945546","1591002621123168604526593223171654111798901832992697089266968330710061317327","17926989791280931197506965049310631268713794343236183001990363712296100776267","9818426793010627181403113577980666147935770130277255691539405567600286312065","9942988821595010693836539395678956414086510769345202336272828286806505105690","11428337004946391003737882643329882420040707267209738526410651698195832612398","5246173256091330545722754324790141877812115594929637564770216594001202665291","9244678589481971155093167074568918052432648706230664195707777716588708425821","16484327628325306003364245414567032312084673791908596909706339237437400759774","15909549332391486405320400238323446874739232392980137232129556119929377881543","4605603680690078397409074258309278031489863163721440064230911400507819976731","11932390595676097724926919191547257683296828193773941999444763120344004292794","21261316293685003751543366541787086957146195861519918738279059420379259769912","21694342134861979785664822222441943407054500023420869221254046994410705539047","13455418065215420116004885303563860520053149691344937005371740002984186620259","21294895762334183277561199056622692153331598314844350195434334666176806203759","2298913285650149740197504916695862209035358355428627300724306426005525816892","6433628427964344837720421894751973624448162124243791938584892092692934497062","13980638727833468810299341230787216089256640947577023476618983231259366747402","16386989380774535566905941270495126370482370902137781001804268887369782038022","3779483885209758277783355831078003188483448889651898318713331166172699636659","13118689370009477102054967134335796733104690982621174244425832900274928932116","21445533669518956637854447045256826873132438263003600821648791482859243407079","5527331762329369159390944165620100309794622537826464839886395712108419580582","3982772412651522640643769699838411900841643087659996933180626455834078733729","8936887292441133154504378719580283709673438127834570894253255440130778560891","5689786437531621897454594927415077264858288108775631464102476970728285871609","6370104324738040905290397305607362815394997849284017671587890146354255852594","2562605975511809500373038481836128711166779361259424204015484454382469913903","8009939360434127939211330421690368857019489809160778015418598167076961485953","6207214611018146300599438189744645959242652217703597746064748175193260329591","16671090648797063256204148088217002774332376248497761795371610457828028740038","351920541540014679905588425887435163878844099034359672557071300875572975398","21058204412077323033815879298722170627087867902547775349664797410908803369974","14564771468858246038476497989063618180073537400380117152664301508245795360502","8272882885871254955349820427886161624704712655862030935537145720959792892274","6909321091395274276146501993203761280720491918442748432524267471458601993221","16580321413206363974123623814602922867712388513971038402753464758491015803565","843281673245380754722495246696808119685404475704137112513160388856240699325","10171659328829219575897640303524498462582095234092978615905848203599889269897","5280538311454636369301273025630273683522547291583648504386454238616356441491","16623616276068850220179897023862034811947741374757987914392112935677729609272","19853123512203259979603644963397956834690886149706076304732426191753395611491","955364103151966477697350532913523016231165744311492647080211628659701871391","20523715452656959031445477013594952421617762425683127800448733851153498579066","14293535687965811563014333045217822091100404926900397852150955930734852567984","4229676629734606989516536240720033922492197958317336524425272064033701231219","18901397382211336164186387913666617814943452495137150951121911861411601103404","14375484255313188168372529479566281408768539401520374973084172059374055840588","19545798768864804171001454865226638660566831783618291009839659068600532212741","12755887933202061913161194217993793715343250197162556258497417497956440593759","8686513030225489957270848893530798775170299685233413267611917464195410557211","5880638904324026409005302950304740533498165011473478865956931412853188357431","7354389273252412391825625422266284022910347922206550320847139744353922366698","7016237351930429912019063230239434124147424389329878468689095040305536565141","5620972089534918638996272688507749091836816762473512644976785924112182176059","20413835273287925719552648605928582957864781808563858039878873559057433938566","11990352873652827398677739409877583255209694499432033562422373811536346570826","11452116767092430632569157126777353261344552818614541313334131497235795274616","13608939909527726586864284167014632459539109382363764498491490357609068357661","19699932497952889669632765576298327295926506735107495829131115663202263356665","15251682785177950917305927011901953367908953567062062215661324049886315524643","20988180365782566790010352815052502389134630736373419926172473693216627536947","7836720310496068244885024104589560761724497802627198466406853572609572183783","8038431537840849850004264549778072928837344446259802659731886224882799164652","2029425248168573578041930579769085260473443689520829116695151637114698378179","14014583048054989975362949820515352457455051497561401705089149965549711007728","10229910039445142063805930610858936389530402461507274678278419431360560041672","18414356640728818641083254061594699427771424933767295240543780118943302353557","14385363499980792320572694168709347498076611078827580165565397937806655843600","17574003158941143569210345425977586387561202207597212418442851062273722778557","5020456663555107491462633901410150293006360280142421036527516054973198917775","20127051627292194507636525988626707066686058957062478135802400381125882156129","20897939964842847172746478761928317623445313616223360444114601438540638075545","4768232651051213290835674042772040002316324578972496328572277887954854608839","17294503583995767475859552377185515589678216285313681942711238998872988167848","14649373813471851945320940299605201018392088399780709659677169234196157620092","8780430624549024727143069679282190039037099678026940232022642526296513616209","19379993141583360349219631444991584062781246208701481966534256751049466960129","15269077688496085659395433896981555224821074535243453599961761864702497339408","5391117857262141392878145098178984215824926943428788260915775917501212609214","7908721172934600956268520018234658066175251014237965624123564978124712802362","7874341505294103336917508655326356231557632351889805234868207045464424182027","14717357719887344869049716594829853959760329970432750252010555421746110830753","3360261399639751762974090530765480555630239123582758200815794978493014885586","9821826804670125425236325658293385777765305748666267887783525427098280556536","17204157028222666500796136628457984571840002100152982240371475388423494849033","5542034861058754185477946991198906162285361355155642038893943908835601160038","3683282103686594289964931403051831385975351230136466856931777064461047733401","15224685775706801324889650391158158261567751841767486050473559405133656352415","14348433140170281101901970266749278653067511062361719376252531576778262236894","11561449914623393122383031050474623941756403082164093879442389899363860513713","18245049492685205869746697260817503761252527622829228814032380169292346673291","17504537922258513011905565287240975149408627350242698790215780212356407248353","1087354866746490755068915240098723302841828156617728293233180699369449595227","6969042902258472469564623163041902613727762494563269234625798939473325810728","19781365794109169059730125820268469324655465578674107499591208131269329184831","19197720132445970072674786026374184753486316604335554230360798533521780079016","8985344752484815619908870528789201141893762847988902632020302966238055069038","6180566225714340566468063951590163252160515912634301758875151812293005995707","7886321650473731550722613550286337225983696528924522412475864179994945154038","1770329309062897291917236776676146963443813646104822628855480965002025402285","2672465549015492990178140878418702146106524780378266324725481883753805796676","9510938473472052600166974310685487461419214920988365840433371267775469202990","8763681409640408511774703386738865004873345690332395131153581718682846235816","5086184804083998594076230176630486989159676487216439626195171443687145611476","3444180739794824231911901354495926100580172575807360182050883799956253686124","19959585945609801580752975266494803324672866918723431810286213367913961455037","3606118653399557978017653345353488674231963545742074503030228140079743128217","9802232062091145454674219420688213272404224274164975947158499021341809478056","14753794963203840670689834131757653710719077219319396758581277854471817219976","10293226843634758194510263296936027709342071523680880184525420653949365085783","12718806094899532360102670898087743973296203292888146926436211859399441382266","19720557165108559470587427734825443980468432595646509009288337442868761549209","11247390882107475711483619058539054176238525726311758865073230404212341552278","15462509904958076555211488611104595950707114200311503866776513865723341096539","19234760699502123418676309783515052697057041962626575225401675314728972650121","17158261287148866987348692179057818719922602171392849314284493894658836825746","15365955529424977292357623764025498682706496161142382817837522205572607763997","20052202240009352261741122369957280265238958638450496105242649976727648471603","423357909332235822254079656696928158152503031658093508494175901331804543226","15922263825513783744583412081948095026829380051325974037117331160273000625665","21608880876703158853582170966053859080506692816444303830697579496441737611292","14979302256083977877181830607642975718819599820161889327504074019516836927010","21610296362574306626509926774800244990065257145430368375419027492142934708446","17595716914975830356499498547074024086847211138200645735802384039048171815958","14654668119168864815561684444214692059474181246705559164525875353227464689053","7909137102568989978451284135464888703672144746229046026942372688255268205369","14812130315252358082784842576665409029101165747479648757059927502821594119043","19533381322254969505860938447353219937929507327716748825809064520539543455254","9403823843450196420799337565010549178259435908490320872849582783166065168282","10464241134417201329419510220104949346527274013274592882563416495012556125132","9301345819661937440725860028779312914339790525885214274554275091844623535968","11291714547013661830332569817711684505569815478772306103530109513027459828741","16566712313878755327910485384356179345881280692463454520410105624337016288883","9857254387540706281892224858708177932493833333242386469874406815551456850784","13235323444556237974521531300791907080635475702604350856205423158574376182435","6837328857570342508089383303046615979341710677796715226424263996563411126589","9567191971502453137803265066675229742925788197509550723183106561667775516503","13589520733675005345281874911032983354954922397198387703860557678089764021921","104175365654736775178218750541299505009591406942062749114421467907345346042","590163818614270202706155060786980081635141531931653658533034907216652933183","11630836030911095078662233290280414853525666587225870019070111475894870557937","3143463001554546949388574227992235144909572072667494575339346439434777710214","17210674657600746455132196643290051407032499980059412222084673652147666262244","19558381360647054135714232130709740454803497350056006816389092459633204536306","16883239974151654186618501613502254189172694896294262882551553603289459762207","8413661446386279271250258046703699372256294759176301597443419113141652463386","17926420509822647309653607861708033860852594098459584436645268742667896895558","19824925766389886827250259916041015429740610094218960702010388823681796598372","21569124030016608055974854740419962472020200788866623348222538997741654501795","14232424310854472834356314082148076539296957249563473004688613559676523926509","15193615028121862883292210509489791742567273312408676269715846648108564480216","4571863685585148023589373809103548979799867639025504561868195666694987162026","6206779924996162752046602034743078689551092997538497731303258570990576183904","13551354910729069809580067054835607774880530108885793285331679609370500875004","9899791381683262402504188099370233883995824403872277909479896171174493425427","19676726055572810021222964113026140207269355942060367353065169172081559784672","842852341267559061264418048500907996345833086685212080144270808293582991176","2374896551530407137601201042234188834144647343362619212010730934843698743587","7541169441788393045940373474338091879780271077778260807857446771010926024429","11136936778745143751630950186644088027953411966465838448171145474563978816093","10104692900610618203101067220992674388402050900350351026933004613495030125962","9448067584436414960964337190111983737612300524270450316697483521460203416821","8950186827869639604172647121100447815900277491673507364868135313567370094566","13506425119440201268368754328546416032565667481881592632895304755531522876713","8980168571796290804339343950808891004720242960395088290536220280570423270238","18170882696616761010489613056792567852402646771641587111297862995908970291284","17964914132412404677996740117340161470056406021410685722116447488755963163990","4999254529824068728272549382468024522346083624068028557197677399460354032302","19863286783514673257602438096028698340633489355546438580505275806712888618797","8597501472019579693110022148133358484974050449265021769883471363830981070438","15745697387452707443485700990949175358831586983137296283366195319537908003288","13137385666206357557612894624274538332141042254638811649741671391041335368023","17489444249761129472685381315022721658390849238308934118982939182052647535064","7817235089381823509145374360042255112726388997005284838446772709175711038688","14266303771668205536382691342596456410509199091923271798848518821724529136059","3636857805719964585971325322044663359458065705759731491721865284507973354939","15992868605947752108489235540799285759772965578817149705232162327368620329585","1335686142273152709365597717137409998821127623205060581051968539417021206504","6433290482925748613794540660743040431650259914794007152150057855153874666944","1361143257838811133926634806224247744517655450729374562521500236431831031476","18225681286815161411121137668234617452312048153276117017888242519394843989168","19843309075203033669895762315323851121116692526905833370940041980425774744571","15228011749951502720507138380119493145011628580619540200408217541371854380957","19619902256720178830677177598316556548461566595041053642017410940299852914682","511045245706260898110690359652263936223759289411819460157040898756960539462","7391377516085877772042712644814217270885890613808054711267621194257918442112","5891519591265284241203789998585637602270159400314233944803142442234700250863","2205432830627138420924593517638591617200352501757865976823844451062848337881","3222440233016699218240995056566298768106156979610420431469004199306974269103","8738332104312050387266272441686236247554960069301415997266286065690829290396","1551797112498648676836888480223639601740456286931633071547538018561520713544","1533866262507880248780245731190869299029017561560482981975068249985135371067","3996384786620540375232033672025195552610224229344345117985645908694200761016","16595891332727724151340175555326766529692459983213346368706615677339339240020","11523034561885962354991131363057963624098255825893327869682794018887379424097","21037920806606953471816674932313658324079485042735787472381615025003112432904","19591615019774495060998741485447874831723014393820542494077889189192102109031","9121850391530996471222427082549856324643713020999728941399437734853739817153","6849010089591794160862035089126940514820060634802302095512422500449021208898","21803985179639408855590213016678692901492191793853596659193109444086006378119","13364642672122219159126189111975702569548137252134210263160227802926124348078","16905269331135488328605515318505661227228474740876565481132283687997616028861","11264009642168330483857233256241513200490483139661004283535705073110138982890","5332394467645666696623235864746879605637402312414276534976098157513611666542","17925301199630013346486151991337546692422339664903952576083922784335751134079","11900184416418670354965232151665958518848952270854151924870211669630781631223","15562113593580216239006544427542674838265849698433044757495991364465187405884","3806304128817128192424875722779633391243742313942202394988632791379590507084","4657338409098638664678315846850627043185036888996779552648742031908099581588","15813005888849962389158961584970173978097218996267117171684509555319301477411","17056578011328104553093128374315470853531917998809681241413306393882725625198","6430589065893485715796702045939612847939363293990681504299985210155618562864","7514454699643127952791367885323645723388779246392186109883710722291187240497","7826937063653788873418085859562133984976335940156012117355343731656725674347","2225655582871701716469716244290307217751235918380896133272619906562931866876","11565133364312756310075478066314302953761772900026528225403220752431976340190","18232452026689223969965820968016739847092564814758593382764078404018135510023","1358358355244320152796507416231954843591920800744392329047477141132664693794","2597241426605278043922861599217180508175107341199392281858695037638300643180","17674515264858256312450756598079170929596539962153597882812281349637224943254","3143421480716849445957518543992988300614287126569006297241763368177602468592","15933437847230001720929677769855858682918236257655835442179345528393419564882","6733106851709743508924920069771721545927217564131624545573720030931843427107","3903499693696421946995265411390118861168305725858301760878023455038512768658","14433872132790123652832156520925166553485145595432897200832458531093296216884","7097617002748651760063122634260707663385999924497452509206216049717006887614","9196893673129829898318166605040425641260075795136163048833535143632480806738","19140091520550535179093575244921354004409797700450072348027875067724407780771","13815362122463786845354711610276132099779552968788780241453140843664912171289","132329010991610972419019365039613190472336282083377290824055198940312830513","2049181411991933045514610569712374231531845833062261528528564288748902967619","9942692693883003669846738387378238020204191501223875692726715738542841527104","6283754404754969631949771092743204859616073374053464616082489188503158661340","13531881648062996717630837244804254055395580039994975987100053481374744485749","0","0","0","0","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","16751074199471344286802035516092717228413021805857911221340709282829922649570","16607689897250896163839120369329143853138821982212506869796223602775242163908","6306670965815533610139978731151082260521747949859106157811737942199411096763","8230394042541507458651300722707802655073997691897399557296075563607891385931","9921340941556354371580059537039333469973209453102024699252654455316059290620","16798896597145667139496131042097011601219503268718208432881915127321311248865","10761622635138561113453616724326151200504548364659640959171019993528403053596","4201374595453568719536041091370119651099375260803977706482746783208488880305","9971587591474752610461421108018095077842562578014452361783151616467835435111","5516956972178305312309254917389099764623678730180225999630364134360264110082","15066785865404294422881557619360885995614121995592112712990143250762198336884","21755300202021669800310961644948292234097575522286241219994206014548021317507","44312224132391919278568080003847402581022440080536924033423180021727388015","17589524827975147485715615321649189469791625723245721893742228097834086947532","8719984869514470722047522645705044152404773497435222154684105742564180785917","12838432770668333832140112504623798777955855545564491234660602333126926294802","10962219331981126937794734082126576683795140107663121675442940913117472782171","11315763313939367564880085930200632291397536948843222126556649652575069224853","9490320164035243469515553845741859611832694165395589257142226352243136301303","14573213588623917823708851377700803537638194753660392663536665732379880810694","11957092005664205224141548929385856436673493267279705778466447868093190736829","2201153109770645202954444876374528386609966279164593010871872560011817397913","11082747672059648638492717211402437406817522242047530271849521934851141518229","20477546427784935443802032434219911124745095329100703429739367686725375043621","20413669078949764936443689287676556111623164824373754014432737811311226761753","12881136730064110218094313142501866107021596701447009682940537878392614463314","13227437990758291440620943688822553930025228016992494659907178847660023537124","16572644556309208037124906701824425475845839679912404017132481770297056142431","19207525364486005896906208137031026335360739161340583275343816203229308414622","13749935216854607186487641922071692492037890524402382020370477865659977471212","14305753616231100452668590820745059778506427001382290586975701645092921660548","765857276287722813531198419619164140070915902829725892404102530083930750063","17837831429010867898764848684310505000314798050293841430668793505708981358048","21265099592359165713925953648362407254559580913936166135963567928466675766562","9836732997058077094526466589020739322840803019139480203465858201631980200718","7950736069218471132276924429739021815862792210045959677128696849570697403704","4769271140055336949069111665742509949024134261124654997310716329224630277762","20393350587508813313089483176581445684689819238531002176517292760755869721350","38149718364286962749939608665460785683852940908425655353420799858383968080","294908462199902072876663185334271659283432370640074451060800538373960973112","15686183370543867546923411519048855269420334921977460677980634391907762285104","7739644896700310773878882243266703498955498777056626589614168707182557659069","8962053441358370892949398584321217001524120474906547766312555570245268276141","10485968530935240560535418413665896337924134365028112810521932629743032594567","10455176935063524730554996425761077284254888258693211809138770824018864886743","14115566565369486572031311310429302802089825334724609634263576446726737605806","20073124591363501366789760608831383241995767850640689122251701726731390338567","18044196147441334580548109144408355893452990965490068051314106336265811591526","11777763830067607118918986120012546064057341507222391327324648823238698980251","5076285475125881250450494722872064230965358749104743996583186222500686678935","9433671005987645330351463650157742363370796004102441907383343518108550265783","16007614664479860453771437441344953439396368135713518528960723657246075833228","3670983463941934079214226480204001841287142286161279531732782678406433460843","7046179718502550936980595924901442920616633571872416339261615305735715278602","17608692011920050118706235959991963886935386829021365964093748239332711649084","2996821855883838728759536316610792557284394221854997002429026293476701752866","1677231509722364930842177352080930133827209916580071048531613825027648977700","20514621385694392131023051208602786923531777062045824148198436025028161478292","18706232149332458956113227927382844148669824578035828945319576383268514596397","11536282866871845249336852725858083392404317076310198593892963050259371331649","20466198999255199834400800454553246058101307023747737024879595930133188864963","17213082575127239224295748117279913461834934345205651804512629361221712146029","19484671891372768411934382885285679105157644357942611948795072906049381809678","8503442112050525052228756834095001115345112944909240539866003384575979945546","1591002621123168604526593223171654111798901832992697089266968330710061317327","17926989791280931197506965049310631268713794343236183001990363712296100776267","9818426793010627181403113577980666147935770130277255691539405567600286312065","9942988821595010693836539395678956414086510769345202336272828286806505105690","11428337004946391003737882643329882420040707267209738526410651698195832612398","5246173256091330545722754324790141877812115594929637564770216594001202665291","9244678589481971155093167074568918052432648706230664195707777716588708425821","16484327628325306003364245414567032312084673791908596909706339237437400759774","15909549332391486405320400238323446874739232392980137232129556119929377881543","4605603680690078397409074258309278031489863163721440064230911400507819976731","11932390595676097724926919191547257683296828193773941999444763120344004292794","21261316293685003751543366541787086957146195861519918738279059420379259769912","21694342134861979785664822222441943407054500023420869221254046994410705539047","13455418065215420116004885303563860520053149691344937005371740002984186620259","21294895762334183277561199056622692153331598314844350195434334666176806203759","2298913285650149740197504916695862209035358355428627300724306426005525816892","6433628427964344837720421894751973624448162124243791938584892092692934497062","13980638727833468810299341230787216089256640947577023476618983231259366747402","16386989380774535566905941270495126370482370902137781001804268887369782038022","3779483885209758277783355831078003188483448889651898318713331166172699636659","13118689370009477102054967134335796733104690982621174244425832900274928932116","21445533669518956637854447045256826873132438263003600821648791482859243407079","5527331762329369159390944165620100309794622537826464839886395712108419580582","3982772412651522640643769699838411900841643087659996933180626455834078733729","8936887292441133154504378719580283709673438127834570894253255440130778560891","5689786437531621897454594927415077264858288108775631464102476970728285871609","6370104324738040905290397305607362815394997849284017671587890146354255852594","2562605975511809500373038481836128711166779361259424204015484454382469913903","8009939360434127939211330421690368857019489809160778015418598167076961485953","6207214611018146300599438189744645959242652217703597746064748175193260329591","16671090648797063256204148088217002774332376248497761795371610457828028740038","351920541540014679905588425887435163878844099034359672557071300875572975398","21058204412077323033815879298722170627087867902547775349664797410908803369974","14564771468858246038476497989063618180073537400380117152664301508245795360502","8272882885871254955349820427886161624704712655862030935537145720959792892274","6909321091395274276146501993203761280720491918442748432524267471458601993221","16580321413206363974123623814602922867712388513971038402753464758491015803565","843281673245380754722495246696808119685404475704137112513160388856240699325","10171659328829219575897640303524498462582095234092978615905848203599889269897","5280538311454636369301273025630273683522547291583648504386454238616356441491","16623616276068850220179897023862034811947741374757987914392112935677729609272","19853123512203259979603644963397956834690886149706076304732426191753395611491","955364103151966477697350532913523016231165744311492647080211628659701871391","20523715452656959031445477013594952421617762425683127800448733851153498579066","14293535687965811563014333045217822091100404926900397852150955930734852567984","4229676629734606989516536240720033922492197958317336524425272064033701231219","18901397382211336164186387913666617814943452495137150951121911861411601103404","14375484255313188168372529479566281408768539401520374973084172059374055840588","19545798768864804171001454865226638660566831783618291009839659068600532212741","12755887933202061913161194217993793715343250197162556258497417497956440593759","8686513030225489957270848893530798775170299685233413267611917464195410557211","5880638904324026409005302950304740533498165011473478865956931412853188357431","7354389273252412391825625422266284022910347922206550320847139744353922366698","7016237351930429912019063230239434124147424389329878468689095040305536565141","5620972089534918638996272688507749091836816762473512644976785924112182176059","20413835273287925719552648605928582957864781808563858039878873559057433938566","11990352873652827398677739409877583255209694499432033562422373811536346570826","11452116767092430632569157126777353261344552818614541313334131497235795274616","13608939909527726586864284167014632459539109382363764498491490357609068357661","19699932497952889669632765576298327295926506735107495829131115663202263356665","15251682785177950917305927011901953367908953567062062215661324049886315524643","20988180365782566790010352815052502389134630736373419926172473693216627536947","7836720310496068244885024104589560761724497802627198466406853572609572183783","8038431537840849850004264549778072928837344446259802659731886224882799164652","2029425248168573578041930579769085260473443689520829116695151637114698378179","14014583048054989975362949820515352457455051497561401705089149965549711007728","10229910039445142063805930610858936389530402461507274678278419431360560041672","18414356640728818641083254061594699427771424933767295240543780118943302353557","14385363499980792320572694168709347498076611078827580165565397937806655843600","17574003158941143569210345425977586387561202207597212418442851062273722778557","5020456663555107491462633901410150293006360280142421036527516054973198917775","20127051627292194507636525988626707066686058957062478135802400381125882156129","20897939964842847172746478761928317623445313616223360444114601438540638075545","4768232651051213290835674042772040002316324578972496328572277887954854608839","17294503583995767475859552377185515589678216285313681942711238998872988167848","14649373813471851945320940299605201018392088399780709659677169234196157620092","8780430624549024727143069679282190039037099678026940232022642526296513616209","19379993141583360349219631444991584062781246208701481966534256751049466960129","15269077688496085659395433896981555224821074535243453599961761864702497339408","5391117857262141392878145098178984215824926943428788260915775917501212609214","7908721172934600956268520018234658066175251014237965624123564978124712802362","7874341505294103336917508655326356231557632351889805234868207045464424182027","14717357719887344869049716594829853959760329970432750252010555421746110830753","3360261399639751762974090530765480555630239123582758200815794978493014885586","9821826804670125425236325658293385777765305748666267887783525427098280556536","17204157028222666500796136628457984571840002100152982240371475388423494849033","5542034861058754185477946991198906162285361355155642038893943908835601160038","3683282103686594289964931403051831385975351230136466856931777064461047733401","15224685775706801324889650391158158261567751841767486050473559405133656352415","14348433140170281101901970266749278653067511062361719376252531576778262236894","11561449914623393122383031050474623941756403082164093879442389899363860513713","18245049492685205869746697260817503761252527622829228814032380169292346673291","17504537922258513011905565287240975149408627350242698790215780212356407248353","1087354866746490755068915240098723302841828156617728293233180699369449595227","6969042902258472469564623163041902613727762494563269234625798939473325810728","19781365794109169059730125820268469324655465578674107499591208131269329184831","19197720132445970072674786026374184753486316604335554230360798533521780079016","8985344752484815619908870528789201141893762847988902632020302966238055069038","6180566225714340566468063951590163252160515912634301758875151812293005995707","7886321650473731550722613550286337225983696528924522412475864179994945154038","1770329309062897291917236776676146963443813646104822628855480965002025402285","2672465549015492990178140878418702146106524780378266324725481883753805796676","9510938473472052600166974310685487461419214920988365840433371267775469202990","8763681409640408511774703386738865004873345690332395131153581718682846235816","5086184804083998594076230176630486989159676487216439626195171443687145611476","3444180739794824231911901354495926100580172575807360182050883799956253686124","19959585945609801580752975266494803324672866918723431810286213367913961455037","3606118653399557978017653345353488674231963545742074503030228140079743128217","9802232062091145454674219420688213272404224274164975947158499021341809478056","14753794963203840670689834131757653710719077219319396758581277854471817219976","10293226843634758194510263296936027709342071523680880184525420653949365085783","12718806094899532360102670898087743973296203292888146926436211859399441382266","19720557165108559470587427734825443980468432595646509009288337442868761549209","11247390882107475711483619058539054176238525726311758865073230404212341552278","15462509904958076555211488611104595950707114200311503866776513865723341096539","19234760699502123418676309783515052697057041962626575225401675314728972650121","17158261287148866987348692179057818719922602171392849314284493894658836825746","15365955529424977292357623764025498682706496161142382817837522205572607763997","20052202240009352261741122369957280265238958638450496105242649976727648471603","423357909332235822254079656696928158152503031658093508494175901331804543226","15922263825513783744583412081948095026829380051325974037117331160273000625665","21608880876703158853582170966053859080506692816444303830697579496441737611292","14979302256083977877181830607642975718819599820161889327504074019516836927010","21610296362574306626509926774800244990065257145430368375419027492142934708446","17595716914975830356499498547074024086847211138200645735802384039048171815958","14654668119168864815561684444214692059474181246705559164525875353227464689053","7909137102568989978451284135464888703672144746229046026942372688255268205369","14812130315252358082784842576665409029101165747479648757059927502821594119043","19533381322254969505860938447353219937929507327716748825809064520539543455254","9403823843450196420799337565010549178259435908490320872849582783166065168282","10464241134417201329419510220104949346527274013274592882563416495012556125132","9301345819661937440725860028779312914339790525885214274554275091844623535968","11291714547013661830332569817711684505569815478772306103530109513027459828741","16566712313878755327910485384356179345881280692463454520410105624337016288883","9857254387540706281892224858708177932493833333242386469874406815551456850784","13235323444556237974521531300791907080635475702604350856205423158574376182435","6837328857570342508089383303046615979341710677796715226424263996563411126589","9567191971502453137803265066675229742925788197509550723183106561667775516503","13589520733675005345281874911032983354954922397198387703860557678089764021921","104175365654736775178218750541299505009591406942062749114421467907345346042","590163818614270202706155060786980081635141531931653658533034907216652933183","11630836030911095078662233290280414853525666587225870019070111475894870557937","3143463001554546949388574227992235144909572072667494575339346439434777710214","17210674657600746455132196643290051407032499980059412222084673652147666262244","19558381360647054135714232130709740454803497350056006816389092459633204536306","16883239974151654186618501613502254189172694896294262882551553603289459762207","8413661446386279271250258046703699372256294759176301597443419113141652463386","17926420509822647309653607861708033860852594098459584436645268742667896895558","19824925766389886827250259916041015429740610094218960702010388823681796598372","21569124030016608055974854740419962472020200788866623348222538997741654501795","14232424310854472834356314082148076539296957249563473004688613559676523926509","15193615028121862883292210509489791742567273312408676269715846648108564480216","4571863685585148023589373809103548979799867639025504561868195666694987162026","6206779924996162752046602034743078689551092997538497731303258570990576183904","13551354910729069809580067054835607774880530108885793285331679609370500875004","9899791381683262402504188099370233883995824403872277909479896171174493425427","19676726055572810021222964113026140207269355942060367353065169172081559784672","842852341267559061264418048500907996345833086685212080144270808293582991176","2374896551530407137601201042234188834144647343362619212010730934843698743587","7541169441788393045940373474338091879780271077778260807857446771010926024429","11136936778745143751630950186644088027953411966465838448171145474563978816093","10104692900610618203101067220992674388402050900350351026933004613495030125962","9448067584436414960964337190111983737612300524270450316697483521460203416821","8950186827869639604172647121100447815900277491673507364868135313567370094566","13506425119440201268368754328546416032565667481881592632895304755531522876713","8980168571796290804339343950808891004720242960395088290536220280570423270238","18170882696616761010489613056792567852402646771641587111297862995908970291284","17964914132412404677996740117340161470056406021410685722116447488755963163990","4999254529824068728272549382468024522346083624068028557197677399460354032302","19863286783514673257602438096028698340633489355546438580505275806712888618797","8597501472019579693110022148133358484974050449265021769883471363830981070438","15745697387452707443485700990949175358831586983137296283366195319537908003288","13137385666206357557612894624274538332141042254638811649741671391041335368023","17489444249761129472685381315022721658390849238308934118982939182052647535064","7817235089381823509145374360042255112726388997005284838446772709175711038688","14266303771668205536382691342596456410509199091923271798848518821724529136059","3636857805719964585971325322044663359458065705759731491721865284507973354939","15992868605947752108489235540799285759772965578817149705232162327368620329585","1335686142273152709365597717137409998821127623205060581051968539417021206504","6433290482925748613794540660743040431650259914794007152150057855153874666944","1361143257838811133926634806224247744517655450729374562521500236431831031476","18225681286815161411121137668234617452312048153276117017888242519394843989168","19843309075203033669895762315323851121116692526905833370940041980425774744571","15228011749951502720507138380119493145011628580619540200408217541371854380957","19619902256720178830677177598316556548461566595041053642017410940299852914682","511045245706260898110690359652263936223759289411819460157040898756960539462","7391377516085877772042712644814217270885890613808054711267621194257918442112","5891519591265284241203789998585637602270159400314233944803142442234700250863","2205432830627138420924593517638591617200352501757865976823844451062848337881","3222440233016699218240995056566298768106156979610420431469004199306974269103","8738332104312050387266272441686236247554960069301415997266286065690829290396","1551797112498648676836888480223639601740456286931633071547538018561520713544","1533866262507880248780245731190869299029017561560482981975068249985135371067","3996384786620540375232033672025195552610224229344345117985645908694200761016","16595891332727724151340175555326766529692459983213346368706615677339339240020","11523034561885962354991131363057963624098255825893327869682794018887379424097","21037920806606953471816674932313658324079485042735787472381615025003112432904","19591615019774495060998741485447874831723014393820542494077889189192102109031","9121850391530996471222427082549856324643713020999728941399437734853739817153","6849010089591794160862035089126940514820060634802302095512422500449021208898","21803985179639408855590213016678692901492191793853596659193109444086006378119","13364642672122219159126189111975702569548137252134210263160227802926124348078","16905269331135488328605515318505661227228474740876565481132283687997616028861","11264009642168330483857233256241513200490483139661004283535705073110138982890","5332394467645666696623235864746879605637402312414276534976098157513611666542","17925301199630013346486151991337546692422339664903952576083922784335751134079","11900184416418670354965232151665958518848952270854151924870211669630781631223","15562113593580216239006544427542674838265849698433044757495991364465187405884","3806304128817128192424875722779633391243742313942202394988632791379590507084","4657338409098638664678315846850627043185036888996779552648742031908099581588","15813005888849962389158961584970173978097218996267117171684509555319301477411","17056578011328104553093128374315470853531917998809681241413306393882725625198","6430589065893485715796702045939612847939363293990681504299985210155618562864","7514454699643127952791367885323645723388779246392186109883710722291187240497","7826937063653788873418085859562133984976335940156012117355343731656725674347","2225655582871701716469716244290307217751235918380896133272619906562931866876","11565133364312756310075478066314302953761772900026528225403220752431976340190","18232452026689223969965820968016739847092564814758593382764078404018135510023","1358358355244320152796507416231954843591920800744392329047477141132664693794","2597241426605278043922861599217180508175107341199392281858695037638300643180","17674515264858256312450756598079170929596539962153597882812281349637224943254","3143421480716849445957518543992988300614287126569006297241763368177602468592","15933437847230001720929677769855858682918236257655835442179345528393419564882","6733106851709743508924920069771721545927217564131624545573720030931843427107","3903499693696421946995265411390118861168305725858301760878023455038512768658","14433872132790123652832156520925166553485145595432897200832458531093296216884","7097617002748651760063122634260707663385999924497452509206216049717006887614","9196893673129829898318166605040425641260075795136163048833535143632480806738","19140091520550535179093575244921354004409797700450072348027875067724407780771","13815362122463786845354711610276132099779552968788780241453140843664912171289","132329010991610972419019365039613190472336282083377290824055198940312830513","2049181411991933045514610569712374231531845833062261528528564288748902967619","9942692693883003669846738387378238020204191501223875692726715738542841527104","6283754404754969631949771092743204859616073374053464616082489188503158661340","13531881648062996717630837244804254055395580039994975987100053481374744485749","0","4956774473297228218177808603426275447194737735524046542778880267774734984259","0","15268343501033916092396853374199187988748455820543796633535012025134089057292","1991575504460612223546114865299474646257943304515291241464893473242019507707","11901539978222853815864157529306856010584887559181293189216107644984836321368","3178881295553794239860506403451650450933820405550876097900040137017296879575","15695350304883360156960130477307936151740188875004492120906277678406001655837","16826344477007765768790409751973842888553894334227296177888903209917977713224","2009106007901283113943166088308034082354600538473906484253318833438816066532","7525444220155677323431624491196796062450779751944523627149064690527786953396","3114202767840538183458136643348998964583459476932153867036980031962630216500","894130084419891374804457629118613897039453180155016420207155096590379571637","3754100530583241061913782921521985964143185758859395900224047980883074578474","19835926942870700619272568183957007665273155871741504510470837619056870563145","15206669438158011768828946000639324293652682629446360504608348942311693201702","12893759514429389857051773396811183585585943540312231051172874714074736967045","17177418268758901697679074017597413135587647017560341550385469590292455054707","21523783649819343177656607320968296726328369806556791638567771067374155543541","17926934714980175136370185007825473093397070734787025872166057825582804883159","17172103335496635982048060007321904816970383778344287924940070445235226808229","16740394211442824929068526940423342980277871712926919740734979435694246519421","20534429616991168412824631579248633481807433008205619665399010410261851703386","7285147938824760852043379553512169493471042454820445180591294363798516953504","5858338065191558857399447934989268372377549482718256795045792280571261317676","649267084902835194895506892484476195243896686009115916268240569370720482615","4412344503212706030725332695729164257890358855855368398754391678565647710647","18112825116641850778386675294067588505837698373918324518240221651160261707525","13446941287005642598648660867624305243994406520538658464353528872741667832519","10354651613021068091280105061269139828620127206746987828693496831820991384709","14685888153730538184178501336632865156982041104412660885306971119982794203193","18951130805137323463990557961132198354618273024570578263850543915109063907214","3236986524159986738626089458635744735171106752069061563605878206760339205245","20672111644240859945752452163227865194772574062338164361402602552229632299540","20346804094507020819968047978749504635230774669530457820055786318097002987396","12177427221400458552053297752263784166814439854588025146907748683705025503990","3996793204079399282264727485456567099392754752348921747690725880902155774883","20774057399196846352489845718608549179132176576937861817866452468337600283246","7763086135164283077240542284296619630597283484252132715921373766901741661059","13192156320266213371869989251714697546302417317610411067707098188447467558294","8238415473398561129581686171879002196315831255195357045716133067849028513624","21672383245924124065509225118144789314521306926347712971658502967127711839752","13012020188926047726028750104503252116088164905278522576140239138615712886391","11531225864393872879130267963834390213135457028555196058082689632923978578504","1374429987836832024925663332381688377727183283535439399463358044766820403865","20582661762103763063532366166875823465438425236626828988386155738229497274626","18309481389731998965735505337988742256122273457572191366612888044363307609826","562305773913117542486838766414298801898118957477656487549878592277702410545","5661344675371593629781096409597824041496339269437253834648224351932645257430","14586397503536186239346683770870509842644710312929463730564598527436463692978","9546838857413394418775154878994184683591081872458942639968019116746938277253","4658406407242717241101230128271970590483603870282147488363227597433510166092","8487033676296938325562569752849951186192328003797155928293171743205223787866","13830817689267378589183429023447038311434578580343821956292500223201184276065","8527232341960925240093423454606733461221926098288184217958222517236112887462","5309819665626127251260141199519708783872167931671516622942292467800758829013","18426044073326994616926011295293612877583096735521798219254794958275996970106","10311340847007151918639209348810222528468931770232397011773810857523831534643","21372218333084513198315237631805274915148808971437236022117813339381580539314","13071258463998171088740581568457877506571845304931952853918093420392229938479","13358470148052657908379478071077874877917857080797200693638169669858410074226","4996341866536120725897007084818790395712955051004768440706180549650386359725","9245999810732205515624879891835600494908101021573195580660409568354810662111","11875891622772625040459349622604772388167406101803302091951618456850654054901","10897379450288831548596075724258446019416400381306305751899844430137451290550","21031001881432657348536049054063831665526335293110717759135830866530137577301","892399872654444337561159684752339886536591197111498717235789614721215542958","9217454942694727659283142214740373866589259280189873069616243732586004262154","3183065556397129353688953840170828971545273254343662058034962119947215914741","790061001436300500670813968286056627158323695471625604573302967314706199206","6094110202748122994882364999297794704715226174318282589357947864278534140625","3116109249531338193952352688636256706322994077028946894694080341820665229166","7070308283511555379742293522766572177284404099585736537387238626444882335176","2616215035185232844779246882667097461878620810633059006336740809881188894551","13384926003198521303447082282579113555342674460322355598715304513015516295737","15124330113880256483235539299008684969380220864662269326130288528126670818728","13103182393484386441666041524089610044109614498311759975800209774751276664476","242640624948841244551681446446860616764949736713081765695950024876924797977","6401306327267387009363875023066511762098660245437220667305511236867842354876","912158516121724360946757261638588018516344732559839393384786394370589733941","492412967391049860117888030190510117286718774561242394912681443987590808914","21468775233462144014262544317068079186166280220835341920500890437842111803911","19505618008385857991776026195606647720777707229795976329000911152729134159670","15743570610032859304902863612577958316325762049224304380049363630414876191242","7464088480431560082762430258657988736901821029940093241182933924376323036106","16259189674503681196721699370524320327422234012317071914605488973796757411689","7767696758667070766089792291118563946930123979261446866992810608914989607727","16114922267968270348578257876521155587032608455668719085462194419339532226364","2758595278431831065434780675120536664419646065702372026711392389016970114229","18686113850430112050095545567583071375793292857470663465148099499102632473309","5322569183894248800263673514874583622282627840854211368312233993262710520566","6625484671021539113351281560380355405142866337294724413032442559218736998318","15678494932063414546031234987774910766395962379039929181057832621853237355283","21044429289564547307962369331019397005789227838030127942012294995684153106988","4050352520468353076671331828580448554986143414713138398546692489036092654188","1439739037680633445304540112000249657437660715380616363849191674297153360316","17000713814571928948928596512828650057195156991943278596791869478365054048986","10039411416942330506550958143931776567211338199841725026568671831847397031229","2783913374091579171300707409294096964829607925471146417306345672104506551798","18831208237852006664103429025952176630263850450528702816723867202301425494525","2085098779219188048466154953345173682268609718189308109525769165293538377817","1061975973027025128869048938305675915509353618491584582060466050513776448218","5859169958359144313812718938573224350994660990425737360335282151756081918623","8124040687616085794332441579369944565007529336423897435297416312046654743679","1471576261258434979846610087689106111737341868166882796330645612597893060982","20096077713782165175251263772573589078961546636869869760191781291136382731114","20002169029520086001794801051926487839505647155459890398103027657173585637095","6331801728452881569711070386255679428894820373603843171016327691491354479146","7619172148835984663765033707816915118788282984654773026178320231473141279577","17258195073849769364355411475972610512919246043060024074459486058328960089122","11523331853872699658142567202962572695934907333691215222335354015651243006237","17304318129246594195502915693617224894796708659046294191109529542898384047621","12503557685051078210601858730253734848403320555769718730737467365470303706064","8597523832811491332463787989333229686410340771107146461143004365919601409981","5573808641408756617065407422920939745822915686997698756180760488431295699203","680380396063170511955934886812097722815595252098460413737851820955267163039","8712348930015407902946276402274155609654872807416667202633920963572381787777","2143256560710791052453192315538403358087069751601480750145888703451307078624","10165267555852012947690671919523590802266279591552015699909637702311266821703","6154139066586346925110455935852193710886002351660262412997170823801187658969","10797801710706169074454684753604468383030573500517082039557730174069104681837","4352510540029328744577395963422964421656494944462296812032895687721648324617","18172637147707713149277391923718739934662234396190219725555565713883085342211","13331017651337371130140111897278519298272892920042425475956549826504239775183","5096293804838394925323095609670882263918947950133415481999736312753048651626","1477954368883064545525969267932777221906039879216118233143055476101555942952","5785051025266336115174393023611611291501359164041057516562991521572201522529","10146392897807294214486414731983174724200164032512315843147088120632713387393","12362106855368077632727839538276021126255703528159840694741191987603096152682","17865840168451836787642382976979793351786456493096384077628607223640625170634","12435858343469608889189748345168550210079622384420606577144400939437690566825","250972644799670217197861620506628279104005830251498326767265313173795621470","9001223785553392683209714358621265904012695057439235774484245667613914147988","1309221989238361550533944870502285933978512176233510837702047057519043359830","8644564044205173998182078931525410917946259804224186779106747373661509836260","19624982699558820196304151432348135296945504455213926782466969453696916606489","3864421529378437699128150908697926752152026918884315700381255164087603052997","1958049682761825774417906390522999373569227917701053686252197903312948569099","12167907748329865933004053684947284030379129365128770630202470842383513251518","17408826560116516544245986948165454258732558480509024359245310150157173665554","10082438806890290593559219904867365777235436098789816845106951903520725824539","12644716140772223206205339271483990906417098607699861537319215142990085547684","5333683035288297377410555895451761420819444996948496611111835390724263244176","243060332072864390490065968940225661040364391321871587504646050584127356530","18199211436562319030481848803832082813931826084919672990110311018412407826133","15501439089553341613474441657379069434231053776909598938289026904339562776467","10211759496589822503756491422924084966612658179228530211304104147449470010167","8694526790301911899040532832909976399683855732911150828629959975665265460125","18917335890206389975142210276934292596171198392699769674208795938185779781243","20349612678925352296837761838113733555269758029206907222893840222151841845982","4711918817191370908665731294850351331492661470937334148161739728997680499491","20420930313718769240606549294796437192848049496057229249988788228004151556381","11963817253705060790735556403835107686727977102366780906012707565089958624004","18927479086766092512907063409757193407784199561377991896550147041011891954656","16086854621840714076567354556766950475380540240419236853674503374706092557562","7649813545556381889095163318053200570445747027104439942580281064681906169583","2479512249995713838311018128654752074496338305807193011347598619185330195994","2346035601324402310357559081594085679054933988920802478604068524877850016165","8355616284741545473771405721383569754997583120578798966450587860710065575348","21496298975540704215929335861534216493525290244000560032445947945485603782164","1241972191532383031210014194516191174225347001373478704376575016483446596120","8786766472153338511973666316624655064770315418111526718096759111544866972566","2790848416565784757358860123214157920808489886913855471540872549297598706625","19697267483247535705017911865295158268045154638896519829241721519500662898656","10855004975583971433505530744156157052202445376695517890491732993014943403015","3307138409419240516368553127105710179295163813339994587088795146799493191574","15071899476760622988231592898781823279231695645746570232012832365184480292781","12370370913808337832126191280163852687850585836348095262272559643754283614650","9619287458519354097076811003504062128667896608167587291870227695128479905066","7053412983942702021439666397899995720436247314245813233877959997480420996145","14336873830115607030503680640674315378851285562266113956057915302163135796126","2982459332256562153471757965199184417038573913753526444148202646059084621536","2263162485414508992438338093271132761212297813006399827398837117691893080842","6607501043765608432142359484878159163788335534386998552269157186532023292059","9458289810648986698878100050303113414880615672401029157409461366671149828256","6210563751175114358637825958428169384958432585211717149563100353809344728975","9061565527944668050570879800390996353727148706488825012048373263533460957967","7370076629450557464197799264966589599216688486111459344868817539021515588048","12785726761265753269615209982427149298165970108315769484747016554219769998789","11878087694479344057934757851109464763092847745546070478570965896990597443471","11391222998092956901470975615226364492444297516850417524619601043821719212820","221276078996291633123073491556519609534039402982765224448250964472239978217","13303819467267738582376680281528564621833366590114886958633810718235872764044","7417875460505775651394249955174491132892131966808927604723492305496341131906","2020766581450468169241576511815537903370498466044157393534317098899938241805","6294440028137816630156279162637587103755926825490729410565855128445577896052","7981790388288600144357296999402703191161930359504850289187051807778035834530","16867766050225492947997094140333889823957416992532088853574381451539577161674","20152174815336365624241530386485984852319760261776884720705806561707527615292","21605521433591925079955992983849344099581990685060614889282622278761663558980","2286860303373858708797843580152985202820815774576229020540429630068034253734","12332099424006283357272740548484988244762950910107100866085619924943832621196","14820470905339562427758929791309637474231036203230591431565123464037930230827","10656708434844362408435173201750409233112528101400499094278793363172643916458","17108304793667233809920791598656819203639526792596093761664114988130000654870","2776056854662399838577213991813944274892706180049163620697661732173438416968","4257014838677710877481260184253810428063151436900779678848411578948962418826","5050093159585158546412480617748567927812112016880240414839496170710800001765","1427314635823608480147691722001001809705237105866876885811739881560527550923","7856682833272092786224014992436092374983356055870992760391783758878943532373","11997222846668736241090844689677057174871966000282606213147356115508966327370","2633981394224615042415219599558342037076807664636376350873766413821482270489","8418793684559704515255726392210533359915714964980507264181505051470981854803","16182308147475193437792795501772907054657745460863762682060208281693449360074","6460195724997286035027662010099928664119482351968002853221029055511933699080","10942086860713563275494679565971980559253998525047642648414365582557692075947","6837348851407752128284671531402228152772091401531713757274862125320476692802","16247560353804957106084695625294264350984871862889068776851385460127061959303","19625106958920244252782365603123082965540698720846506881162808092082326452558","11904664465066223427439604734952709764641423684940638876055854929209195778504","596992363130907188298230019834975400095753761512019653738717406340170735468","19601667986638293950359301412565084476621041322890715864358600255138502148343","13323755512597739093381166653631714595776834594994383390604591519630081064352","635319023339081048884418572684131192060532929785090880064809541655956724032","1838246925016638669804090639537410806543547831682081025109597220945477003826","6957063396639585052889567910484475411107713958144190774770212006162810039977","1180029464211881174149154559623105765914162418614149520125026244406888253351","16908116785044938444516113890804284988741158512700331424311822955592610625878","19047511317391245770733548336384866723144334473969651228824781084792267718560","6431496677886142552593348803061400706409512947793604260543541320489042213509","2085706975856716043817845111247524725983792569688747134217820580802417064710","1115537774869458691540934321725770611599792846721451469791406285551276606981","7026002537300307494495439331909216065358414799222101508037688646360045099605","18130884396263326276412315018777651213919547256523617822369185259909506866144","19281260338929175730881091676996897758028583328171003716632612503005482005254","16588225225537212236652021689222338040087708398565983072730653112859609932774","15270628479944506228210873275859339540300883571757318746942561045392375516010","913642229877487927864278200010918660558298629674034607643105748738388473257","14715976480950508525942065790425683734502528748922782028224774135696744207120","13078972628916343360773748202951764256195594012695885123087240901149840845932","4942048729608056917234686680936688826917023985280996368768831507215897617015","20893794971858139489252786096429666114975805097505466451190756476932883681467","13015490760668283346847636569354065222028021012378102388437827197672584118628","6260425253543653451449270276729574291067898837831368647751150557846019741433","15923365245425515168971537301528268257372221381082153980832450078844982160690","19325485557827805129863972809470140787045220948725614656551318506266102656878","21750756342339175473834098262062989497112492015454506438667352249017294569788","2102370673968324396719114752599950196139819547315750115353646213108076712356","4998291192978343852503292600087996893642591869715997050428935676743028815672","20842299370423286594710151986946625643897640697536438338374431135541195389492","10586403989665118865526340068104904763060048914917352323191379856401112532428","4809740335351310670956646142294649972831844540363789981063786141716836290310","12401683609831156582692851843738737436320149114711815881100816554225649611253","18448848273413172901119604732207100673717679052219002564981215143860327255665","5100009475424842901004582243389236542121424367337824765690486859591754059198","15052761447822212067405216050222106162537208256668447958540169530835015064541","15203570575451941684368234745064806310935082934573870961284452290397220277537","7011500067739058094241874858440011385105123562135523418134390872645081990690","20284522327658079171256453806931620239519596408800532751630519007885849799220","4069076051897379869763734131426385973740649059610210720075367504504354993641","2783297780985287417956155801606284365270928459499385941105517247106556165919","8510591090202387138403508676716866888962470895491352804230634117706021767997","7318000136210907289537979152553438858209124950522363109906535966647009336613","17765962084307655705811295678050935179487033757998195461344713576557288765471","19587588259436856270972544685172464983467341250358633588437314101987421993981","8813299950458731729066861770423799029523263913149310364818833900860368430978","16360512882464941076332263022563180235912995063948326734474971524177813333883","21539303429249458709443918096907027023812718544674710689502070233840334338896","3194787531573319946547939620321400432538153179758058041124508989040478306247","14550263724823354762624597434286348766501934822081588334675589059707524367386","4762066029927074006557468787262677302992598560453366573279123706032017518691","3307198626653084251915858477145802723511448739653842352049492307694578789077","21503427039267419088379226163606788236114859581541934997176536618703917919565","10747872195270077093076835049659431420170298124805316539928654438399690398794","7936077029433473419850249825765589828336166328264755721818500963734671060887","18421921356520457680643410805090142837213318532677969454382843940931076456903","8795869917899145287881225926486595752236159801457409313558618232695916912781","9220418966566317012035310485032019876764484744108454038147295211893382299651","4509411175341067651418804820717502126860890538724657113392084644857054897363","18600753969592299405035242530094199444478733726104127064192859468654666596729","10100144219830699296329806757512230382270878773809615501300237958705600594411","5584392147549827507534402312439494662652570055562759610737588684342542469744","4643700462073855659415658467891388131544363621759101362202137795994593226232","14999101476838560982597529318938525107363749558426119549060180690235367377595","1749742801215464726221376113115682763119502185437942028338979018225498031836","7217214053167112972122978934836362586921988010139986135500636040464777414903","13350368314772033718223351745761596239457806203441615527738869758236136519176","3531319907680487378713359429005445544004800972187670329763680562020524605928","2617241275009032586872782369192273283211149352924265580059473448101153028492","4335568572256830794624423834281152236067439264607586340531824212026730762040","18402983565720028436985863271597586819039471794306238995563477442057619094986","17481055946625270651162595381683989493458485906220788998074635823857201759391","20678213693662454909833760153553394075445394087181580987098681423153403119252","18813252458150970201162210930039430826169533911357153642640511727456083439526","13706013703237737499951184888599169311042583332312265064831702723459992984953","5276183322797611522374357301800566272054591898551892814414663276768405505798","6220369583493884013308733411206013619096400324475864479420497513969767566943","15796441515161181042811402483908215405839700686754755812680156979577068524745","8882339836897259842652057816802624845120128920511588085166477797350766651261","18385472322902636963844486225283138325194723668732897514460264725264184886743","18245594373732537616685598877270446278729035771538482271893328862927488886822","20810927059727826691492873488353122628179338238756261487174165276561540036394","9551349055030755055111046239969931396169322570802776394837985148929110217739","17521378079931741344069826025335265620208705284376706335625199050982290155587","17449853027806717688544884433525568256647502295578720399431706934548569753809","2208173407728418249854764791574894437297135811566948439159452004438877701599","678547620830636733900467735524291466887027954585408840501510686408417041630","5017604836614881241934838437543877435687156766471893147336619935860473256797","14998643720095644268532468852767021461213698918483660074418661488108002406921","17898344110262013652390330763110560890588353123155866577387002771530665190950","17376840467006235410235393404883328056372680889805606012282782863161663875746","10113864497785684060699584364198988871370303248775082784964500855056871173062","4559202895222748568060070782182709720006136525455105143965623791506809641866","8301950795989204887708401124660719198691752284555092728571375432077438105358","16794820794362934111672146062818665846907728863622060961890966230230720824280","6308595937485122529750380234310130079369375922142927920979742309646925168983","21666215487788835037688487565043090826379731857474694573133992166768525738108","221899915559224453830708327687190978924005667567218685650885062460885415911","184093017078896451627610391377674885842010996390281170535815121123139256897","0","4956774473297228218177808603426275447194737735524046542778880267774734984259","15020599934560072742819311995443257102373150247123939115027410387178852174383","6571146414671507112385062596539640337548401531673253884883678537612139862045","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","20800852953915165279701731251313197208542053838630506717918018608743409008043","19637517025125411543094643600819326569442466502248345471095866020437323926584","17131925391885937058362808388683250733730451854841120606077116736590658055909","10275201208039256479362996766961520593397956508874680471558097955621271614549","13775445871438135597717743085601394071451098906991406527363380790460962275837","20921188461706731410257669426892072660245547106658738039672863926137956597475","7068731337741353707772677659066855028504354978163163329989946130870562802087","14492923398457611690977760765198862938916755475930529638634261396819273071710","1534567458502314451671203625376382303456773077488730271470408163975031742876","18354836306811531513969143414154384246381450892506596908347832328390268170984","5062103190874202870678977875389098512201377555551583855608475697412308156159","21863050921141162319270411552010629727018308949094968609633027550641826740489","8223687585016409650456483489058168130305896112816368995280842148036443214914","5678514600953279989581064341432760462203259070047341038758199426150714663226","5790869563885168188219394472156094596785515806323141275720187991017849379964","16408292121106481085678052064657643261083082816376367763237483327433742205108","5283007358713875716574089352637339086265741377648410420449128919948271631928","20403866156007156330177598638809149799419703185179436346409573334091110295603","3931080215402173587194987711962240938029106786078828396601706689190028306826","11180820962485005309521819111207469176176491261171652707854568914945492355370","10431100899884794357249935821834399632193310375149945138068070488162885023525","2318352549145843068967677249013967707638699794211504690819315465169075862817","147782775991416996267980707329320450334178133186634033976320891741838608853","20164175010470616883026489154582185036331706146166025182575654330739447828431","20082413891989871672665284390571617696179114795111656839508304816940972883683","13563518383615306027599983960890827912630108059077581601112276993388302166338","18331750094720289887435265582601304059173966031373353782582955679400560767183","4986461447279038243498218401523537415216600748231945581135138418026778501202","1855301108548005847265564329020111699229386336206252433922958934964260727057","202165489188669326132807606902264274563014094053205903210246124580018547334","6655371828434620793069381070451984021522613649274148767467549487940352307713","1906493706576518357804814208533412219611940642616538724388644694412047261090","5283260120021228177885521440576123782878298429517478639356327205388406146887","3457524287437302754573585166868310559470894649698441701267954345814080318909","3013319926576463129284969814498998473755714767021926618683011911770220213263","2524448462856571466507722624705430233525255657304546293742362121535437470526","7458236756997406439473578392832386717370092023346333633389128856626647251853","17276946075717024767643896419337266825098707645430284876786550033262729764663","13770360082562876550452201444608061558586008178791514017495021377429391785630","6983230762195661161111062872684498890812703398052734120062281261508572381953","11550243536486020289498173247504636462113720832953668170648807590922396468052","10743284146418616497071052531491180428329928116861554305536835001233436484222","15648489244760721907395312868398253487104638489734618268800331234852274963187","1619474093349218658754070905379214408091428551772311120346778617417747234585","7483581799045886039971638195495258310406134512831089307069369854928065216353","3305560697686400321552802584904887496583941234340660899902299420411363193841","9605016956768136946858878511011228134594480991562917428994301171940420046947","14000087697131227944183125235792191524239811939220478963875620998902378923918","21409604652967323500505645473533175991268239532258119471638457690561695823859","7416167539973463884793370714341035280490604862869902264078976311917046049818","16656748690714553961373658037649828111623804193985860876193218779037303989376","18126875283673785905463021136941960044660446456284810591440936631725862067625","15992305506590638390627912394276180953511836808058374683334394266621505097165","1500603340629377031926355750358428270340945389151979209631798539490509462313","16858740614736996272728499582568108676053182799270388444628065999791546766252","2526533860530002429832263381734908469724338499969900157304805275884976084281","14068052553272949447642598467828447796947053512343127245586466510925612650222","2595169997633131822598271573774226989886327923322777743673207893352528039782","717544360827521319573145518556015111732662241111152008214247219704688645762","21683761927605653765257555903066305704452920250993890452330089898442232581295","15017690644136973635801820985102104866896165274407812055980894786598708097716","17958178981066275624374751040166872167460968320743741549197591608274805451204","10743671881677453413206994559556913857056355225671373795144755107985058949164","14968270360636450526332875777038741015883062136885077184633194090816189537278","11036365339059614131502625911715497322523990266071121757857149248382113116229","9792617854789273803690563845446990611819772706082001052837093974113861262658","5176825492333344738861128244946472882355252850938020207007824855766170967514","1681502771573743691466896168204392110865013317893081160456825505988446428914","11274136766533675504059500458218425573372573604247375548216505874471074119093","8231953476579117928899082651669466683806231172627853588615340245444080176733","14008292228271998595079333007940094146980785460162019168891125058577411037875","9561799681581992544369447977094037689179404221082812996782923843449893438432","10837432733134321046192392439909030181002352224519385453276809203947699585642","8473576508825401914663024312011581385209483675314635453081965822651218104910","10938015929139916391501256574729469835227526158763735700288765110295864715423","10970047472783352649113368542168031197537813388748236307361519865500719892116","8217256957904405570680855987650476046040835131138759785733282910548352005760","16947759384730242837315535293307408195798333587889316777014475973462519183751","20828786081081740245197772816677699716375287470931394145103299208671137980728","4548785010718188507585256584958027182833931512721489188832467141668531530464","3444095815990163735567411376285643966393543832533624107086993851870748011591","21412351554205603558560947794046637696853821878604961240670688901535834358109","4809607585612698998163071932522742412806950821610110407272085717238387786453","18201448307727407208293135996438216164678070146671411720664697341763217892686","15148275309925046193313364074834009070693282804956177087628016957056101798361","17212189019581296994734101187479368823355718027532223901119443771333565029710","9452074805075577843977732328111072109079544577871443171118191041130221226030","1518510376928189137697592011923210522474691071478499397600878144982637239305","9105659608912038991507885305984201728084794386405880358754194125806112939402","1547007121594912409196168514201325629156228979576173723159462999233481775753","17877536886473562411651791990260330862906343337434329156199075892389033569058","20018232428841292912322236332793682964287044335047362917356229310181344094702","12795610582894453295146242025564461425830785142206046716936285872174835697173","138917001805879009238785772772727038581509098759884749801002569724589256727","20839567880827611313913067480023950531418803861937779861017293153899021874890","4693833060650845777453602416157846281709991079913390700059389719552028920586","11063830608885832898290485909602509991149870026108589659700004310017310545991","13655160511766157554909318560181656751857846987211597492841603460768442778654","13583197062396015634602398145463190601202016745073086341531287376882167999789","19593109830037210032603257626916277083757834120566284187542213115829832110896","5808045504509063029281653310463681837896726380509355951701362955953755766497","9916645817774681651828386440191225764980441377134843611957734204710402209732","21021841410452588680943768866213722730562087732566060711818235067476546332102","1328901797911920278980605322760282297690676582026575379730424555956255270287","7990014279717545852460429224653677884486427448261112721413945751528119932439","21788573547090681348494034462487537740304516272017157060728696185917160311359","7318196305184339832084514639343264649253013581475809496827174379407526573834","5121934731831852713447588944621960338030446891936535541278459223049637654108","5047296893187988423204769174098015717307734361170653795349981818324730232402","7662799757891377700716456249909632175552898602390794716114936989496604209922","8481681875283861656493858520671022184277761824008049192936786815820982029034","17384085968354796183812430182256574891337635704464041695236776677975372073608","351847291761995625299503641588532696445489644372754650102000998657130392366","18346017095827432860309117460907204230873430401265883851770003214463517895587","12530364241296294143391558013912087063511568001483137568507794924277291295622","1453319431089160978593449191277677211585847906857708739864741167563099185090","4409292638060270164528998793651815889564980014246171109319977754479235612837","4912656500609713351113974512236066601785692266861512173652568134706793536086","4858644212798333261520694726068612266732835566549406176373907341501445147003","4729796287332722014047402832191335133987382356937536253986159382952274661241","20153694902604730742266800396854044977964219406201479408628501331575554915534","2246237554154196683052229449181274361152525994319819470031299128551461172766","21446872171783539325536889070414254154753620636693569685957508948111137576705","15523806856355966439308424449616428231588735329848537617743377119161425965063","19430099545167544182363778459846178588081655328937717471365671773009202455037","17812124303569349289007889686491697667808352804902069991220159140591928786027","2615431786994166921035062630728052388038797493073765637192655817923690822296","7466575407465698872310716104947932612922177006057764525473968855471299501760","1568559646838940587422952301547054630705654939604152438798943434454905772094","16450114091237873959912800396524840399303070602965789288489241444724054340415","12544327242261247081356134780881024354609886005858079734319643263768462109298","3951189432525127718286118344860273719665578998875454166098133266801666448097","4684498636757721257672604806701649066723187747945139598693704097455330752246","7913851146292070962122661750868030665527311243664676556744302467215637604288","13693825057163630254198719260802906670395995075429822925637197637525162510800","11257936678851657411357528111784849899914875900555320409552427342018776626109","3009830878454912770286031430239990083124511083643323830025743329452432760442","11255781350895373823952671865487602212684008238766606456010353145402647299621","20703947193811759748459136395319722397893499584729354540114463717315911237904","18927236606919050665495280857793179280866899971153078091020873787561910660447","21208171312305087598895861622234435762763862899992768296682082769136982408496","13003644900902803665290247029256054448679537100575636702611458522200072408069","5473910709076170351709690614875062899058178996149854104909204655073693590718","5396740791499115651456300775929326781813959665924671440180584662261507716345","14608261260060536686613574465412211595158438369022778316883526776841385120692","11716895316353911597438772743005153995110366877152357690211038319567629681858","825291100640455876773086336494198796686944339403876997635060839259347591439","15131836487938806014426502448675727338490936870373243227752287178209774629560","9530505315934479917317575510664040836322601782081521335426112560211750963067","10076960225848838827900741485794259270198967014739774444563053174731526349476","2510923561491809223675031845489427723237847936839068014582092991310782772647","17623373863057439484514395529244363795826608326214680242497255650471737944065","19254757455558891743347449304921480210555042974764325624888942553008985088887","1308981555541762315607879574001026783189188588713693551262113824338075460083","13244418375848503929271695219020093742356576856076590172634439535108133587100","19362817571890280238405906636118193171711512699068613190741449281651186213947","15461791478280659128410317239068204606301666045485267872815292784028372519987","20415790267817442656846049153170278049323991404856454786146369061736328514282","1675425092345973426079571139973717567461162339074323918493233539973949363080","2406291853646761879939570680825607281847886147213112505748895576585158843519","8085260532616940305492373405634735216476729481754444910186903275762098872191","3912512698099563816951480690586011955756727244798542766155341341505298975111","18458146202387438386723241440394119476346283206297777332230845309804372870506","11755102566855177947535088692958671812218272433141265138394385455245793172827","15297152988073525627618405202877312206681048866156655726186038535484032545396","7164039784256021764265111842056249353019938833034024017809741044875411350177","18117693211234728313301036865827519361707977031781383859909979617555539954427","10996246499181496366801125638994134058257475270624048027175258190700427424596","7431215567561721862879796332372889653781909073175518128078996375618293800161","14392096580471347460488957898075766549739963384432083345902389045032634508216","2122192146049736861519183376657707765561457499563424195396206246579935142840","10256560709345835944687100803882590753541780961115827069187202150944107340680","16183821823551662134196784677025995628908561391637893029788657854565546003526","17799479956199141430859217440701567787136301050313443727642780551013711895518","10416914256883998062411054317760417749683325445242290590222465311236790105281","14779397864783948269364847534245295869022829926071185969628221948493790926559","16782448985807234530930392048021836422173964674956312427241645802407544090688","14321923343224701037179898406802193072768993135135381655613423115308455146996","9149186459397994047070202015755246695067694729307047224488799592236535709152","19558057485729958361934940507714021620010473760995101229249828379810281627447","12404742950531705198927681174223119696538571306856062080781751210627819272598","17369072670723312888300913605322550459382061433704673083367980516718754093119","3766761814170390381003117208546234980075440311822048827565329664575660583957","4901400009430839052255905472495426663828218482442922700340345538010440933459","5548554043405818226314898894791172369041668979252518654986931307153642154462","21515481709502223117910790816596884353079921395071223608063203457760487366134","11731067651977271844303178486259341480614085998886696632291221427316590347345","1142580132310126188845654788084195906434250024886999332926644706494983396166","7615518475005949869642573506518743949281645656979639288104391220389961787860","20643851082304414077408219942650798176193494074608766795930958482150395283941","10911465643821173067928818358919399134097282536299175752448941383520216424853","12702640540792217740436753454718920375645350058543792614948182942417115846689","449784471430716148064476341044391193387418416135616928346350591613580983713","14407044595137479434395815778260976339038265267528854273042920997958884354905","6570195508956610873426197573518874606539344909974108420277822810113641869705","9003078670028489521444785369205536341582390637339594013125206321960702984435","1573275973007329382340393629895581190144332913246810103365111711394208091694","6791168078026816421294840058822356736143214960888426142796501093416715235923","15630306348544298379217318071951550231273184428938228853896188343210470897190","4576746304196287032525847074784255599724176195692026840531484682498116377142","15864618526591215932771971137938812908783716121260351432339290319154244240191","20154317798462654520688066320551744478835081213507062396948957391183961213190","4217850033314954834518693113185374123393986948538558166596305129963326583641","739244962995441822997609491212567933809540402340960936758829105990093694875","4028226704901728469924582315757008913995336976972370070688352460945670209223","10591199388281276196076139827903028901929071722281939618112978231512165502500","20769873214273986079771211255494552368291410905831879794270214744986908114921","15912663029859676247040839483550221414191378704553985749507220595441668989890","9693027975721393095990900240985306805407152688503911448687312931574900853101","11484138150152751045203843899004183974207040034194151197586233755150141468667","16060024950720278930111806345439512258601445083798973542265137886014997752828","4065216147560638044834769735156213301682729796453975378303838760014703180171","12722196740161008042104063230600160916692591587307698282267739098104595392019","21442658871897924936434273103779296897320517827105661470249084250476899874515","13941330616661018529909436917201050211167996319696145260344766889645194016812","17946104200075105031482518856976026160272234205866287179121863864382028076689","17558354977867991058688364696361951976053210204255200572217074563658522370648","10902521568281866861523544064315280488095865806110221985358343592167540730121","10480646453511936101817842827276089617243072047003452927803825891921884883229","6643766403045495726977580197310085865588045098078258941752684370100934852836","9759297382606100166316216368175194356984391868580089414318996697912511188168","20686369114800811678648912138278012301751017059792657085899350106668064382752","2240276784633228882169355617919063914849374750013394580916118793601738807792","5389129762926746785370016690162671993854854880020955309951549075860208430217","21757828191223838980875048177672288146504494313568161156805121742619482174422","6589672340977795727478600486490482082688020181028116689423580126630216000086","8873943799620836427044171063707741355498423896746484957121164657037540932037","13160449352321991449988162050474550230515434401287357747880542980458793339102","13197501097050994905124371615976870638093928341445614314492454011032144220208","8340413740313657825973895352056539435197294761588407482889367602122602519887","7915509595726843615213771320240731347745156038257897701451096327955114641407","12716360689406071594764978435858390101997592070817784737113176977175770613855","11799168279103580012612433741693680191901212176687068912950785896805583177628","1552755957700638351598863195613840438289566583786422640903190114213936992530","7717538040594804644764198775753802442414066091823420105018618571014719890833","17869335419303568150034564173825172349391626172381176470372495087578615665039","16122846906100860579917160904118514092773318210416526909669780898790744824521","16114623241407635035253109690281710992349406337620190853935787477446564512160","8429089835636988890248325280114299822475003178580844782033335791949765717698","5021909288758969923449519368320048166705558618923758724165745045524092266753","11609780892597551938282093189666560403264400102545840409186025853398791339463","9734561960597991217192257635216971992678556710475259956187522144832750358531","10813638491244873310753483096939437342464961518696248443235952895038827482505","18663052058712080061795498100085868370958023478059914080660637096727647524975","9314525365222734972430756928736762448968996137856042241530361075805449377487","3070891224229804247627316094324225981593571222241652834112032934603492908107","16218873953268949747247900038835681418510078596341723885199658550649690425465","4393067842296990738414238004379500890796846784497932263550364506116302729814","12632418182338359794579314603327050190398968273335067439004197140400764590431","16259566184736886586335166896505547781405793629246315539479374599816810898962","2814325558055560774451012402571814942633788122220820739410071686684473280059","20338279412829767787632971674447333540274381888801095036358347594010786917874","2670741219913096168491334970723751636861418668023160348945317323630141327853","3892922157227799154715704147796797293447538770944492697942492570337305079250","5421196209553978835297307680517334106781140431673808912244126560565421048646","908236175468125124399338251190434374103447781784945338498096575397462392668","17636652273564107602080223987422514190933021331205576336366194778306365693715","13237642964137974353034360160812907385295055350391099870951039269784991779442","21221704416496446280060742130558845210799432949631006286203132118378345458707","4760938732010539612860168182130195361794840324422686826654830513617969238645","15609882888198881188317773535465797441429270866964119087978092950491961282109","3376212591015867709418028163351858870844417293825928905794220299702995650369","21425570543740282292132723103003656376617362904062035083532563051097533584212","6038202164226390018148656452648793708041019387555958551925347600525046600910","9721523909769562025273904542256123188806194958268176372877129715195649855964","12919014082719941506939437885142976246821800568119469413691028388157155818408","21047678267058890933412820510845854686111009729042350009279179228996071172314","1976349694806914063727842382214699343150764776931556073512809751095584246469","7783006621919737708273510859069326994168642573850103474571193791641445323553","13988546799117480465950733734130268128651148524257772236826468463902583439300","14358933516360269478259537430589252014348293049101099741973616463086676556175","9474800921698013823200892202591390267183628835688359957261740808407150804923","20037963706347165289902778363364556553678330389044611843700541418525546453004","19834717385187461063045168682510320544755369359400299076199146066987299539521","4620538607744049053855505445773408482178850741346990639581369035567675135548","8525603914196154577626558950234104470205987308418219670490217782779458913642","9048524527786065362533944085668320973357100178455488417116873972121025312775","9407801745735906368820522773825936338297746876589824483201629117426655995254","18458321063088465493769105335825974675378034787055416207054788511625124993063","8730753262450729445383895118589725381322125855724151334101848272326538887883","14547478919862241451106685784075048510153449024919071285440246339347145809552","13784593680788409600222260504003016581812247565511746972111819865392303462361","3420650765080622730813285352060580115144694966171377384339315837865789278996","9498478900982330956868115105655688321830657086417737707809970786192590239832","13164965619929553143332487255090729945651488864819577796986840432984858642747","12268150008840644397762847884242950933323013724025772778394784669401193356399","13188938044754060601469350653570787594998424477012300220812121256933705998025","18868615403387088416221198733774983032952549529017690432789470521164135904579","8229496080095108580918697035847521304964184769704442283730808346804969792663","8836920514787085863873040159436840030156960504558988182134965722143427786764","485860726022179166258204252374459416241771897108574947876994082085171183625","13825827330340300271940154756621989995086725025841626849532144465526715261749","3534837266022333996579426382846482531279356009099547006793408523227168632940","20861694880891403876362220464584622298009456414773768354811101113256810097364","15235466958402292861886087686722081507924755655072117045235955376958545610957","5894515418844600982921652895004096199665471191336541200960273569999551145621","18431674051297470736240376664888248824736879882201010919853670121185087280801","13163611329737748038819352294442642532280030294321129848712818446496643511212","16873948796440522592380293375331833615142971316765741607250824726656849064701","0","14352042597084731985167090523380966166849342735501537582515475409458617286578","0","184093017078896451627610391377674885842010996390281170535815121123139256897","10855480517023430349633912891071539318144989487091539966933621136564025987722","1475047252880002794117418469635715039620267508189956844949734258701523594107","12770221328946633761481914236621288761911023738572210359833935049572076880639","12637072234353111071208408140482463448587732925933202006306725501402875022233","5498573323171700318974442619770432471979388174675152408694259178961317117128","9261264167091492680322526000307190022174326030211500860420415738075544248006","2700532010941515051235117126371817675834478983550078195959484069809510166238","2614901965480154424359734022345137380599249970129627336690279167574032814318","19687862591820860089926147913441511589529440708225724639768017380338512972761","20231158944731277914957275874588281336226523231541097142445154007934345376944","9035484728985075995887083372660716228440296723601874712069882323426553142923","14028402467948526338761593336254970636019840296296546628049365548198505885422","13121808051306228808174111089630942026234886027315445815249447899750402363499","4527372625915062643209835479106309680507163243271678272729965486196852910420","16189979657721792924136577757822719385200418970252818352930222157989377257664","12164333722906565475074936982031012094208830010462001772696179692368311376875","5858370205943885943197474658221555694546571503055354486831610651631015836408","15270908199160540014367572925176882846874278865445377675710981534978223874893","11286729051408980855944168759111974269745178899257472373453896392302685435401","17289573715850909531812283193116346377931687763109543103789593448888152085453","7105741248909320113102505404513273089479652539904035618384873213091298254540","7074114940217186800406075628601455018311224185155464287511228577282040608737","715583426535854106463418752301381005500493761704686059735560513627309309179","12321604619126171361979592235460332183189160477865388902373936323802038912852","18190016005341990844148178297161190651172518846193049031369577377147984371424","17670829257462863871248629155809975849172626610799880870872305867158500188295","19594856787609999310690221094254583430514085336933115629128875588124494098855","10606612421072869162361656308145350823375991111296091340625384433072717183898","20983151867428320058845307293063785400007907380688115780148446035831321822910","1069974199764745898360103165659810005476344160960940508775094244893280452294","12079370783657983066371531276032803534378514351917926610229723180686420071082","12677296700344575464377357413681719606711607149256248374094787358863961649047","11938816100371165126976615978464798598420879993438443613074775265137702724945","18311245538233003706063069652909402120896222049718972404023109633559726294885","15794204827938797645162965750023554318501333819245289116482417688391341641595","8231534103677942875131000798848960381433781148655319271028893563889162379270","2766371540459561411737866933191660197562179823316731217303605261350998865103","174158064191872851418088934839822586856404443510475027422708748258229548733","3061293524954116761536350353370996557677749514535836027593325270861425233240","3554263895404584440154455511723512694047655420085772109708843713132375160762","7209379385057044748253261941814808569341518505007939141391123583104156927357","7306584942825882914302290894613387082682701525016374653956358033276385658392","2518149535352104381776345626886043183594674403698823901150244678327320921468","5581648650991852276927977167681766388490280842674960775941221560787230484545","17883694010798015849432367894079485717020271196567402381116192761974875572717","5977145130276793204043062269836655190783756459415218549551558044792975644158","19754386008710536525416038830817883084219899610549700326214066673104005510017","4105929946744209569133466396266046737599143563686422211800976803155222825742","21770901673960671282817451044366626054689162118590321728191276250541146147445","18554333663717636387381497437066120044065043997075943084601789352232163710118","3229944547201899627459711451241293172565108462885092439611847672015867445844","5025128695089026932637044021822414470493500183859188592019000631358582058815","21351482877833848842950048414861530988910588809336890728805799101884814110094","2580417795427688841110332802041457792912990931107885802056099046051394343208","20217453554976491856162621332289712918621552424181807185429093282741752407254","21356532404406996697081811349181897661406629246933280591113574903262463603755","4440014799478015355464075073962791955273636061611434328008981149274259385149","20843690474175127027273418888401580675425591967425767647356385165618233383167","17147970141429401025221000547342789232065463813831534845777771000391022505157","3597144142325569659839379046014686983329334622151978868165056915901645933562","6209531638366131710391199976252623036613987753076336616804848655147954394419","12924376785494490979045153483490119729324374404017188198699562863400832181416","9271954831445524937003351352270207203032987503409904688159223247456739162845","3506478951236426769115175508595425366287783691027816248862857623122706232593","3084250401572683617954076346006354865621707184383685778773665994692341858491","214937813484326003224036523827668299458243253921819586247641172841468344415","8441949007944436788468393086872889092620006653515759573245998674092919893035","5472204380982124305910371770584485273106619914000710696867278805337005048614","6957451303354569278122219961744612443655520675903833514582885389940461142337","5223695888445379151376126761842426317508027349104222088986256916070987227003","20759291015924141143489800711379500123670247171074786799669843043398508400513","20184325008178519139976204343423988714240828501622788042494704688999415735798","11094010350979218178409535436164979011221721457812496384533043506854053636902","19708018327503696718388479569347893621763926758569942481653711892940091446689","16239576760969556170245792487272775369975925096355053939862336412836709479930","12008121136322920586706238961334135492193994190852629384667755039803446647363","3938404938026443320997875488947263668426539575808147935781602032624388960567","16801713734429980792941203920003094648125183482183110723068392336325309041954","1348135736933873313759975759082842047841214037877011424039604914043212513364","10142538380243983753373248080068852715920793144614672667969585374528888041159","18286836573655984306012297166313463508450538607381625443348344786122995347402","14282178562099256241255469758055058528755211992281625357843046812099847456631","18310498504586098472829857362352463885170006582772479924761688074043255713348","20931050264933145513630154494146233109393636518003931889413900508273793152952","9117815489738355644295849428412003959081005458572860622048785525579819030131","19674676409453156577641701174130088374544719924762515855772825552204250790099","12217666530439855117870645320098850988684982441090141971279563337640081737469","6721147151554827579361586155763227090268714334062665099692917568899843175261","10393168006744278329721749418497705931750263896983902791526082297629822889476","17632382680567142321436824059295058152002507243188736047847725648421698926063","8915644815668215345087302861999208273742901368327590784358018441159811237379","19731092025693122985802144360142842146081743175693460146246146825438643278265","17653368603469212238948115034339203459550448357852824407551138265318018596240","20124759627749000772083196348479267605219009066228480442280858812864945298645","11853405674287861806396328147409404987103713520025699961317518417996316568170","10739116108352466483706634387205541202897545935029060507639823557349868929804","13870493301708581977871588064204896213315254481309505768503783016381785331655","4984277491507589099021974203166018421298409443693664313544662897676891503802","3813732491939127711872266925744617081981315718429011837147980575659381967059","5152934487799436357469531826806992991613558447322571799097305643879204994449","10475716151282745236368134769213248762564031478051618164990108824183737138343","20363281645962116706206801013109651698981355310971094340421354149812446325081","11149179791944629329084734656996501614903770068946878537396539586990604080534","20098243382461320106285402641532827367988692819387395302752081381569882348426","1753740335041062953435448145197363234707260348882068214931327343994875509340","11051255147516774647347134674124069066118855995496412182590304206776480641926","20959895544950066469347932903054230050048584659924310004082332316941759859508","18046662860504645170415451280713122498761168709387916159677756142032155910391","1755364709904298538442632773692058690935194900475887045395397423993838154905","16339606506864102980481476642574322167227419298111069541131542259980182181306","14408190339524969255388148576103299243778942876131961128354488113360949316157","9946460841813640866303402323884640663809344878510859564035517298772497437828","11219093149395628075183617779327553350908301794270546796194409084720111073341","18266139222091589375002467056650215336108288406927775427355560986457460639245","12092461750855134153263659752634687685480675014226328265844503427560199899284","12811512370756406280305371756309902128882727869228201979564338901652745554703","11494056611759290047400852808215427827865818063077750182066726283970699497313","1803103182997812362098649507425788010868991092238470914303344732612462422377","14381384503340300376969621193673109559740622823268831769681657915927479537930","20689236677701319733035204107546407443052878779597943650988887820832482502331","1248518465214635185310085763365946516309633048890537633763446119540321507061","15438668411853453212540489112724859770045942585564826504302486277163682264660","7341588775061129682139585657500389460048429249157465614228748370605121745325","4504761562080710809980598228305844612440881644633955774736651528528114010280","6768183425857782144106609917958447108911958549983993284783628330670083056936","18864432800539670157345842134501598535338024565284719980044881952181029433067","20242538135648097132855504672106382652225627231576405656996231424694213405641","1844464264083964639949284354287245336079489413185463075241207601686531360131","15911845300181463490669683845444097224126436423089406008360448429769777249021","18349594087636997940578113096804447148766618716832098484494987951204901542227","11284900867871484372816498154731023247071308261560664832246483877131493039953","13838067842390307292889016643938081307355899984423741625766940861130490334211","21262378979357100580670681435005220519933903042102444710095150612917203628780","6763823444922283981664855408288620066187523164280354839882753893730994207617","17198062372160935437857774405709773339424576390404933065772606842999255674379","4910589862759713464494680189783100142557385266784678566622717308750539574154","4495951938469765785379638928746803607434714393817532336381990527909331112082","10803423628537408724106316755720418678339457902731908590103549451586497435336","10742327604900791063375842750150159797501166658200942332917857864560095120434","9679015926270038281693237022936405908196319179165590326436004117358731369469","5859855229596809504556883163898845215505148039026600647376023403071323590229","8581194482353982229751614886354094486481078914838249180382996332495219638002","9869150423685094824044620504437355830592578599545482916582058524091976899262","10340057311908145870761282618099355730314916526724401591914529569238350632624","12842484708736224952204598365009720775499254193155989261323979859652732035384","6563574412407294097531030552666651821281370399094531096921555950933912468661","19336329742734989817981929120071722357096297178705076476273820653458140471501","10792923362080851293438248678431463349104184014136158937434524926676052138356","20665471031713454471299179907068607631127914980059325861302423029909655446881","19498075856863189474465312538175648563189747074446590367093335221830119666484","12210141297135413050283577412215336753593399088011993643006076938426450107881","12745540000965325745762732554429477978272189358622877690649886804232154058328","15419080570877769057759861677263504753328528236890174029223392763316069360176","1975708587934604012930285499355289219819427728112756325113502381852663658073","8422847378077687555385650917720234230036996957646299570659503827573008996988","8164476917417001252303510319369129362938630457787404172063532118910760052473","11109653701888095116791718755715250231427569592439609325987755597017115369531","1164045375325713841528353040032939032004151354772989040760025905459493553879","6114825241034332349878615848208065435840371956972900517509523038525294873262","21289945861044700959112897348334363812511733301272168208297533740451194472585","21503366579840938548869055939283915852891660934066087121873667092423924426009","9814493725866910528119842233630493992285550489057511124320186653893078229304","19181317395842408077869078515529437758720817083447018324521176515003658121203","10803508348256412756528470672974859990882174412771382054494808592955628600607","1383499853894667547751048998607684963022365054135499018492077124908089218954","467597696092317806685514243378304817821153329038105295482090363446426854008","6634126990851268334329622985879147606931400989679034298663845518703600812088","18316445900325501015574749152926889553256499264193184167094513613055281628332","12553617163472948590900828371992549553838996451111132020977067418024622529368","18711776837508932058595797908640031074280534633388881655129106420254077003","11423415306137320992612411701604642665147643107944435596437299409222239593753","11086115545141332550127683235360023637567089807640246203203561747435004546068","16588213891867416029248996145650171785509550670052395458837866690786128043741","6122890984368707030294350808316139003903481896452684404113672823411767976448","10245770158110495044175374357996262023745451819162550542312818378749308858319","11110298553387506419487999687023725358665784587262140579459409909133185575816","12279716397042387836021180906034916026465854018095077805204670466723514130053","18925369362678743894371007162715619310278065865461468080994071484671699901658","3730462150304384339239844018799048781880432519592563313412325919098582762357","3001670925246768025104148396008970819268699110545674656425975049467629397719","2729093747896400923881121667604602885026869700920338692253606409766253040792","7601814481566775355932596400768899503055729476380746921047852937238606050882","2180429045590997930178685510945499091793051313517761237068062499741628607039","10640962102127146206203172866519716614799115684110184500846315292600066321682","14549995177129860220283326765457689361152011864054035015409711209998745301978","7912783951395381892370861903784398511270889178023116264093895326398669440032","6677936569341470489146536051534723755962339705066712415750681884050723886720","4689039987287828844035990330511592114655778401762086802473777626638694045871","7565203297999487881299344230417955726606067489753172511296510548502450000704","16894076289281711923223371657223874097050025590789987183176804148627339921381","21769987021973538973537771295047578201770731661547614730588357565035246687083","11751090026303123550968222877559659109084228976878612812257992410322631997849","17609929111513573495171422231275155433152100855882264908396738196365944575766","991638530285351961974565729925758199525502712836532897115477564422303172858","5587820493811032168975297339648215582631464967872422044527448186701943582669","11603307219491384450184264414688236151446359836907477588488333738162703067395","2817235033002616590478273073712668220292276075342564015516365568229473060373","19173941449619955423111523731978140087089523658415950629931985410287649223040","7775902678892155277020721365799713026862432382817405723134361447854641571549","14655648660822188082994283171380679532389311925192515841619091208903510690289","1054831658900196957032995305926092688263657921859476658376407346723872871892","7910018696695413763653676079429008688524054782592388459532241363570351895559","21685667989670097838195041724962487246345909555273974130674326936124823253804","10718377430185158216011972060989907431397341634342237353240892249163825637287","3370973000491187483301765661851937061584050953941652254787113083493139110639","14644371919996480618923281639637343154335242300764339976733421198710959191972","11017976584600876609560101707758997747688081537442193105471904109059666441560","2394145884055511714450101398368242201875252603865873378540547912073267002143","16475980586795094327998812904836099235872469231110678866703229052382331906751","3393434901211683125524426394295029750077567767740366520910205802039793128604","10550241816606396205493532763321464988582716786222628438952341144255283176099","20518093270940094592138661269574403676775738830392887885121705052411686726348","18585594617777786526574165478527055353810131282858741147251146699144499611363","21273355500829751599527467120134599367717577330813929419070330486814611438255","21081927402841168319225110000333017731679819783367475410978031494152269888478","19509945338488550864013184074471765288376447125716252178043428237171491394691","21056058455809115512191988736205121822122360402123348743261753944547271505621","19045728006778800114381925014930049689524013319330613879630169959616841045616","9197604064637434475633225046925309739258545760150199201478904049528524048714","3210494913588713658633170116991575813298984483788435892775305008140239786897","20774901451275498028346805187799972580346069021281531744709122219644834387069","21523530811397236422010920557625638264916622019781698772417425258608015775205","1775555806052010318517360041281044811967018968367144818464300346428689313728","21686196627420940475797485903676443885440247308324122371073702528230919695358","18195190869178190484857892490334582166200707383696765004954115903319113066929","10980833978698361647263291367005093649906507516189313224172562733675948803021","17901978073658661162555488132404488935185267781522868431972778700748559556563","15754207966213815261985499561530265008284817026655607745108970962174201777533","7535773959690953269858712398275045838867893512018772662288091701754164978889","19696647246099647008696947079565087471154689832143022678817329904981509060181","2433926364711440080318009005753673493119257157249272327528094280882533860683","7868613416378449609675145999271678699158893521020147750593953140884080842364","15109342000414947193659770672188932250263214251312258593558002431030409885535","12669063041159174979424355802217581389306284668172481446282666755975377508106","17398054546870228083635199797478425660409075418595768390100778415191743424750","7934432584182696217164896095231362921691811768628662668373553323934305702965","14770303802705954124357958750067974610659609027343277372134946768518521159819","7064810488604233400033665884894690550179079962315061684082377962618248318965","9797211311858379764548903003139234131189138432232127015154782331493293601128","7846536474862987093883452980536159673751514303954710719133412028597973787251","4342989761844924824304575001440622309798545773745205548666129612872846145665","3891840832321639653175375576021426170078143003403021050132167038065081122204","13351528928196462891775729454342987077777540091274588067687383746747378753652","12732942825742574770068246954507030870667472655281551938966553941507387920870","2149482838844812387328352010585781629132915629500267381654136052072556537119","19337829133441271394383073296894990589126556338841438163823150597634985258989","16784790767866341338488002091883210505575076250347250794850878186894289110068","10482203233181600321241862176344006964662845307262074302437559986139232978426","8685976927427569517234915666091323888044897085837039536418091451170972722642","20490003833892240126935171211725757307488895950013800683178777452047576685042","1792162546879669313079163252446239161584700278214879718025605106631155615052","16064967547666639159515475511728654357685356010003598167585817572073379131343","2038324787232656409008948325869121177955199828854492699623048320829770467595","15696764031720860396919319001270179511581976202411361505429650947122124156312","17283377180786374956482947897724899741178434227255570834555404003835920866276","14698103524149569790301170945199793813326615628875144743246545241523694282446","6711063981137988186054169514779081438187470451686181505149070714454963101621","16857786182614103745145068620440842106806526694988538716333762769445868521130","15604931241790873830364282309087391662060266742664226964048688340766005827280","10728539105276793651897915093373411061587968279592965052697286530941365119673","8150860183442563718234800303914947876489919504227757192551478583314830059760","1426011333499250627953277387899688717943394734512178191484358329110163751144","13177021691461814757931777945341789768014185972466595046473710344010902851311","7534816129895264216878988811287428070883087362155113915366664473966664407529","14907306218199423424009247464904850993845191759256992433462632822851237612939","21163558241656044032472484534570527554368559972500360120943777980440523489115","5806397363033575426733460140404456453420455775513579380426708391441581270480","12364893884339333481523799997808990418911395791120224416361911865066875344248","3285266335096234368246532951544109732496011454251910737027849014913198987020","6738931146060499630761261653740567296043717658735751743879732171521836643264","10154452935594378204310846328036542082422689475780912228830139418160667825062","17173180625406101462429874268119575850799153984239959336167050246264875679929","11771759310671378070699571044737439373328418081704224134523199700571340453492","9201903010012294769226852618291328744138737168712562893561843081771853758430","18960575342806736097710212513078198499458264848590465526477817843282481159982","3786196741889484593648668912306452888245857791503087215320303509471899342034","9703108444393759620540983287148844030520253463014600450168885024356900554727","3705512247342131061920752676775918700002159699134352604893181674951834634263","20744380440510791068139627699555983784622526728039699416413477789335384413351","3509571601503556797669726886723663988433777922319888684019919141867536119602","13464915406622156297246286138929337387213467000995562465912367092350373336895","5184570673647053904035204849227819495776866012096422262744508501362530834642","16559518735657642074781960597600690088236852657657386047402706899970619619292","7703031445895422684034813861829354907029697524965102343228012205263910012570","4323874702421756221348476529012862396295343278223040426473174934502309285506","1578246331581202023879462895616463893909003870144121780590247241272523019641","9405879209721841317735974076209089263531676578417778981608079155139124027510","5937531089973867130316073975849611001398387503344701470438380911070861813134","7586511101544473155628541563617283123855353944073339155504232394211636103246","20859541098754048180298650325144834746110266291446964077336161796057865394130","18727398282885211934264671492551679457379492085372408843741660101013904064102","4483059390464830600305549616024869617415312489603482081489702556383536025114","569424976868306527856939406112364732378879754424510474659674031814541936764","7160289598139169925111275663988656373195647367305418507047960882110233073518","13843534446977373194157708959350809754094366991880678507495068572432492413153","1731917977665707785491091151062047912440812041201301360199112497894863675291","18299894985127633911581733626839452484292587866256917340398226423862554260919","11723161258567311533267481676341749364046177524968389565783704083380042064285","3982014996535111335264910190990826134502695803304697193896973827467806070914","5278339249940715518195486229712488968746505216413992114938342323551310357081","12034289354429946798181172311271198817161819978412411597686825724158852395415","21149441216914406541307441677139767537954931534486209534533763713444887915736","16627339685570972729527550183374933390203362464634838874586934884758332025227","0","4677130581325536491486966387607462164138332022971476080171400451642918512081","0","14352042597084731985167090523380966166849342735501537582515475409458617286578","20916834489524676120387097251535110444656698997153522703702345228187536332278","21786793935749494030701688869955871496912951351227898285599497639304771955576","10106735684790818457532258261695309347960776498772507430862800235146625135911","6428336958575254710332929958467344286379890417184593457768755197698276154344","9449357492676360883383358736330895668205912007904523605095822464017918670092","10111826883044783982102986732748653727827142675462565443846826176871513211676","1771614050520464755206567655437318955982568195475607626784805017809388908288","5181279093174687329726783812472167791709283592241840611012716019918769478996","19625330646091720298063185968805653622676674484679604912292515387337432408380","2768547782412073820810017491936220882567133374177389674714899611953029437729","17475858856642439946980886543613194476338688500709749507600444801508604750158","7936792328209678047590373229423008993770556793413258795813309943120313626362","21106911891928118227008245781708322897030448201446386484252960412614050392520","160923774132320138700309004142113885600469201993366299668857339625017763491","5648419216415384962210458616735048423783715757436852584018245551951672011375","12794453646271580692341785003470758044545839204088267229021463921856395617141","4601111709451948750538176472417274134490289312605627760161636077955943386715","10046283988380359324089468034447747413531065892268432343877377634782154660053","15887677480719890671704364987620562587954199613181979602582670224874937072060","5438806375578094804831996047256409601555998721704437116661615079052029229318","5430413829515608588299355610289879610496459872289866260579830278166710730809","8145153039485907902924794186182610289619367017177493868825686177746062074445","1928055138345427173859768658228754543158160037198012776182643107002265549313","19148490879735980915881361532422442541647190982033206577056178823663229748018","15656199054564982743907282071148579734980421838890045115571976090095098908226","154385660123514729365083840665563286612278642507487979936772015106480239271","11208063791115789664132153463836658703269005261853507810845677534632997047231","4980809440531928728382703477924651480613466034938913251377451359358208444982","1524057743203707519771353758649057348821286393731662706849362699486541753697","20665772595673886610059453735047124512981228960204655942695865552527752062241","1186807049699863402614882220003404557936839845187039754254628070626999741402","17655038260012023135991290457846630864347134132580096200058808385064420065201","8611084470868148809619940947805816480328036373935749220344165889392208549066","14142021595071918637986615420464369649728263276169785551023784313537577850888","17529646521554209382090880218011559871098272786987483465327107853286525994015","2040120642145596755572958772074026593399853090022282847294099647519752674971","17441803420271734262262418113785367400517983644769014072249558857676583365841","14156854282914612037377595913998497683980086971401899494541558075190351078424","10308221695667650140824826698531380084253631646490839038942942820966443197178","1101075129627707594434795803085623600522496293366442348748641072145714313183","19677319713816485771367212710795169913554477042767130022080162547884591626835","1236846904444624228218387816906331097034114618823114640245569332172064170170","3863999651943662904698904223317497819688544316226543069403948316601299911686","12968780794630186127894580430757459497437943814584371356170317519787096939403","18863964568216050769470855559607562761266854018811972360221119130648889660792","10980261057999539251342546154236953034152339724935668212029609846924397277909","6026183834429687141910761667665922459653205258849554538784504128540565267336","1325043933861691665819857415353543770328043482420922910524231709731813667285","10589598308619843106485973650162272837596868161731075129339123435634198572461","8357695535586512211131946173362697455939833584794382884292782320057641326258","3266373818615810805668585014538319832164771358602208992778943606894321985502","18074036499232490737494376693273339549688279163529537133214580364038088452119","14546600935577453311080433298210017583552443833692869656397239924176678151900","62421923620952991049984345814361879507286905070378237971492277578884351755","2879305999280748670279596944091327725232783479182912283150258658013359202277","7523008511464539555363599283132387734730173166982034845113285257594190534571","18414482382566740341309247583593587007335730216957603601657405131212831855483","21394158508691554288650769164250181829130540505570006604337113503793855355089","3200024352877513622415018610494358821826750054405465741396212494995821808793","18583601133576996595318160918578674678969104246013129013445112203099162324171","18145796007621772673239628826341501194293386796962167313526920065550313851669","9017311649741339502776691175400746954392649822047832536464207822656263252345","18362153168146140010215500928039287765459305871593496986566097271273730470963","8137596771531974550052910834199969557513818608344170025457145708469308409450","11489710840914658197112766295355622336099662907481775802420795475591935283516","6058418132558955183419693683832885398030980244262108898194450087280714698915","9464081716596322521583000253221386386542755701460501796887792800466818656833","4632263594413868498046387574568246343585648386718332974123490129408377035667","10864241267652382605762892597967987630991129737444544094661970984675195013148","672358381702519991326943764232335661923027122379208701880241660583211134830","3761419021881601449881516496390736400485736023258109551903848109531739223589","17584406156472306411792753846436958310897643228197558963900144344391941663268","3971086869354857837849050662671299737755403778005549416025416054070598660601","10418511769505660582145729932381356184056323802622588692263341282910371984971","4797673340500968789264941728451210426517927485539179025374975158473672144452","17506198805163936374805099938249109026161134938981585080451710783307614059632","1040538094214261382342456714209928670108244506572414582343994883081549888627","8914237510183240036197070003576388278879856057333560041693484758143675412051","14136593229869768312671049017309061304916651966018774777219667597506273214492","7527723058881573789910103935542251697457377309520228918711333293361918094559","17845034079768720633587635855803543601730406332999770754820779691546073771420","21192136449597606223524416011394268741807793865773093724735117166899780629350","17373928156792733028689348291740168640653686458686956074731612260838585734814","3575368361532172470819365421276300750922234087771221899636718765016432822727","3905671105615810841459498276679360601703611477355673076626657199152012335238","15834118966270774933036160410296424804265992656663500408606849145866701384044","11478411596860076878924788039412485713469009933305956193622571610650670207929","7974995804847810087089361516207533885924725750378272650282210229701213841341","5586865468135814967155407606864943593861544125559374266768853244327870360878","21610930713652170889166724369867254991075653160934238460190568303332119478948","17624839613117754113564249016757715027543803112272999539840841522244457629696","1022828462709321781206541996477450874052205698837736284984882458921416309143","12852628556728825566063930085359387693025047800276801998355627378544817469368","19713150109581181529955111379609486187117895722984560839793360814469629849318","5932543672239276476639392190134177610613994515130077252972000475128833993384","1756855040245189244185066341251595005826600382941410411264827521512267616126","14148960300564481641723530280760331599172711625127160077562802934651248087931","7722436309303682404542338415923946887003293553690572439820783469295411557373","20181390128258432311306385639955684507799165158513111684639997512737961800642","6968695124499410410328881418357876454538640230325461589379951362119783514335","8197346742708753490316632007085567712202839808324687455720697134891771701796","15843213830049750820258924263954632157488713493766287624725866593354019821802","1136112052222840614098601355856515069132620308582288307028750080622947127714","13793162625994519669206124932882928398981281982393461833207855953389090729236","2549722931441909802045353415509789475753004654940223515640269416534011821452","7581546647231145039357843571727876093136874076189012795251837560817987835168","3178234878552349246446888469490810586915942054809687415308617892075255307146","5572844367232517123630036487187625695440724918633434325994187425118192314983","6147217437024431580333032878654189079187266975263269529682366795273863832033","6620440888196864004957187722173623559560428983575315095984883584010044721007","21064554752872326168444667299414163879267344549714658633443512435247988295697","18733929743595219000457736481205393897675261941048819192609281544001491833918","74262819453204314187032042949667126970531919617513109699712532293153052656","19817843031215322467449239686176491022005761637072356523323167107950458594960","17905799030681814098208917555553114635617130785899988937798239849677038639072","16467541242437006000937806486215059273437333814714155998058609926643084746939","15346489018327906979341197843122942677020799582323229554312115534384342653397","6191590290363373453367278699734419696317973267689457700357234880966969607617","10102758286675126959906910166416650253569709129091664775410655517120601142533","19345352068069583849468708720227412659917406066348547053591244726672850984163","7731393168849691706965639728709077130299967496624041282922566445374035140041","13491044766832735894129095968097035809324027220821307874650319867589259203595","3396121818530974718122128988839627908492867826179873957531772192410875168730","9332629899007158487860716968279057723451833688900833510093477880802118969327","15453738946247922339645953025611193554081803042107693800193436831611064979877","18402677359691313778544318618903807830053441248686715452277393234747896261111","17699783811594016107396523745249380734146142111095573410219441912254869169388","10196184477336946429058129792284767028887210759900397352539077004940307235082","1081048751663016364559287530733941175187092360143277946288263314141267495493","15666883780225654343768337579037066221222490743521349831879191427874051214534","20749633832027356771603080252941602160804773577201846103187993006788685364493","21280720740695336860241115195812678273653215769922325592484702031848572721841","11715091083799613211838606449386038606470286291531419751520936471432739777644","1396037898644720241038825278560456606840375596186803477804350108641205306191","15435489464480645023958555741910908127252750481973327817620594589891712718687","14282884387573018248170420244473809202291838094638125538372311722152682407229","16785755960612602693943689432362361252837265428736643652531343881373589554010","18588669734727830452526286160196895687629590988754399071542510952874738180512","12615624596138008374241676364549312261205233366800097353387669050203476239049","9648392158742853026279845207386596440233628849169922788285790786793859427512","9698888851569291878440984388306084829532454035508353411131173617695243247644","4045452527076401019123537666081584366271373644567173713485050917122002019694","101447657324998084631736015602099248795440871322241237135264914140818198655","19887977951695038430455355171915333136235427746933190050840059783291674444782","16822334910906330018043211691716481949407129441464327761190020861708410637894","18340615507041879138619945991193985936475013212204746156790572162345792866934","6492538905968698744092985292745515296774117118852782830423983525862287342061","17289457466059072271961683718792741130740848154451675903698023334126055508448","8266008839223898579207482390222765707171840709376057446806430945724128446773","20281322631836696128777818154300454619146167974321171741286809497822733383238","12746883555800763712340812704068794329671259529019312662694409466617843235855","13133373844877330979353596486808474768128550677418549726414851446030432425987","8517743111398713899446180873246540129981144789135164913011851636988636618115","13615837005393800549364959510402965363495880213595575836477248190911380828159","12983933107666410088451392119104666055510683045559787526223305449120053688868","11210095788742571138423364236556478789411138223693859451543904342912495002364","1248458388163700672553156877801464658098414275847455344338444158902914342522","21778797850437966011801561278712977446470365798367850242800274294981815462344","13880604069081745993493253444562611393411922691770166198154081402037384670321","12511364708941586390568576778734983575427556616740931367145271790495459730208","10177525155508517402444519785793706138014287945026159129805018472521879196615","18767034183407827662031849034249026720831776493329956084663314282784219648016","18446075931376843256755920288797542648895543039667334053872484379686241491759","601658358420916957515968586163334467775445316575609128521317613437886137663","3048898915739540483421217565916989616820618761804173778112648328103655908071","11827742977340056738668126219168485786743305173012217923776698939463188061048","4788481611407301552917874540100877298336307972894526719774751510000838552049","5246338387032244190936197954441775026832455339739791667790183881879390270571","9275159226368331820264848636887269226318435469438425455731857596624087837070","12808344752070911920125566557523441588528570288407269312833230082265878196036","5973146863499562382214403505101202790618332541088016139487265253025760691886","181773925380621806730798516391631046341308014351545270518224656589807329007","7566230827992671316582712850385076068372183345712374598417692791055677028171","9526131204014660111263049913856679194104958295990671049477356209528752784114","13898922080711164687632728609251600884092341718724614054608878947732139781199","9952905432227502901987480392002201826693405707296187271662703679138879035421","14930221752674034213069779625709183207015296293139260536301330288552969816379","13979716509246576712581752293796296578070809352951945374143604295842108749696","8837178851583302818012250483513131287930714695742896818439916675551633921251","17035058658868065518163787706347185595648574299800222478170208759484064100629","15738790380323215659314428152342905782920004173906671949036824734994947763972","254815403416886490292404111743295451823358546736088944714228920649615908998","15250394470238044691246686241363623084771009698343500754290547823455997356247","11566604637517171511320374812623239805802465672915509885938175806142195147543","13909544979807882940486158991319404082942285644825236974944272077605416772431","20270416794122893546310457938320908979214136683492311646397353827965590669225","21767968172081220368524624319991562826785241846226894046710704992002013573687","16800864232599625404040534100536192882555443598291580184514662713361983420795","9018437577276583223596033140000559262825067868924284628710541914712593813999","3590585516955949990606168714500101791775670484479492819125441944159308337958","8628869411482005535639967600472561497587987723670328777201735626127568518719","11344013658521002344690631802764255176875963934239945695411546612896227955133","9634800889761353203457902532773470978757390784076428115678386643198076827377","16494924078532429037949061721277637940177934958917595239609127547708216863779","12260926878276473456432531895591862109231144671712827104727696685648033185731","5428065688654636694816285783430536095162717907887303462427928317699137265060","864012232016536040361697649146426591162743030823879964436643556703288058739","18972980804916582032327458886546452293316468875210766937534963000785322338703","5599238491258459247663659222094678855028764276840101552343461881384655863615","19233110274874677832163981443875790397742281594752144104059237970363891987967","14070533422982996710571410823881497484641786074835465094301713398825817547386","9087040390106271520526387144824250194454584429758165598392415155013666070093","14819826212031517347706774444287357787593103280176123143805265799607886374644","11684865548303830373818994722978439826734897501818382073998899640000510870927","13217339991743625889020912890502674388874672750242515773651723008096132322480","21561492364629846860479575968676037090993818957872067022139278078410910567556","9652657510840913687283255531884636077426604021055245139324795316395357738551","21701065316576384724378611149896850079553846404766654009198380988627043483211","8584841688366786065175191525076795440618700175375699352836665763106007596507","1732880429110977690824692669512279435946034737430630671373275790060365858760","10989384373533411398934349035597651841026223977659975686831433391964321121417","17581879464327113629598059977308188798908598477188609110903586054531568194237","4983246918614401771403238451287888499627187661559344404878266649522123415975","17927586882427310414006039408756606349269887209556172456303501611954696245883","13478550220436188194659449196266673840266672673887481049379881468314482103896","15442086590492535694878147767541594332149941518169180324695095099946497406205","15961911644462550294832022363389702798897918043174675324908361840518934169083","6587238612369334809733150808492262365086016088136623316008381683713145574529","3960401538068620934293325804257790037030208617316439118176315992164490591367","8698869664656668592923288507779934530316310776564919189820527798250200016551","14078437371642486814939418687098082732837167303385854666611389854728114512015","14014053205034671651113209176990956491085322986542282729856309547575946166798","13450217988163925031529636357261523518680682139363724402142759193061401003183","5879305527329645764719940009850187156117537246973695803381894351618252936191","9535557588636877793302277601888636736203917450339345011911698906956685327561","10829397868747239332243469182818559643011871343705715337673406183505617766695","1522649784809598252969090640089238327799394027809457268139522550823786826449","21010621436384772196881485911200543293268072660704580727505286599592716262605","8685268402649855090203988007442233833895365101294176368637668259444535742709","2134824389233360612539548607315930135387245846757533527041287607229397043898","8351869308795975651007937161652701296806688225641220735516959514932426697643","4116964139548913643112307888681197321780237983193161921752566790052896577383","19285292543161846099945364265169028621449545136076343418281390450837440032037","13724571107571584158073727547100686006873482261042052896038359220749743211002","15498274670911767846657383999478689258628277969653801065570045869462289771167","9677472299448160872635229465200146211181099620459651013350801406153798956054","8086717759962761210210905563240428172622501663215145957724065959478278408610","12923957414318231884705146440634021452985877189151701250626033861001244754537","12639886095636790755295332848615919528536316592839662017730114336822288541936","17964856986555319688390956952043468289783413082504127836350346299117842391890","4747136001097288857897375480313604426813532513951329367277792776423097788179","9788217150961472919640308563140176433847378871289282053276236344897471454491","16385218653892945650292895644891502784549657220526490179167755975423751896899","10504945336773723198014568044893572141916082439606658533571269406722305170074","3132758735905925540956018936342424212465490883344905333915386132155909641872","7693335852674675105337160825601248941673214184527772377498711774055807812727","6966877680107369034555572617658405689818681536527999611156822752308832908839","19520027782094352765595181663242314078224379050887752160323715312678492792624","19431234150682860647166802346634687870975313118689028268569515754062641181675","13364888858828568309599020886930936312758923058729592876257579650548403432380","4429336109190542545589327541163073283763313741603338777418489811338331963269","13303046617709922830900573453510706631957011412206677051964373158947396442149","19704385789638234259822975087242048608266192779802943912526366123151390535733","14045854768084475400757200889398660014059702795733639818306991084651587001283","11957619786392163964463621957378516434098941270737269121057718912597903306945","17811574064465368240747802047757187877765268944965687166508823127712743404164","15447026909359981861012600769812413786873660543547592040588530158648635889576","3652657328622525736865169151264366713720974824963609264234288227106439173821","12388551482532089134030199575537255785604909966611429793645638518342308611392","16000259395848052448009241875712240318742689059667753996130836559744974524298","15769136814449627202065272831251629709221888718931463351486243799566218755278","3129986775045982922390756625875681524153806914767530519644185715479209684678","15714806473545215061423205685798798012077459003081275714250881249451629322399","7757338970824900168178792700719148514100545244185553595939433108971748654835","9963979060542394161028821389467035220018178055792442311299464560576076577435","3231841111896678064239284790919154538046512531965913322293106284630906089404","15830824095291483834299244415818220330517778955678992920043677001616420125920","14966057823560468136917364313352333830345151306500382084656394975409255004732","12859391473658587722285604207494597829206746636757700619387211514019202884572","14310785551130071949875889448564196402099992603453536024066073362728556967323","12039768811721609412777015875459884003302443363369058125155527082563701279213","16847357014297880196342159177015958744805411492956048834636578961677311777055","1691980987335649322421188959259457482607530415243698541760108647785644142776","18666744223261778964184410220945755969726096204315886287930254587726956834075","8962457031462687192049138804348731783400445889407696098397965070905360762505","7384354940894232750810965214256843133893828234838625249184714570616029975822","21405742246651619351159096336099984397012902273001702952006932819970505943514","13716650118149995559080008009964363618246902837324171491466697424749420636843","6707613599497919386705904880086784270785884563531729415964783035104194061773","20631714840674168036171577412492662608900348900498313212512136921971259956750","134109077250314452203022315966647067839520543766217804829085439284183190730","13169651344249706869219241644867851569464128890966340534825217568668202987732","13167578019634904591546414111215492463545633998427272233699027431078968999337","10874644049757609067573478421900734068687770474279752119273092557335160517746","5041196669573658919647887109742564681935374826142416864168837598473602587238","2414830299666006258645673349772293044459144661103518188772254029962769281622","2486172372301551270005139443153384934952252396111278091785511578335654605911","12057330972659423422390731602477471176220899187703401729214830054645509582049","18399658521760301015112605843795715442296493965942591791286892061171549958324","4051995101124423356153781359967593019298253052388354167135583239078023449300","5358269630999833994345164198099784462567072582084855157913403977548512197456","4250314517292094528439701162504824105044853754117759762139820466351640555901","7048807064629087156949927187424019447786535600445056497976015327272550707975","6984580619131083356200383873039017606387471078698328791782303726902102599125","7336634356649738652656660282271341992082685709984485230251067537014255344791","10530909002106582229347273337544027855926506125004369394509193368470413384704","2435905354250757634354515411069428219702585532124951087402792008915185691998","1119619308682285200380888041816049747432661408134293078744532894417598260570","15183590380309605365392701288078748215744702705186547669038375710606027992156","1677501667477086293363082452892533260790073937459298239467226388635565927170","14384161985092103893292730106138577422172386461012454169181531673940244634553","18344264980400400742239745043250986937409895423338942347938056392929853524910","10299776350807701382858990585817991708413536318656769270728919653361249973711","0","0","19152212512859365819465605027100115702479818850364030050735928663253832433665","0","0","0","1","0"]
A
test-vectors/verification_key.json
@@ -0,0 +1,94 @@
+{ + "protocol": "groth16", + "curve": "bn128", + "nPublic": 1, + "vk_alpha_1": [ + "20491192805390485299153009773594534940189261866228447918068658471970481763042", + "9383485363053290200918347156157836566562967994039712273449902621266178545958", + "1" + ], + "vk_beta_2": [ + [ + "6375614351688725206403948262868962793625744043794305715222011528459656738731", + "4252822878758300859123897981450591353533073413197771768651442665752259397132" + ], + [ + "10505242626370262277552901082094356697409835680220590971873171140371331206856", + "21847035105528745403288232691147584728191162732299865338377159692350059136679" + ], + [ + "1", + "0" + ] + ], + "vk_gamma_2": [ + [ + "10857046999023057135944570762232829481370756359578518086990519993285655852781", + "11559732032986387107991004021392285783925812861821192530917403151452391805634" + ], + [ + "8495653923123431417604973247489272438418190587263600148770280649306958101930", + "4082367875863433681332203403145435568316851327593401208105741076214120093531" + ], + [ + "1", + "0" + ] + ], + "vk_delta_2": [ + [ + "10857046999023057135944570762232829481370756359578518086990519993285655852781", + "11559732032986387107991004021392285783925812861821192530917403151452391805634" + ], + [ + "8495653923123431417604973247489272438418190587263600148770280649306958101930", + "4082367875863433681332203403145435568316851327593401208105741076214120093531" + ], + [ + "1", + "0" + ] + ], + "vk_alphabeta_12": [ + [ + [ + "2029413683389138792403550203267699914886160938906632433982220835551125967885", + "21072700047562757817161031222997517981543347628379360635925549008442030252106" + ], + [ + "5940354580057074848093997050200682056184807770593307860589430076672439820312", + "12156638873931618554171829126792193045421052652279363021382169897324752428276" + ], + [ + "7898200236362823042373859371574133993780991612861777490112507062703164551277", + "7074218545237549455313236346927434013100842096812539264420499035217050630853" + ] + ], + [ + [ + "7077479683546002997211712695946002074877511277312570035766170199895071832130", + "10093483419865920389913245021038182291233451549023025229112148274109565435465" + ], + [ + "4595479056700221319381530156280926371456704509942304414423590385166031118820", + "19831328484489333784475432780421641293929726139240675179672856274388269393268" + ], + [ + "11934129596455521040620786944827826205713621633706285934057045369193958244500", + "8037395052364110730298837004334506829870972346962140206007064471173334027475" + ] + ] + ], + "IC": [ + [ + "6819801395408938350212900248749732364821477541620635511814266536599629892365", + "9092252330033992554755034971584864587974280972948086568597554018278609861372", + "1" + ], + [ + "17882351432929302592725330552407222299541667716607588771282887857165175611387", + "18907419617206324833977586007131055763810739835484972981819026406579664278293", + "1" + ] + ] +}
A
test-vectors/witness_calculator.js
@@ -0,0 +1,290 @@
+/* globals WebAssembly */ +/* + +Copyright 2020 0KIMS association. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +*/ + +const bigInt = require("big-integer"); + +const fnv = require("fnv-plus"); + +function flatArray(a) { + var res = []; + fillArray(res, a); + return res; + + function fillArray(res, a) { + if (Array.isArray(a)) { + for (let i=0; i<a.length; i++) { + fillArray(res, a[i]); + } + } else { + res.push(bigInt(a)); + } + } +} + +function fnvHash(str) { + return fnv.hash(str, 64).hex(); +} + + +module.exports = async function builder(code, options) { + + options = options || {}; + + const memory = new WebAssembly.Memory({initial:20000}); + const wasmModule = await WebAssembly.compile(code); + + let wc; + + const instance = await WebAssembly.instantiate(wasmModule, { + env: { + "memory": memory + }, + runtime: { + error: function(code, pstr, a,b,c,d) { + let errStr; + if (code == 7) { + errStr=p2str(pstr) + " " + wc.getFr(b).toString() + " != " + wc.getFr(c).toString() + " " +p2str(d); + } else { + errStr=p2str(pstr)+ " " + a + " " + b + " " + c + " " + d; + } + console.log("ERROR: ", code, errStr); + throw new Error(errStr); + }, + log: function(a) { + console.log(wc.getFr(a).toString()); + }, + logGetSignal: function(signal, pVal) { + if (options.logGetSignal) { + options.logGetSignal(signal, wc.getFr(pVal) ); + } + }, + logSetSignal: function(signal, pVal) { + if (options.logSetSignal) { + options.logSetSignal(signal, wc.getFr(pVal) ); + } + }, + logStartComponent: function(cIdx) { + if (options.logStartComponent) { + options.logStartComponent(cIdx); + } + }, + logFinishComponent: function(cIdx) { + if (options.logFinishComponent) { + options.logFinishComponent(cIdx); + } + } + } + }); + + const sanityCheck = + options && + ( + options.sanityCheck || + options.logGetSignal || + options.logSetSignal || + options.logStartComponent || + options.logFinishComponent + ); + + wc = new WitnessCalculator(memory, instance, sanityCheck); + return wc; + + function p2str(p) { + const i8 = new Uint8Array(memory.buffer); + + const bytes = []; + + for (let i=0; i8[p+i]>0; i++) bytes.push(i8[p+i]); + + return String.fromCharCode.apply(null, bytes); + } +}; + +class WitnessCalculator { + constructor(memory, instance, sanityCheck) { + this.memory = memory; + this.i32 = new Uint32Array(memory.buffer); + this.instance = instance; + + this.n32 = (this.instance.exports.getFrLen() >> 2) - 2; + const pRawPrime = this.instance.exports.getPRawPrime(); + console.log("pRawPrime:", pRawPrime); + + // console.log("0:", this.i32[(pRawPrime >> 2)]); + this.prime = bigInt(0); + for (let i=this.n32-1; i>=0; i--) { + this.prime = this.prime.shiftLeft(32); + this.prime = this.prime.add(bigInt(this.i32[(pRawPrime >> 2) + i])); + } + console.log("prime:", this.prime); + + this.mask32 = bigInt("FFFFFFFF", 16); + console.log("mask32:", this.mask32); + this.NVars = this.instance.exports.getNVars(); + console.log("NVars:", this.NVars); + this.n64 = Math.floor((this.prime.bitLength() - 1) / 64)+1; + console.log("n64:", this.n64); + this.R = bigInt.one.shiftLeft(this.n64*64); + console.log("R:", this.R); + this.RInv = this.R.modInv(this.prime); + console.log("RInv:", this.RInv); + this.sanityCheck = sanityCheck; + + } + + async _doCalculateWitness(input, sanityCheck) { + this.instance.exports.init((this.sanityCheck || sanityCheck) ? 1 : 0); + const pSigOffset = this.allocInt(); + console.log("pSigOffset:", pSigOffset); + const pFr = this.allocFr(); + console.log("pFr:", pFr); + for (let k in input) { + const h = fnvHash(k); + const hMSB = parseInt(h.slice(0,8), 16); + const hLSB = parseInt(h.slice(8,16), 16); + console.log("h(", k, ") =", h, " = ", hMSB, hLSB); + this.instance.exports.getSignalOffset32(pSigOffset, 0, hMSB, hLSB); + const sigOffset = this.getInt(pSigOffset); + console.log("sigOffset:", sigOffset); + const fArr = flatArray(input[k]); + for (let i=0; i<fArr.length; i++) { + this.setFr(pFr, fArr[i]); + this.instance.exports.setSignal(0, 0, sigOffset + i, pFr); + } + } + + } + + async calculateWitness(input, sanityCheck) { + const self = this; + + const old0 = self.i32[0]; + const w = []; + + await self._doCalculateWitness(input, sanityCheck); + + for (let i=0; i<self.NVars; i++) { + const pWitness = self.instance.exports.getPWitness(i); + w.push(self.getFr(pWitness)); + } + + self.i32[0] = old0; + return w; + } + + async calculateBinWitness(input, sanityCheck) { + const self = this; + + const old0 = self.i32[0]; + + await self._doCalculateWitness(input, sanityCheck); + + const pWitnessBuffer = self.instance.exports.getWitnessBuffer(); + + self.i32[0] = old0; + + const buff = self.memory.buffer.slice(pWitnessBuffer, pWitnessBuffer + (self.NVars * self.n64 * 8)); + return buff; + } + + allocInt() { + const p = this.i32[0]; + this.i32[0] = p+8; + return p; + } + + allocFr() { + const p = this.i32[0]; + this.i32[0] = p+this.n32*4 + 8; + return p; + } + + getInt(p) { + return this.i32[p>>2]; + } + + setInt(p, v) { + this.i32[p>>2] = v; + } + + getFr(p) { + const self = this; + const idx = (p>>2); + + if (self.i32[idx + 1] & 0x80000000) { + let res= bigInt(0); + for (let i=self.n32-1; i>=0; i--) { + res = res.shiftLeft(32); + res = res.add(bigInt(self.i32[idx+2+i])); + } + if (self.i32[idx + 1] & 0x40000000) { + return fromMontgomery(res); + } else { + return res; + } + + } else { + if (self.i32[idx] & 0x80000000) { + return self.prime.add( bigInt(self.i32[idx]).minus(bigInt(0x100000000)) ); + } else { + return bigInt(self.i32[idx]); + } + } + + function fromMontgomery(n) { + return n.times(self.RInv).mod(self.prime); + } + + } + + + setFr(p, v) { + const self = this; + v = bigInt(v); + + if (v.lt(bigInt("80000000", 16)) ) { + return setShortPositive(v); + } + if (v.geq(self.prime.minus(bigInt("80000000", 16))) ) { + return setShortNegative(v); + } + return setLongNormal(v); + + function setShortPositive(a) { + self.i32[(p >> 2)] = parseInt(a); + self.i32[(p >> 2) + 1] = 0; + } + + function setShortNegative(a) { + const b = bigInt("80000000", 16 ).add(a.minus( self.prime.minus(bigInt("80000000", 16 )))); + self.i32[(p >> 2)] = parseInt(b); + self.i32[(p >> 2) + 1] = 0; + } + + function setLongNormal(a) { + self.i32[(p >> 2)] = 0; + self.i32[(p >> 2) + 1] = 0x80000000; + for (let i=0; i<self.n32; i++) { + self.i32[(p >> 2) + 2 + i] = a.shiftRight(i*32).and(self.mask32); + } + console.log(">>>", self.i32[(p >> 2)] , self.i32[(p >> 2) + 1]); + console.log(">>>", self.i32.slice((p >> 2) + 2, (p >> 2) + 2 + self.n32)); + } + } +}
A
tests/groth16.rs
@@ -0,0 +1,39 @@
+use ark_circom::{CircomBuilder, CircuitConfig}; +use ark_std::rand::thread_rng; +use color_eyre::Result; + +use ark_bn254::Bn254; +use ark_groth16::{ + create_random_proof as prove, generate_random_parameters, prepare_verifying_key, verify_proof, +}; + +#[test] +fn groth16_proof() -> Result<()> { + let cfg = CircuitConfig::<Bn254>::new( + "./test-vectors/mycircuit.wasm", + "./test-vectors/mycircuit.r1cs", + )?; + let mut builder = CircomBuilder::new(cfg); + builder.push_input("a", 3); + builder.push_input("b", 11); + + // create an empty instance for setting it up + let circom = builder.setup(); + + let mut rng = thread_rng(); + let params = generate_random_parameters::<Bn254, _, _>(circom, &mut rng)?; + + let circom = builder.build()?; + + let inputs = circom.get_public_inputs().unwrap(); + + let proof = prove(circom, ¶ms, &mut rng)?; + + let pvk = prepare_verifying_key(¶ms.vk); + + let verified = verify_proof(&pvk, &proof, &inputs)?; + + assert!(verified); + + Ok(()) +}
A
tests/solidity.rs
@@ -0,0 +1,95 @@
+use ark_circom::{ + ethereum::{Inputs, Proof, VerifyingKey}, + CircomBuilder, CircuitConfig, +}; +use ark_std::rand::thread_rng; +use color_eyre::Result; + +use ark_bn254::Bn254; +use ark_groth16::{create_random_proof as prove, generate_random_parameters}; + +use ethers::{ + contract::{abigen, ContractError, ContractFactory}, + providers::{Http, Middleware, Provider}, + utils::{compile_and_launch_ganache, Ganache, Solc}, +}; + +use std::{convert::TryFrom, sync::Arc}; + +#[tokio::test] +async fn solidity_verifier() -> Result<()> { + let cfg = CircuitConfig::<Bn254>::new( + "./test-vectors/mycircuit.wasm", + "./test-vectors/mycircuit.r1cs", + )?; + let mut builder = CircomBuilder::new(cfg); + builder.push_input("a", 3); + builder.push_input("b", 11); + + // create an empty instance for setting it up + let circom = builder.setup(); + + let mut rng = thread_rng(); + let params = generate_random_parameters::<Bn254, _, _>(circom, &mut rng)?; + + let circom = builder.build()?; + let inputs = circom.get_public_inputs().unwrap(); + + let proof = prove(circom, ¶ms, &mut rng)?; + + // launch the network & compile the verifier + let (compiled, ganache) = + compile_and_launch_ganache(Solc::new("./tests/verifier.sol"), Ganache::new()).await?; + let acc = ganache.addresses()[0]; + let provider = Provider::<Http>::try_from(ganache.endpoint())?; + let provider = provider.with_sender(acc); + let provider = Arc::new(provider); + + // deploy the verifier + let contract = { + let contract = compiled + .get("TestVerifier") + .expect("could not find contract"); + + let factory = ContractFactory::new( + contract.abi.clone(), + contract.bytecode.clone(), + provider.clone(), + ); + let contract = factory.deploy(())?.send().await?; + let addr = contract.address(); + Groth16Verifier::new(addr, provider) + }; + + // check the proof + let verified = contract + .check_proof(proof, params.vk, inputs.as_slice()) + .await?; + assert!(verified); + + Ok(()) +} + +abigen!( + Groth16Verifier, + "./tests/verifier_abi.json" +); + +impl<M: Middleware> Groth16Verifier<M> { + async fn check_proof<I: Into<Inputs>, P: Into<Proof>, VK: Into<VerifyingKey>>( + &self, + proof: P, + vk: VK, + inputs: I, + ) -> Result<bool, ContractError<M>> { + // convert into the expected format by the contract + let proof = proof.into().as_tuple(); + let vk = vk.into().as_tuple(); + let inputs = inputs.into().0; + + // query the contract + let res = self.verify(inputs, proof, vk).call().await?; + + Ok(res) + } +}
A
tests/verifier.sol
@@ -0,0 +1,304 @@
+// THIS FILE IS GENERATED BY HARDHAT-CIRCOM. DO NOT EDIT THIS FILE. + +// +// Copyright 2017 Christian Reitwiessner +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +// 2019 OKIMS +// ported to solidity 0.5 +// fixed linter warnings +// added requiere error messages +// +pragma solidity ^0.7.6; +pragma abicoder v2; + +contract TestVerifier{ + constructor() {} + + function verify( + uint256[] memory input, + Verifier.Proof memory proof, + Verifier.VerifyingKey memory vk + ) public view returns (bool) { + uint256 err = Verifier.verify( + input, + proof, + vk + ); + + if (err == 0) { + return true; + } else { + return false; + } + } +} + +library Verifier { + using Pairing for *; + struct VerifyingKey { + Pairing.G1Point alfa1; + Pairing.G2Point beta2; + Pairing.G2Point gamma2; + Pairing.G2Point delta2; + Pairing.G1Point[] IC; + } + struct Proof { + Pairing.G1Point A; + Pairing.G2Point B; + Pairing.G1Point C; + } + + function verify( + uint256[] memory input, + Proof memory proof, + VerifyingKey memory vk + ) internal view returns (uint256) { + uint256 snark_scalar_field = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + require(input.length + 1 == vk.IC.length, "verifier-bad-input"); + // Compute the linear combination vk_x + Pairing.G1Point memory vk_x = Pairing.G1Point(0, 0); + for (uint256 i = 0; i < input.length; i++) { + require(input[i] < snark_scalar_field, "verifier-gte-snark-scalar-field"); + vk_x = Pairing.addition(vk_x, Pairing.scalar_mul(vk.IC[i + 1], input[i])); + } + vk_x = Pairing.addition(vk_x, vk.IC[0]); + if ( + !Pairing.pairingProd4( + Pairing.negate(proof.A), + proof.B, + vk.alfa1, + vk.beta2, + vk_x, + vk.gamma2, + proof.C, + vk.delta2 + ) + ) return 1; + return 0; + } + + function verifyProof( + uint256[2] memory a, + uint256[2][2] memory b, + uint256[2] memory c, + uint256[] memory input, + VerifyingKey memory vk + ) internal view returns (bool) { + Proof memory proof; + proof.A = Pairing.G1Point(a[0], a[1]); + proof.B = Pairing.G2Point([b[0][0], b[0][1]], [b[1][0], b[1][1]]); + proof.C = Pairing.G1Point(c[0], c[1]); + if (verify(input, proof, vk) == 0) { + return true; + } else { + return false; + } + } +} + +library Pairing { + struct G1Point { + uint256 X; + uint256 Y; + } + // Encoding of field elements is: X[0] * z + X[1] + struct G2Point { + uint256[2] X; + uint256[2] Y; + } + + /// @return the generator of G1 + function P1() internal pure returns (G1Point memory) { + return G1Point(1, 2); + } + + /// @return the generator of G2 + function P2() internal pure returns (G2Point memory) { + // Original code point + return + G2Point( + [ + 11559732032986387107991004021392285783925812861821192530917403151452391805634, + 10857046999023057135944570762232829481370756359578518086990519993285655852781 + ], + [ + 4082367875863433681332203403145435568316851327593401208105741076214120093531, + 8495653923123431417604973247489272438418190587263600148770280649306958101930 + ] + ); + + /* + // Changed by Jordi point + return G2Point( + [10857046999023057135944570762232829481370756359578518086990519993285655852781, + 11559732032986387107991004021392285783925812861821192530917403151452391805634], + [8495653923123431417604973247489272438418190587263600148770280649306958101930, + 4082367875863433681332203403145435568316851327593401208105741076214120093531] + ); +*/ + } + + /// @return r the negation of p, i.e. p.addition(p.negate()) should be zero. + function negate(G1Point memory p) internal pure returns (G1Point memory r) { + // The prime q in the base field F_q for G1 + uint256 q + = 21888242871839275222246405745257275088696311157297823662689037894645226208583; + if (p.X == 0 && p.Y == 0) return G1Point(0, 0); + return G1Point(p.X, q - (p.Y % q)); + } + + /// @return r the sum of two points of G1 + function addition(G1Point memory p1, G1Point memory p2) + internal + view + returns (G1Point memory r) + { + uint256[4] memory input; + input[0] = p1.X; + input[1] = p1.Y; + input[2] = p2.X; + input[3] = p2.Y; + bool success; + // solium-disable-next-line security/no-inline-assembly + assembly { + success := staticcall(sub(gas(), 2000), 6, input, 0xc0, r, 0x60) + // Use "invalid" to make gas estimation work + switch success + case 0 { + invalid() + } + } + require(success, "pairing-add-failed"); + } + + /// @return r the product of a point on G1 and a scalar, i.e. + /// p == p.scalar_mul(1) and p.addition(p) == p.scalar_mul(2) for all points p. + function scalar_mul(G1Point memory p, uint256 s) + internal + view + returns (G1Point memory r) + { + uint256[3] memory input; + input[0] = p.X; + input[1] = p.Y; + input[2] = s; + bool success; + // solium-disable-next-line security/no-inline-assembly + assembly { + success := staticcall(sub(gas(), 2000), 7, input, 0x80, r, 0x60) + // Use "invalid" to make gas estimation work + switch success + case 0 { + invalid() + } + } + require(success, "pairing-mul-failed"); + } + + /// @return the result of computing the pairing check + /// e(p1[0], p2[0]) * .... * e(p1[n], p2[n]) == 1 + /// For example pairing([P1(), P1().negate()], [P2(), P2()]) should + /// return true. + function pairing(G1Point[] memory p1, G2Point[] memory p2) + internal + view + returns (bool) + { + require(p1.length == p2.length, "pairing-lengths-failed"); + uint256 elements = p1.length; + uint256 inputSize = elements * 6; + uint256[] memory input = new uint256[](inputSize); + for (uint256 i = 0; i < elements; i++) { + input[i * 6 + 0] = p1[i].X; + input[i * 6 + 1] = p1[i].Y; + input[i * 6 + 2] = p2[i].X[0]; + input[i * 6 + 3] = p2[i].X[1]; + input[i * 6 + 4] = p2[i].Y[0]; + input[i * 6 + 5] = p2[i].Y[1]; + } + uint256[1] memory out; + bool success; + // solium-disable-next-line security/no-inline-assembly + assembly { + success := staticcall( + sub(gas(), 2000), + 8, + add(input, 0x20), + mul(inputSize, 0x20), + out, + 0x20 + ) + // Use "invalid" to make gas estimation work + switch success + case 0 { + invalid() + } + } + require(success, "pairing-opcode-failed"); + return out[0] != 0; + } + + /// Convenience method for a pairing check for two pairs. + function pairingProd2( + G1Point memory a1, + G2Point memory a2, + G1Point memory b1, + G2Point memory b2 + ) internal view returns (bool) { + G1Point[] memory p1 = new G1Point[](2); + G2Point[] memory p2 = new G2Point[](2); + p1[0] = a1; + p1[1] = b1; + p2[0] = a2; + p2[1] = b2; + return pairing(p1, p2); + } + + /// Convenience method for a pairing check for three pairs. + function pairingProd3( + G1Point memory a1, + G2Point memory a2, + G1Point memory b1, + G2Point memory b2, + G1Point memory c1, + G2Point memory c2 + ) internal view returns (bool) { + G1Point[] memory p1 = new G1Point[](3); + G2Point[] memory p2 = new G2Point[](3); + p1[0] = a1; + p1[1] = b1; + p1[2] = c1; + p2[0] = a2; + p2[1] = b2; + p2[2] = c2; + return pairing(p1, p2); + } + + /// Convenience method for a pairing check for four pairs. + function pairingProd4( + G1Point memory a1, + G2Point memory a2, + G1Point memory b1, + G2Point memory b2, + G1Point memory c1, + G2Point memory c2, + G1Point memory d1, + G2Point memory d2 + ) internal view returns (bool) { + G1Point[] memory p1 = new G1Point[](4); + G2Point[] memory p2 = new G2Point[](4); + p1[0] = a1; + p1[1] = b1; + p1[2] = c1; + p1[3] = d1; + p2[0] = a2; + p2[1] = b2; + p2[2] = c2; + p2[3] = d2; + return pairing(p1, p2); + } +} +
A
tests/verifier_abi.json
@@ -0,0 +1,1 @@
+[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256[]","name":"input","type":"uint256[]"},{"components":[{"components":[{"internalType":"uint256","name":"X","type":"uint256"},{"internalType":"uint256","name":"Y","type":"uint256"}],"internalType":"struct Pairing.G1Point","name":"A","type":"tuple"},{"components":[{"internalType":"uint256[2]","name":"X","type":"uint256[2]"},{"internalType":"uint256[2]","name":"Y","type":"uint256[2]"}],"internalType":"struct Pairing.G2Point","name":"B","type":"tuple"},{"components":[{"internalType":"uint256","name":"X","type":"uint256"},{"internalType":"uint256","name":"Y","type":"uint256"}],"internalType":"struct Pairing.G1Point","name":"C","type":"tuple"}],"internalType":"struct Verifier.Proof","name":"proof","type":"tuple"},{"components":[{"components":[{"internalType":"uint256","name":"X","type":"uint256"},{"internalType":"uint256","name":"Y","type":"uint256"}],"internalType":"struct Pairing.G1Point","name":"alfa1","type":"tuple"},{"components":[{"internalType":"uint256[2]","name":"X","type":"uint256[2]"},{"internalType":"uint256[2]","name":"Y","type":"uint256[2]"}],"internalType":"struct Pairing.G2Point","name":"beta2","type":"tuple"},{"components":[{"internalType":"uint256[2]","name":"X","type":"uint256[2]"},{"internalType":"uint256[2]","name":"Y","type":"uint256[2]"}],"internalType":"struct Pairing.G2Point","name":"gamma2","type":"tuple"},{"components":[{"internalType":"uint256[2]","name":"X","type":"uint256[2]"},{"internalType":"uint256[2]","name":"Y","type":"uint256[2]"}],"internalType":"struct Pairing.G2Point","name":"delta2","type":"tuple"},{"components":[{"internalType":"uint256","name":"X","type":"uint256"},{"internalType":"uint256","name":"Y","type":"uint256"}],"internalType":"struct Pairing.G1Point[]","name":"IC","type":"tuple[]"}],"internalType":"struct Verifier.VerifyingKey","name":"vk","type":"tuple"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]