From e1a4aaf80484e7923736ce7a846bd1bbce34846e Mon Sep 17 00:00:00 2001 From: PatStiles <33334338+PatStiles@users.noreply.github.com> Date: Tue, 30 Jan 2024 15:17:39 -0300 Subject: [PATCH 1/6] Feat/bn 254 (#646) * inti * compiles * unused * curve unit tests passing * implement ByteConversion * (rebase): Adding real points * (rebase): Adding real points over fp2 * (fix): params for BN254 Twust * (fix): Fix generation of twisted bn254 and tests * fixed byte conversion tests * rm unneeded test case * fmt lint clippy * fmt * Proof serialization fix alt (#657) * initial commit * change serde_cbor for serde_bare * bincode de/ser * remove comparison * fmt * restore flag * fix failing test * add std feature flag * conditional use * rmv conditional use * replace std for core * add cond import * rmv unused import * rplc todo w unimplemented * Update provers/cairo/src/main.rs --------- Co-authored-by: Mauro Toscano <12560266+MauroToscano@users.noreply.github.com> * add diff fuzzer * Proof serialization fix alt (#657) * initial commit * change serde_cbor for serde_bare * bincode de/ser * remove comparison * fmt * restore flag * fix failing test * add std feature flag * conditional use * rmv conditional use * replace std for core * add cond import * rmv unused import * rplc todo w unimplemented * Update provers/cairo/src/main.rs --------- Co-authored-by: Mauro Toscano <12560266+MauroToscano@users.noreply.github.com> * Wasm Pack Fixes (#609) * update wasm with new verifier api * fmt * Re add wasm compile and test * Add wasm commands to makefile * Add wasm commands to makefile * Fix wasm commands * Fix wasm * Fix wasm CI * Fmt * Fmt + fmt ci wasm * Compatibility with main * Fix * Fmt * Remove unnecesary clone * Fix linters * Raise security * Re add dep * Wasm --------- Co-authored-by: Mauro Toscano <12560266+MauroToscano@users.noreply.github.com> Co-authored-by: MauroFab * remove diff fuzzing for fuzzer * fix toml * fix cmt * inti * compiles * implement ByteConversion * (rebase): Adding real points * (feature): Instantiate pairings * (fix): params for BN254 Twust * (fix): Fix generation of twisted bn254 and tests * add pairing fuzz * Testing * fixes and cleanup * fix merge issues ugghg and ci * ci * rm pairing * nits * resolve missed merge conflict * nit * nit * add ref * rm fp12 squared tests * fix feature gate * fmt * Update math/src/elliptic_curve/short_weierstrass/curves/bn_254/twist.rs --------- Co-authored-by: Theprotocolwhisperer Co-authored-by: juan518munoz <62400508+juan518munoz@users.noreply.github.com> Co-authored-by: Mauro Toscano <12560266+MauroToscano@users.noreply.github.com> Co-authored-by: Sergio Chouhy <41742639+schouhy@users.noreply.github.com> Co-authored-by: MauroFab Co-authored-by: Diego K <43053772+diegokingston@users.noreply.github.com> --- fuzz/no_gpu_fuzz/Cargo.toml | 7 +- fuzz/no_gpu_fuzz/fuzz_targets/curve_bn254.rs | 100 +++++++++++ .../short_weierstrass/curves/bn_254/curve.rs | 143 +++++++++++++++ .../curves/bn_254/default_types.rs | 22 +++ .../curves/bn_254/field_extension.rs | 161 +++++++++++++++++ .../short_weierstrass/curves/bn_254/mod.rs | 4 + .../short_weierstrass/curves/bn_254/twist.rs | 166 ++++++++++++++++++ .../short_weierstrass/curves/mod.rs | 1 + math/src/field/element.rs | 4 +- 9 files changed, 605 insertions(+), 3 deletions(-) create mode 100644 fuzz/no_gpu_fuzz/fuzz_targets/curve_bn254.rs create mode 100644 math/src/elliptic_curve/short_weierstrass/curves/bn_254/curve.rs create mode 100644 math/src/elliptic_curve/short_weierstrass/curves/bn_254/default_types.rs create mode 100644 math/src/elliptic_curve/short_weierstrass/curves/bn_254/field_extension.rs create mode 100644 math/src/elliptic_curve/short_weierstrass/curves/bn_254/mod.rs create mode 100644 math/src/elliptic_curve/short_weierstrass/curves/bn_254/twist.rs diff --git a/fuzz/no_gpu_fuzz/Cargo.toml b/fuzz/no_gpu_fuzz/Cargo.toml index d4461cd145..179dfdfc99 100644 --- a/fuzz/no_gpu_fuzz/Cargo.toml +++ b/fuzz/no_gpu_fuzz/Cargo.toml @@ -15,10 +15,15 @@ stark-platinum-prover = { workspace = true } num-traits = "0.2" ibig = "0.3.6" p3-goldilocks = { git = "https://github.com/Plonky3/Plonky3", rev = "41cd843" } -p3-field = { git = "https://github.com/Plonky3/Plonky3", rev = "41cd843" } p3-mersenne-31 = { git = "https://github.com/Plonky3/Plonky3", rev = "41cd843" } p3-field = { git = "https://github.com/Plonky3/Plonky3", rev = "41cd843" } +[[bin]] +name = "curve_bn254" +path = "fuzz_targets/curve_bn254.rs" +test = false +doc = false + [[bin]] name = "field_fuzzer" path = "fuzz_targets/field_fuzzer.rs" diff --git a/fuzz/no_gpu_fuzz/fuzz_targets/curve_bn254.rs b/fuzz/no_gpu_fuzz/fuzz_targets/curve_bn254.rs new file mode 100644 index 0000000000..326ba0ad35 --- /dev/null +++ b/fuzz/no_gpu_fuzz/fuzz_targets/curve_bn254.rs @@ -0,0 +1,100 @@ +#![no_main] + +use libfuzzer_sys::fuzz_target; +use lambdaworks_math::{ + cyclic_group::IsGroup, + elliptic_curve::{ + traits::{IsEllipticCurve, IsPairing}, + short_weierstrass::{ + curves::bn_254::{ + curve::BN254Curve, + twist::BN254TwistCurve, + field_extension::Degree12ExtensionField, + pairing::BN254AtePairing, + }, + point::ShortWeierstrassProjectivePoint, + } + }, + field::element::FieldElement, + unsigned_integer::element::U256, +}; + +type LambdaG1 = ShortWeierstrassProjectivePoint; +type LambdaG2 = ShortWeierstrassProjectivePoint; + +//TODO: derive arbitrary for Affine and Projective or change this to use &[u8] as input to cover more cases +fuzz_target!(|values: (u64, u64)| { + let (a_val, b_val) = values; + + let a_g1 = BN254Curve::generator().operate_with_self(a_val); + let b_g1 = BN254Curve::generator().operate_with_self(b_val); + + let a_g2 = BN254TwistCurve::generator().operate_with_self(a_val); + let b_g2 = BN254TwistCurve::generator().operate_with_self(b_val); + + // ***AXIOM SOUNDNESS*** + + let g1_zero = LambdaG1::neutral_element(); + + let g2_zero = LambdaG2::neutral_element(); + + // G1 + // -O = O + assert_eq!(g1_zero.neg(), g1_zero, "Neutral mul element a failed"); + + // P * O = O + assert_eq!(a_g1.operate_with(&g1_zero), a_g1, "Neutral operate_with element a failed"); + assert_eq!(b_g1.operate_with(&g1_zero), b_g1, "Neutral operate_with element b failed"); + + // P * Q = Q * P + assert_eq!(a_g1.operate_with(&b_g1), b_g1.operate_with(&a_g1), "Commutative add property failed"); + + // (P * Q) * R = Q * (P * R) + let c_g1 = a_g1.operate_with(&b_g1); + assert_eq!((a_g1.operate_with(&b_g1)).operate_with(&c_g1), a_g1.operate_with(&b_g1.operate_with(&c_g1)), "Associative operate_with property failed"); + + // P * -P = O + assert_eq!(a_g1.operate_with(&a_g1.neg()), g1_zero, "Inverse add a failed"); + assert_eq!(b_g1.operate_with(&b_g1.neg()), g1_zero, "Inverse add b failed"); + + // G2 + // -O = O + assert_eq!(g2_zero.neg(), g2_zero, "Neutral mul element a failed"); + + // P * O = O + assert_eq!(a_g2.operate_with(&g2_zero), a_g2, "Neutral operate_with element a failed"); + assert_eq!(b_g2.operate_with(&g2_zero), b_g2, "Neutral operate_with element b failed"); + + // P * Q = Q * P + assert_eq!(a_g2.operate_with(&b_g2), b_g2.operate_with(&a_g2), "Commutative add property failed"); + + // (P * Q) * R = Q * (P * R) + let c_g2 = a_g2.operate_with(&b_g2); + assert_eq!((a_g2.operate_with(&b_g2)).operate_with(&c_g2), a_g2.operate_with(&b_g2.operate_with(&c_g2)), "Associative operate_with property failed"); + + // P * -P = O + assert_eq!(a_g2.operate_with(&a_g2.neg()), g2_zero, "Inverse add a failed"); + assert_eq!(b_g2.operate_with(&b_g2.neg()), g2_zero, "Inverse add b failed"); + + // Pairing Bilinearity + let a = U256::from_u64(a_val); + let b = U256::from_u64(b_val); + let result = BN254AtePairing::compute_batch(&[ + ( + &a_g1.operate_with_self(a).to_affine(), + &a_g2.operate_with_self(b).to_affine(), + ), + ( + &a_g1.operate_with_self(a * b).to_affine(), + &a_g2.neg().to_affine(), + ), + ]); + assert_eq!(result, FieldElement::::one()); + + // Ate Pairing returns one with one element is neutral element + let result = BN254AtePairing::compute_batch(&[(&a_g1.to_affine(), &LambdaG2::neutral_element())]); + assert_eq!(result, FieldElement::::one()); + + let result = BN254AtePairing::compute_batch(&[(&LambdaG1::neutral_element(), &a_g2.to_affine())]); + assert_eq!(result, FieldElement::::one()); +}); diff --git a/math/src/elliptic_curve/short_weierstrass/curves/bn_254/curve.rs b/math/src/elliptic_curve/short_weierstrass/curves/bn_254/curve.rs new file mode 100644 index 0000000000..74448aa515 --- /dev/null +++ b/math/src/elliptic_curve/short_weierstrass/curves/bn_254/curve.rs @@ -0,0 +1,143 @@ +use super::field_extension::{BN254PrimeField, Degree2ExtensionField}; +use crate::elliptic_curve::short_weierstrass::point::ShortWeierstrassProjectivePoint; +use crate::elliptic_curve::traits::IsEllipticCurve; +use crate::{ + elliptic_curve::short_weierstrass::traits::IsShortWeierstrass, field::element::FieldElement, +}; + +pub type BN254FieldElement = FieldElement; +pub type BN254TwistCurveFieldElement = FieldElement; + +#[derive(Clone, Debug)] +pub struct BN254Curve; + +impl IsEllipticCurve for BN254Curve { + type BaseField = BN254PrimeField; + type PointRepresentation = ShortWeierstrassProjectivePoint; + + fn generator() -> Self::PointRepresentation { + Self::PointRepresentation::new([ + FieldElement::::one(), + FieldElement::::from(2), + FieldElement::one(), + ]) + } +} + +impl IsShortWeierstrass for BN254Curve { + fn a() -> FieldElement { + FieldElement::from(0) + } + + fn b() -> FieldElement { + FieldElement::from(3) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + cyclic_group::IsGroup, elliptic_curve::traits::EllipticCurveError, + field::element::FieldElement, + }; + + use super::BN254Curve; + + #[allow(clippy::upper_case_acronyms)] + type FEE = FieldElement; + + /* + p = 21888242871839275222246405745257275088696311157297823662689037894645226208583 + Fbn128base = GF(p) + bn128 = EllipticCurve(Fbn128base,[0,3]) + bn128.random_point() + (17846236917809265466108795494334003231858579470112820692700477163012827709147 : + 17004516321005754027668809192838483252304167776681765357426682819242643291917 : + 1) + */ + fn point() -> ShortWeierstrassProjectivePoint { + let x = FEE::new_base("27749cb56beffb211b6622d7366253aa8208cf0aff7867d7945f53f3997cfedb"); + let y = FEE::new_base("2598371545fd02273e206c4a3e5e6d062c46baade65567b817c343170a15ff0d"); + BN254Curve::create_point_from_affine(x, y).unwrap() + } + + /* + x = bn128(17846236917809265466108795494334003231858579470112820692700477163012827709147: + 17004516321005754027668809192838483252304167776681765357426682819242643291917 : + 1) + x * 5 + (10253039145495711056399135467328321588927131913042076209148619870699206197155 : + 16767740621810149881158172518644598727924612864724721353109859494126614321586 : + 1) + */ + fn point_times_5() -> ShortWeierstrassProjectivePoint { + let x = FEE::new_base("16ab03b69dfb4f870b0143ebf6a71b7b2e4053ca7a4421d09a913b8b834bbfa3"); + let y = FEE::new_base("2512347279ba1049ef97d4ec348d838f939d2b7623e88f4826643cf3889599b2"); + BN254Curve::create_point_from_affine(x, y).unwrap() + } + + #[test] + fn adding_five_times_point_works() { + let point = point(); + let point_times_5 = point_times_5(); + assert_eq!(point.operate_with_self(5_u16), point_times_5); + } + + #[test] + fn create_valid_point_works() { + let p = point(); + assert_eq!( + *p.x(), + FEE::new_base("27749cb56beffb211b6622d7366253aa8208cf0aff7867d7945f53f3997cfedb") + ); + assert_eq!( + *p.y(), + FEE::new_base("2598371545fd02273e206c4a3e5e6d062c46baade65567b817c343170a15ff0d") + ); + assert_eq!(*p.z(), FEE::one()); + } + + #[test] + fn create_invalid_points_returns_an_error() { + assert_eq!( + BN254Curve::create_point_from_affine(FEE::from(0), FEE::from(1)), + Err(EllipticCurveError::InvalidPoint) + ); + } + + #[test] + fn equality_works() { + let g = BN254Curve::generator(); + let g2 = g.operate_with(&g); + assert_ne!(&g2, &g); + assert_eq!(&g, &g); + } + + #[test] + fn g_operated_with_g_satifies_ec_equation() { + let g = BN254Curve::generator(); + let g2 = g.operate_with_self(2_u64); + + // get x and y from affine coordinates + let g2_affine = g2.to_affine(); + let x = g2_affine.x(); + let y = g2_affine.y(); + + // calculate both sides of BLS12-381 equation + let three = FieldElement::from(3); + let y_sq_0 = x.pow(3_u16) + three; + let y_sq_1 = y.pow(2_u16); + + assert_eq!(y_sq_0, y_sq_1); + } + + #[test] + fn operate_with_self_works_1() { + let g = BN254Curve::generator(); + assert_eq!( + g.operate_with(&g).operate_with(&g), + g.operate_with_self(3_u16) + ); + } +} diff --git a/math/src/elliptic_curve/short_weierstrass/curves/bn_254/default_types.rs b/math/src/elliptic_curve/short_weierstrass/curves/bn_254/default_types.rs new file mode 100644 index 0000000000..482e8d8f2f --- /dev/null +++ b/math/src/elliptic_curve/short_weierstrass/curves/bn_254/default_types.rs @@ -0,0 +1,22 @@ +use crate::{ + field::{ + element::FieldElement, + fields::montgomery_backed_prime_fields::{IsModulus, MontgomeryBackendPrimeField}, + }, + unsigned_integer::element::U256, +}; + +#[derive(Clone, Debug)] +pub struct FrConfig; + +/// Modulus of bn 254 subgroup r = 21888242871839275222246405745257275088548364400416034343698204186575808495617, aka order +impl IsModulus for FrConfig { + const MODULUS: U256 = U256::from_hex_unchecked( + "30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001", + ); +} + +/// FrField using MontgomeryBackend for Bn254 +pub type FrField = MontgomeryBackendPrimeField; +/// FrElement using MontgomeryBackend for Bn254 +pub type FrElement = FieldElement; diff --git a/math/src/elliptic_curve/short_weierstrass/curves/bn_254/field_extension.rs b/math/src/elliptic_curve/short_weierstrass/curves/bn_254/field_extension.rs new file mode 100644 index 0000000000..614089a5d2 --- /dev/null +++ b/math/src/elliptic_curve/short_weierstrass/curves/bn_254/field_extension.rs @@ -0,0 +1,161 @@ +use crate::field::{ + element::FieldElement, + extensions::{ + cubic::{CubicExtensionField, HasCubicNonResidue}, + quadratic::{HasQuadraticNonResidue, QuadraticExtensionField}, + }, + fields::montgomery_backed_prime_fields::{IsModulus, MontgomeryBackendPrimeField}, +}; +use crate::unsigned_integer::element::U256; + +#[cfg(feature = "std")] +use crate::traits::ByteConversion; + +pub const BN254_PRIME_FIELD_ORDER: U256 = + U256::from_hex_unchecked("30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47"); + +// Fp for BN254 +#[derive(Clone, Debug)] +pub struct BN254FieldModulus; +impl IsModulus for BN254FieldModulus { + const MODULUS: U256 = BN254_PRIME_FIELD_ORDER; +} + +pub type BN254PrimeField = MontgomeryBackendPrimeField; + +pub type Degree2ExtensionField = QuadraticExtensionField; + +#[derive(Debug, Clone)] +pub struct BN254Residue; +impl HasQuadraticNonResidue for BN254Residue { + fn residue() -> FieldElement { + -FieldElement::one() + } +} + +#[cfg(feature = "std")] +impl ByteConversion for FieldElement { + #[cfg(feature = "std")] + fn to_bytes_be(&self) -> Vec { + let mut byte_slice = ByteConversion::to_bytes_be(&self.value()[0]); + byte_slice.extend(ByteConversion::to_bytes_be(&self.value()[1])); + byte_slice + } + + #[cfg(feature = "std")] + fn to_bytes_le(&self) -> Vec { + let mut byte_slice = ByteConversion::to_bytes_le(&self.value()[0]); + byte_slice.extend(ByteConversion::to_bytes_le(&self.value()[1])); + byte_slice + } + + #[cfg(feature = "std")] + fn from_bytes_be(bytes: &[u8]) -> Result + where + Self: std::marker::Sized, + { + const BYTES_PER_FIELD: usize = 32; + let x0 = FieldElement::from_bytes_be(&bytes[0..BYTES_PER_FIELD])?; + let x1 = FieldElement::from_bytes_be(&bytes[BYTES_PER_FIELD..BYTES_PER_FIELD * 2])?; + Ok(Self::new([x0, x1])) + } + + #[cfg(feature = "std")] + fn from_bytes_le(bytes: &[u8]) -> Result + where + Self: std::marker::Sized, + { + const BYTES_PER_FIELD: usize = 32; + let x0 = FieldElement::from_bytes_le(&bytes[0..BYTES_PER_FIELD])?; + let x1 = FieldElement::from_bytes_le(&bytes[BYTES_PER_FIELD..BYTES_PER_FIELD * 2])?; + Ok(Self::new([x0, x1])) + } +} + +#[derive(Debug, Clone)] +pub struct LevelTwoResidue; +impl HasCubicNonResidue for LevelTwoResidue { + fn residue() -> FieldElement { + FieldElement::new([FieldElement::from(9), FieldElement::one()]) + } +} + +pub type Degree6ExtensionField = CubicExtensionField; + +#[derive(Debug, Clone)] +pub struct LevelThreeResidue; +impl HasQuadraticNonResidue for LevelThreeResidue { + fn residue() -> FieldElement { + FieldElement::new([ + FieldElement::zero(), + FieldElement::one(), + FieldElement::zero(), + ]) + } +} + +pub type Degree12ExtensionField = QuadraticExtensionField; + +impl FieldElement { + pub fn new_base(a_hex: &str) -> Self { + Self::new(U256::from(a_hex)) + } +} + +impl FieldElement { + pub fn new_base(a_hex: &str) -> Self { + Self::new([FieldElement::new(U256::from(a_hex)), FieldElement::zero()]) + } +} + +impl FieldElement { + pub fn new_base(a_hex: &str) -> Self { + Self::new([ + FieldElement::new([FieldElement::new(U256::from(a_hex)), FieldElement::zero()]), + FieldElement::zero(), + FieldElement::zero(), + ]) + } +} + +impl FieldElement { + pub fn new_base(a_hex: &str) -> Self { + Self::new([ + FieldElement::::new_base(a_hex), + FieldElement::zero(), + ]) + } + + pub fn from_coefficients(coefficients: &[&str; 12]) -> Self { + FieldElement::::new([ + FieldElement::new([ + FieldElement::new([ + FieldElement::new(U256::from(coefficients[0])), + FieldElement::new(U256::from(coefficients[1])), + ]), + FieldElement::new([ + FieldElement::new(U256::from(coefficients[2])), + FieldElement::new(U256::from(coefficients[3])), + ]), + FieldElement::new([ + FieldElement::new(U256::from(coefficients[4])), + FieldElement::new(U256::from(coefficients[5])), + ]), + ]), + FieldElement::new([ + FieldElement::new([ + FieldElement::new(U256::from(coefficients[6])), + FieldElement::new(U256::from(coefficients[7])), + ]), + FieldElement::new([ + FieldElement::new(U256::from(coefficients[8])), + FieldElement::new(U256::from(coefficients[9])), + ]), + FieldElement::new([ + FieldElement::new(U256::from(coefficients[10])), + FieldElement::new(U256::from(coefficients[11])), + ]), + ]), + ]) + } +} diff --git a/math/src/elliptic_curve/short_weierstrass/curves/bn_254/mod.rs b/math/src/elliptic_curve/short_weierstrass/curves/bn_254/mod.rs new file mode 100644 index 0000000000..086bda1ef1 --- /dev/null +++ b/math/src/elliptic_curve/short_weierstrass/curves/bn_254/mod.rs @@ -0,0 +1,4 @@ +pub mod curve; +pub mod default_types; +pub mod field_extension; +pub mod twist; diff --git a/math/src/elliptic_curve/short_weierstrass/curves/bn_254/twist.rs b/math/src/elliptic_curve/short_weierstrass/curves/bn_254/twist.rs new file mode 100644 index 0000000000..c28c4aad88 --- /dev/null +++ b/math/src/elliptic_curve/short_weierstrass/curves/bn_254/twist.rs @@ -0,0 +1,166 @@ +use crate::elliptic_curve::short_weierstrass::point::ShortWeierstrassProjectivePoint; +use crate::elliptic_curve::traits::IsEllipticCurve; +use crate::unsigned_integer::element::U256; +use crate::{ + elliptic_curve::short_weierstrass::traits::IsShortWeierstrass, field::element::FieldElement, +}; + +use super::field_extension::Degree2ExtensionField; + +// X_0 : 10857046999023057135944570762232829481370756359578518086990519993285655852781 +const GENERATOR_X_0: U256 = + U256::from_hex_unchecked("1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed"); +// X_1 : 11559732032986387107991004021392285783925812861821192530917403151452391805634 +const GENERATOR_X_1: U256 = + U256::from_hex_unchecked("198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2"); +// Y_0 : 8495653923123431417604973247489272438418190587263600148770280649306958101930 +const GENERATOR_Y_0: U256 = + U256::from_hex_unchecked("12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa"); +// Y_1 : 4082367875863433681332203403145435568316851327593401208105741076214120093531 +const GENERATOR_Y_1: U256 = + U256::from_hex_unchecked("90689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b"); + +/// The description of the curve. +#[derive(Clone, Debug)] +pub struct BN254TwistCurve; + +impl IsEllipticCurve for BN254TwistCurve { + type BaseField = Degree2ExtensionField; + type PointRepresentation = ShortWeierstrassProjectivePoint; + + fn generator() -> Self::PointRepresentation { + Self::PointRepresentation::new([ + FieldElement::new([ + FieldElement::new(GENERATOR_X_0), + FieldElement::new(GENERATOR_X_1), + ]), + FieldElement::new([ + FieldElement::new(GENERATOR_Y_0), + FieldElement::new(GENERATOR_Y_1), + ]), + FieldElement::one(), + ]) + } +} + +impl IsShortWeierstrass for BN254TwistCurve { + fn a() -> FieldElement { + FieldElement::zero() + } + + fn b() -> FieldElement { + FieldElement::new([ + FieldElement::from_hex_unchecked( + "2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e5", + ), + FieldElement::from_hex_unchecked( + "9713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2", + ), + ]) + } +} + +#[cfg(test)] +mod tests { + use crate::{ + cyclic_group::IsGroup, + elliptic_curve::{ + short_weierstrass::{ + curves::bn_254::field_extension::{BN254PrimeField, Degree2ExtensionField}, + traits::IsShortWeierstrass, + }, + traits::IsEllipticCurve, + }, + field::element::FieldElement, + unsigned_integer::element::U256, + }; + + use super::BN254TwistCurve; + type Level0FE = FieldElement; + type Level1FE = FieldElement; + + #[cfg(feature = "alloc")] + use crate::elliptic_curve::short_weierstrass::point::{ + Endianness, PointFormat, ShortWeierstrassProjectivePoint, + }; + + #[test] + fn create_generator() { + let g = BN254TwistCurve::generator(); + let [x, y, _] = g.coordinates(); + assert_eq!(BN254TwistCurve::defining_equation(x, y), Level1FE::zero()); + } + + #[cfg(feature = "std")] + #[test] + fn serialize_deserialize_generator() { + let g = BN254TwistCurve::generator(); + let bytes = g.serialize(PointFormat::Projective, Endianness::LittleEndian); + + let deserialized = ShortWeierstrassProjectivePoint::::deserialize( + &bytes, + PointFormat::Projective, + Endianness::LittleEndian, + ) + .unwrap(); + + assert_eq!(deserialized, g); + } + + #[test] + fn add_points() { + let px = Level1FE::new([ + Level0FE::new(U256::from_hex_unchecked( + "8ae7459fe0d23419ec54b150574b77b1d0aa0785ce98d43365898a1d9168a2a", + )), + Level0FE::new(U256::from_hex_unchecked( + "235ec75b0bbcca3f1bab9f3aa4c65d52ccb479cb398b54bd4b0f7e3a24454b44", + )), + ]); + let py = Level1FE::new([ + Level0FE::new(U256::from_hex_unchecked( + "214ebea9c718706be05072da305b74c1585f9e75dbf99c7859bf2292e07c1691", + )), + Level0FE::new(U256::from_hex_unchecked( + "2efdafd49b6e2d718b4e3b3d78939a6463f5f84f4343ec6b1161971dd38af12f", + )), + ]); + // Similarly for point Q + let qx = Level1FE::new([ + Level0FE::new(U256::from_hex_unchecked( + "2b87b85159311f97b20b4c0e27eed978cf94984b06203f853c43192de1579324", + )), + Level0FE::new(U256::from_hex_unchecked( + "27b8bc83db0109e29df764a1379a0b9ba3dab41db33aa9be4aef88d4dd9cb275", + )), + ]); + let qy = Level1FE::new([ + Level0FE::new(U256::from_hex_unchecked( + "18e358db9be18771bb6d8ba89a7be0d521782f10af8398e981b1dd252d114bed", + )), + Level0FE::new(U256::from_hex_unchecked( + "8aa3f8a241032d3832b0f52403eb4ea852e23ec4c1e6d39b08de5ac36a2d43b", + )), + ]); + let expectedx = Level1FE::new([ + Level0FE::new(U256::from_hex_unchecked( + "27e1bb6cb3f893ef4af84ff82bd36b0c0832e3c5d4649da024b41bfecdc74233", + )), + Level0FE::new(U256::from_hex_unchecked( + "b04a4feada4eba73191184c5f39f98e7319dc888a2b258697511a2035723656", + )), + ]); + let expectedy = Level1FE::new([ + Level0FE::new(U256::from_hex_unchecked( + "a5490e3b00bc8e434f9a1ba734b05c27c525889bf117bb4d293f5aa54b238c5", + )), + Level0FE::new(U256::from_hex_unchecked( + "136ce0ba382e5d37c3e05eff8365e0e6857eefa150096af33bdbdf327649c0eb", + )), + ]); + let p = BN254TwistCurve::create_point_from_affine(px, py).unwrap(); + let q = BN254TwistCurve::create_point_from_affine(qx, qy).unwrap(); + let expected = BN254TwistCurve::create_point_from_affine(expectedx, expectedy).unwrap(); + assert_eq!(p.operate_with(&q), expected); + } +} diff --git a/math/src/elliptic_curve/short_weierstrass/curves/mod.rs b/math/src/elliptic_curve/short_weierstrass/curves/mod.rs index d48704395b..8ca192dad9 100644 --- a/math/src/elliptic_curve/short_weierstrass/curves/mod.rs +++ b/math/src/elliptic_curve/short_weierstrass/curves/mod.rs @@ -1,5 +1,6 @@ pub mod bls12_377; pub mod bls12_381; +pub mod bn_254; pub mod pallas; pub mod stark_curve; pub mod test_curve_1; diff --git a/math/src/field/element.rs b/math/src/field/element.rs index 8c052066f7..f64f20018b 100644 --- a/math/src/field/element.rs +++ b/math/src/field/element.rs @@ -657,7 +657,7 @@ impl<'de, F: IsPrimeField> Deserialize<'de> for FieldElement { } } let value = value.ok_or_else(|| de::Error::missing_field("value"))?; - Ok(FieldElement::from_hex(value).unwrap()) + Ok(FieldElement::from_hex(&value).unwrap()) } fn visit_seq(self, mut seq: S) -> Result, S::Error> @@ -672,7 +672,7 @@ impl<'de, F: IsPrimeField> Deserialize<'de> for FieldElement { value = Some(val); } let value = value.ok_or_else(|| de::Error::missing_field("value"))?; - Ok(FieldElement::from_hex(value).unwrap()) + Ok(FieldElement::from_hex(&value).unwrap()) } } From b04f7c3de2b68fe6496fc8d3c63d5ed946affce7 Mon Sep 17 00:00:00 2001 From: Lance <40670744+lancenonce@users.noreply.github.com> Date: Tue, 30 Jan 2024 19:21:27 +0100 Subject: [PATCH 2/6] WASM Default Verify Function (#761) * feat: wasm default method * fix: hunnid bits * comments * fix: import SecurityLevel * fix: fmt * feat: wasm test (failing) * fix: remove test for future PR * fix: lint --------- Co-authored-by: Diego K <43053772+diegokingston@users.noreply.github.com> --- provers/cairo/src/wasm_wrappers.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/provers/cairo/src/wasm_wrappers.rs b/provers/cairo/src/wasm_wrappers.rs index bb850fdc75..43fd398ae3 100644 --- a/provers/cairo/src/wasm_wrappers.rs +++ b/provers/cairo/src/wasm_wrappers.rs @@ -3,6 +3,7 @@ use lambdaworks_math::field::element::FieldElement; use lambdaworks_math::field::fields::fft_friendly::stark_252_prime_field::Stark252PrimeField; use serde::{Deserialize, Serialize}; use stark_platinum_prover::proof::options::ProofOptions; +use stark_platinum_prover::proof::options::SecurityLevel; use stark_platinum_prover::proof::stark::StarkProof; use stark_platinum_prover::transcript::StoneProverTranscript; use stark_platinum_prover::verifier::{IsStarkVerifier, Verifier}; @@ -53,6 +54,13 @@ pub fn verify_cairo_proof_wasm(proof_bytes: &[u8], proof_options: &ProofOptions) ) } +/// WASM Function for verifying a proof with default 100 bits of security +#[wasm_bindgen] +pub fn verify_cairo_proof_wasm_100_bits(proof_bytes: &[u8]) -> bool { + let proof_options = ProofOptions::new_secure(SecurityLevel::Conjecturable100Bits, 3); + verify_cairo_proof_wasm(proof_bytes, &proof_options) +} + #[wasm_bindgen] pub fn new_proof_options( blowup_factor: u8, From 05166f0c5acad03020462c16796e2be090596414 Mon Sep 17 00:00:00 2001 From: Mauro Toscano <12560266+MauroToscano@users.noreply.github.com> Date: Tue, 30 Jan 2024 16:42:22 -0300 Subject: [PATCH 3/6] Add tests and sage to bn254 (#792) * Add tests and sage * Fmt * Fix sage script * Fmt --------- Co-authored-by: Diego K <43053772+diegokingston@users.noreply.github.com> --- .../short_weierstrass/curves/bn_254/curve.rs | 82 +++++++++++++++---- .../short_weierstrass/curves/bn_254/twist.rs | 32 ++++++++ 2 files changed, 98 insertions(+), 16 deletions(-) diff --git a/math/src/elliptic_curve/short_weierstrass/curves/bn_254/curve.rs b/math/src/elliptic_curve/short_weierstrass/curves/bn_254/curve.rs index 74448aa515..f0a01375fd 100644 --- a/math/src/elliptic_curve/short_weierstrass/curves/bn_254/curve.rs +++ b/math/src/elliptic_curve/short_weierstrass/curves/bn_254/curve.rs @@ -45,9 +45,11 @@ mod tests { use super::BN254Curve; #[allow(clippy::upper_case_acronyms)] - type FEE = FieldElement; + type FE = FieldElement; /* + Sage script: + p = 21888242871839275222246405745257275088696311157297823662689037894645226208583 Fbn128base = GF(p) bn128 = EllipticCurve(Fbn128base,[0,3]) @@ -57,23 +59,44 @@ mod tests { 1) */ fn point() -> ShortWeierstrassProjectivePoint { - let x = FEE::new_base("27749cb56beffb211b6622d7366253aa8208cf0aff7867d7945f53f3997cfedb"); - let y = FEE::new_base("2598371545fd02273e206c4a3e5e6d062c46baade65567b817c343170a15ff0d"); + let x = FE::from_hex_unchecked( + "27749cb56beffb211b6622d7366253aa8208cf0aff7867d7945f53f3997cfedb", + ); + let y = FE::from_hex_unchecked( + "2598371545fd02273e206c4a3e5e6d062c46baade65567b817c343170a15ff0d", + ); BN254Curve::create_point_from_affine(x, y).unwrap() } /* - x = bn128(17846236917809265466108795494334003231858579470112820692700477163012827709147: - 17004516321005754027668809192838483252304167776681765357426682819242643291917 : - 1) - x * 5 - (10253039145495711056399135467328321588927131913042076209148619870699206197155 : - 16767740621810149881158172518644598727924612864724721353109859494126614321586 : - 1) + Sage script: + + p = 21888242871839275222246405745257275088696311157297823662689037894645226208583 + a = 0 + b = 3 + Fp = GF(p) + G1 = EllipticCurve(Fp, [a, b]) + + P = G1(17846236917809265466108795494334003231858579470112820692700477163012827709147,17004516321005754027668809192838483252304167776681765357426682819242643291917) + + P * 5 + + (10253039145495711056399135467328321588927131913042076209148619870699206197155 : 16767740621810149881158172518644598727924612864724721353109859494126614321586 : 1) + + hex(10253039145495711056399135467328321588927131913042076209148619870699206197155) + = 0x16ab03b69dfb4f870b0143ebf6a71b7b2e4053ca7a4421d09a913b8b834bbfa3 + + hex(16767740621810149881158172518644598727924612864724721353109859494126614321586) = + 0x2512347279ba1049ef97d4ec348d838f939d2b7623e88f4826643cf3889599b2 */ + fn point_times_5() -> ShortWeierstrassProjectivePoint { - let x = FEE::new_base("16ab03b69dfb4f870b0143ebf6a71b7b2e4053ca7a4421d09a913b8b834bbfa3"); - let y = FEE::new_base("2512347279ba1049ef97d4ec348d838f939d2b7623e88f4826643cf3889599b2"); + let x = FE::from_hex_unchecked( + "16ab03b69dfb4f870b0143ebf6a71b7b2e4053ca7a4421d09a913b8b834bbfa3", + ); + let y = FE::from_hex_unchecked( + "2512347279ba1049ef97d4ec348d838f939d2b7623e88f4826643cf3889599b2", + ); BN254Curve::create_point_from_affine(x, y).unwrap() } @@ -89,19 +112,46 @@ mod tests { let p = point(); assert_eq!( *p.x(), - FEE::new_base("27749cb56beffb211b6622d7366253aa8208cf0aff7867d7945f53f3997cfedb") + FE::new_base("27749cb56beffb211b6622d7366253aa8208cf0aff7867d7945f53f3997cfedb") + ); + assert_eq!( + *p.y(), + FE::new_base("2598371545fd02273e206c4a3e5e6d062c46baade65567b817c343170a15ff0d") + ); + assert_eq!(*p.z(), FE::one()); + } + + #[test] + fn addition_with_neutral_element_returns_same_element() { + let p = point(); + assert_eq!( + *p.x(), + FE::new_base("27749cb56beffb211b6622d7366253aa8208cf0aff7867d7945f53f3997cfedb") ); assert_eq!( *p.y(), - FEE::new_base("2598371545fd02273e206c4a3e5e6d062c46baade65567b817c343170a15ff0d") + FE::new_base("2598371545fd02273e206c4a3e5e6d062c46baade65567b817c343170a15ff0d") + ); + + let neutral_element = ShortWeierstrassProjectivePoint::::neutral_element(); + + assert_eq!(p.operate_with(&neutral_element), p); + } + + #[test] + fn neutral_element_plus_neutral_element_is_neutral_element() { + let neutral_element = ShortWeierstrassProjectivePoint::::neutral_element(); + + assert_eq!( + neutral_element.operate_with(&neutral_element), + neutral_element ); - assert_eq!(*p.z(), FEE::one()); } #[test] fn create_invalid_points_returns_an_error() { assert_eq!( - BN254Curve::create_point_from_affine(FEE::from(0), FEE::from(1)), + BN254Curve::create_point_from_affine(FE::from(0), FE::from(1)), Err(EllipticCurveError::InvalidPoint) ); } diff --git a/math/src/elliptic_curve/short_weierstrass/curves/bn_254/twist.rs b/math/src/elliptic_curve/short_weierstrass/curves/bn_254/twist.rs index c28c4aad88..3f5068908b 100644 --- a/math/src/elliptic_curve/short_weierstrass/curves/bn_254/twist.rs +++ b/math/src/elliptic_curve/short_weierstrass/curves/bn_254/twist.rs @@ -107,6 +107,38 @@ mod tests { assert_eq!(deserialized, g); } + /* + Sage script: + + a = 0 + b = 3 + p = 21888242871839275222246405745257275088696311157297823662689037894645226208583 + Fp = GF(p) + G1 = EllipticCurve(Fp, [a, b]) + + Fp = GF(p) + K. = PolynomialRing(Fp) + non_residue_fp = -1 + fp2. = Fp.extension(u^2 - non_residue_fp) + non_residue_twist = fp2([9, 1]) + + g1 = EllipticCurve(Fp, [a, b]) + g2 = EllipticCurve(fp2, [0, b/fp2(non_residue_twist)]) + + px = fp2([0x8ae7459fe0d23419ec54b150574b77b1d0aa0785ce98d43365898a1d9168a2a,0x235ec75b0bbcca3f1bab9f3aa4c65d52ccb479cb398b54bd4b0f7e3a24454b44]) + py = fp2([0x214ebea9c718706be05072da305b74c1585f9e75dbf99c7859bf2292e07c1691, 0x2efdafd49b6e2d718b4e3b3d78939a6463f5f84f4343ec6b1161971dd38af12f]) + qx = fp2([0x2b87b85159311f97b20b4c0e27eed978cf94984b06203f853c43192de1579324, 0x27b8bc83db0109e29df764a1379a0b9ba3dab41db33aa9be4aef88d4dd9cb275]) + qy = fp2([0x18e358db9be18771bb6d8ba89a7be0d521782f10af8398e981b1dd252d114bed, 0x8aa3f8a241032d3832b0f52403eb4ea852e23ec4c1e6d39b08de5ac36a2d43b]) + rx = fp2([0x27e1bb6cb3f893ef4af84ff82bd36b0c0832e3c5d4649da024b41bfecdc74233,0xb04a4feada4eba73191184c5f39f98e7319dc888a2b258697511a2035723656]) + ry = fp2([0xa5490e3b00bc8e434f9a1ba734b05c27c525889bf117bb4d293f5aa54b238c5,0x136ce0ba382e5d37c3e05eff8365e0e6857eefa150096af33bdbdf327649c0eb]) + + p = g2(px,py) + q = g2(qx,qy) + r = g2(rx,ry) + + p + q == r + */ + #[test] fn add_points() { let px = Level1FE::new([ From 607602318c5c826a2c24c4cea442d4df1ce256d8 Mon Sep 17 00:00:00 2001 From: Mauro Toscano <12560266+MauroToscano@users.noreply.github.com> Date: Tue, 30 Jan 2024 17:18:56 -0300 Subject: [PATCH 4/6] Add more examples to plonk README (#793) * Add more examples to plonk docs * Add missing equal --------- Co-authored-by: Diego K <43053772+diegokingston@users.noreply.github.com> --- provers/plonk/README.md | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/provers/plonk/README.md b/provers/plonk/README.md index 43b50681dd..e512c7a520 100644 --- a/provers/plonk/README.md +++ b/provers/plonk/README.md @@ -4,7 +4,8 @@ A fast implementation of the [Plonk](https://eprint.iacr.org/2019/953) zk-protoc This prover is still in development and may contain bugs. It is not intended to be used in production yet. ## Building a circuit -The following code creates a circuit with two public inputs `x`, `y` and asserts `x * e = y`: + +Starting with an example, the following code creates a circuit with two public inputs `x`, `y` and asserts `x * e = y`: ```rust let system = &mut ConstraintSystem::::new(); @@ -16,6 +17,44 @@ let z = system.mul(&x, &e); system.assert_eq(&y, &z);; ``` +By placing this logic under one function, one can create "gadgets" to abstract functionality. + +```Rust +/// A square and multiply implementation. +pub fn pow( + system: &mut ConstraintSystem, + base: Variable, + exponent: Variable, +) -> Variable { + let exponent_bits = system.new_u32(&exponent); + let mut result = system.new_constant(FE::one()); + + assert_eq!(exponent_bits.len(), 32); + for (i, bit) in exponent_bits.iter().enumerate() { + if i != 0 { + result = system.mul(&result, &result); + } + let result_times_base = system.mul(&result, &base); + result = system.if_else(bit, &result_times_base, &result); + } + result +} +``` + +The core operations supported by plonk and our prove system are: + +```rust +mul(var1,var2) +add(var1,var2) +add_constant(var1,constant) +div(var1,var2) +// c1 * v1 + c2 * v2 + b = w +// hinted value can be w,v1, or v2 +let w = linear_combination(&v1, c1, &v2, c2, b, Option(hint)) +``` + +All the variables and constants are finite fields. Abstractions like integers are not implemented yet. + ## Generating a proof ### Setup A setup is needed in order to generate a proof for a new circuit. The following code generates a verifying key that will be used by both the prover and the verifier: From 716e01a4095b88d4ebaa6ccfdac21b5cc555aa93 Mon Sep 17 00:00:00 2001 From: irfan Date: Wed, 31 Jan 2024 00:02:11 +0300 Subject: [PATCH 5/6] Circom Adapter for Lambdaworks Groth16 Backend (#781) * initial commit * init * init2 * small circuits work, but there's a problem with big circuits * works but needs polishing * functional circom adapter * self review * clippy * add to examples folder + add one simple example * easy pen&paper example on circom adapter * clippy * Update examples/prove-verify-circom/src/main.rs * Update examples/prove-verify-circom/src/main.rs --------- Co-authored-by: Yagnadeep Co-authored-by: Diego K <43053772+diegokingston@users.noreply.github.com> Co-authored-by: Mauro Toscano <12560266+MauroToscano@users.noreply.github.com> --- Cargo.toml | 4 +- examples/prove-verify-circom/Cargo.toml | 18 + examples/prove-verify-circom/README.md | 5 + .../input_files/input.json | 4 + .../input_files/test.circom | 19 + .../input_files/test.r1cs.json | 560 ++ .../input_files/witness.json | 45 + examples/prove-verify-circom/src/main.rs | 29 + provers/groth16/circom-adapter/Cargo.toml | 14 + provers/groth16/circom-adapter/src/README.md | 83 + .../circom-adapter/src/integration_tests.rs | 104 + provers/groth16/circom-adapter/src/lib.rs | 105 + .../test_files/poseidon/test.r1cs.json | 4512 +++++++++++++++++ .../test_files/poseidon/witness.json | 217 + .../test_files/vitalik_example/test.r1cs.json | 47 + .../test_files/vitalik_example/witness.json | 6 + provers/groth16/src/qap.rs | 45 + provers/groth16/tests/test_circuits/mod.rs | 13 +- provers/groth16/tests/test_circuits/utils.rs | 48 - 19 files changed, 5821 insertions(+), 57 deletions(-) create mode 100644 examples/prove-verify-circom/Cargo.toml create mode 100644 examples/prove-verify-circom/README.md create mode 100644 examples/prove-verify-circom/input_files/input.json create mode 100644 examples/prove-verify-circom/input_files/test.circom create mode 100644 examples/prove-verify-circom/input_files/test.r1cs.json create mode 100644 examples/prove-verify-circom/input_files/witness.json create mode 100644 examples/prove-verify-circom/src/main.rs create mode 100644 provers/groth16/circom-adapter/Cargo.toml create mode 100644 provers/groth16/circom-adapter/src/README.md create mode 100644 provers/groth16/circom-adapter/src/integration_tests.rs create mode 100644 provers/groth16/circom-adapter/src/lib.rs create mode 100644 provers/groth16/circom-adapter/test_files/poseidon/test.r1cs.json create mode 100644 provers/groth16/circom-adapter/test_files/poseidon/witness.json create mode 100644 provers/groth16/circom-adapter/test_files/vitalik_example/test.r1cs.json create mode 100644 provers/groth16/circom-adapter/test_files/vitalik_example/witness.json delete mode 100644 provers/groth16/tests/test_circuits/utils.rs diff --git a/Cargo.toml b/Cargo.toml index d2a8baa924..72de001489 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] -members = ["math", "crypto", "gpu", "benches", "provers/plonk", "provers/stark", "provers/cairo", "provers/groth16", "provers/groth16/arkworks-adapter", "examples/merkle-tree-cli", "examples/prove-miden", "winterfell_adapter", "examples/shamir_secret_sharing"] +members = ["math", "crypto", "gpu", "benches", "provers/plonk", "provers/stark", "provers/cairo", "provers/groth16", "provers/groth16/arkworks-adapter", "provers/groth16/circom-adapter", "examples/merkle-tree-cli", "examples/prove-miden", "winterfell_adapter", "examples/shamir_secret_sharing", "examples/prove-verify-circom"] exclude = ["ensure-no_std"] resolver = "2" @@ -18,6 +18,8 @@ lambdaworks-math = { path = "./math", version = "0.5.0", default-features = fals stark-platinum-prover = { path = "./provers/stark" } cairo-platinum-prover = { path = "./provers/cairo" } lambdaworks-winterfell-adapter = { path = "./winterfell_adapter"} +lambdaworks-groth16 = { path = "./provers/groth16" } +lambdaworks-circom-adapter = { path = "./provers/groth16/circom-adapter" } [patch.crates-io] winter-air = { git = "https://github.com/lambdaclass/winterfell-for-lambdaworks.git", branch = "derive-clone-v6.4"} diff --git a/examples/prove-verify-circom/Cargo.toml b/examples/prove-verify-circom/Cargo.toml new file mode 100644 index 0000000000..2b70b7dbc3 --- /dev/null +++ b/examples/prove-verify-circom/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "prove-verify-circom" +version.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true + +[[bin]] +name = "prove-verify-circom" +path = "src/main.rs" + +[dependencies] +lambdaworks-crypto = { workspace = true } +lambdaworks-groth16 = { workspace = true } +lambdaworks-math = { workspace = true, features = ["lambdaworks-serde-string"] } +lambdaworks-circom-adapter = { workspace = true } +serde = { version = "1.0" } +serde_json = "1" diff --git a/examples/prove-verify-circom/README.md b/examples/prove-verify-circom/README.md new file mode 100644 index 0000000000..327b9ed164 --- /dev/null +++ b/examples/prove-verify-circom/README.md @@ -0,0 +1,5 @@ +
+ +# Lambdaworks Circom Proving & Verification Example + +This programs converts Circom & SnarkJS generated constraints and witnesses into Lambdaworks-compatible instances, performs trusted setup, generates proof, and finally verifies the integrity of witness assignments. diff --git a/examples/prove-verify-circom/input_files/input.json b/examples/prove-verify-circom/input_files/input.json new file mode 100644 index 0000000000..15d9f0c155 --- /dev/null +++ b/examples/prove-verify-circom/input_files/input.json @@ -0,0 +1,4 @@ +{ + "in": 3, + "k": 12331548239589023489032859403859043 +} diff --git a/examples/prove-verify-circom/input_files/test.circom b/examples/prove-verify-circom/input_files/test.circom new file mode 100644 index 0000000000..a713aed200 --- /dev/null +++ b/examples/prove-verify-circom/input_files/test.circom @@ -0,0 +1,19 @@ +pragma circom 2.0.0; + +include "circomlib/mimc.circom"; + +template Test() { + signal input in; + signal input k; + + signal output out; + + component hash = MiMC7(10); + + hash.x_in <== in; + hash.k <== k; + + out <== hash.out; +} + +component main = Test(); diff --git a/examples/prove-verify-circom/input_files/test.r1cs.json b/examples/prove-verify-circom/input_files/test.r1cs.json new file mode 100644 index 0000000000..0b4ab46d80 --- /dev/null +++ b/examples/prove-verify-circom/input_files/test.r1cs.json @@ -0,0 +1,560 @@ +{ + "n8": 32, + "prime": "52435875175126190479447740508185965837690552500527637822603658699938581184513", + "nVars": 43, + "nOutputs": 1, + "nPubInputs": 0, + "nPrvInputs": 2, + "nLabels": 46, + "nConstraints": 40, + "useCustomGates": false, + "constraints": [ + [ + { + "2": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "2": "1", + "3": "1" + }, + { + "4": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "4": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "4": "1" + }, + { + "14": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "14": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "4": "1" + }, + { + "24": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "2": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "24": "1" + }, + { + "34": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "31546913764184207022969313297519759288390047205751473155388718153343834613532", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "34": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "0": "20888961410941983456478427210666206549300505294776164667214940546594746570981", + "3": "1", + "34": "1" + }, + { + "5": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "5": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "5": "1" + }, + { + "15": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "15": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "5": "1" + }, + { + "25": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "31546913764184207022969313297519759288390047205751473155388718153343834613532", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "34": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "25": "1" + }, + { + "35": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "37170749061691167740887588596256925169098797041318237106136154014185835867320", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "35": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "0": "15265126113435022738560151911929040668591755459209400716467504685752745317193", + "3": "1", + "35": "1" + }, + { + "6": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "6": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "6": "1" + }, + { + "16": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "16": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "6": "1" + }, + { + "26": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "37170749061691167740887588596256925169098797041318237106136154014185835867320", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "35": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "26": "1" + }, + { + "36": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "44101697547633208494971236340683207528647340248885841624891974200292945474857", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "36": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "0": "8334177627492981984476504167502758309043212251641796197711684499645635709656", + "3": "1", + "36": "1" + }, + { + "7": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "7": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "7": "1" + }, + { + "17": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "17": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "7": "1" + }, + { + "27": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "44101697547633208494971236340683207528647340248885841624891974200292945474857", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "36": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "27": "1" + }, + { + "37": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "51061550955646024978576101143384273722293033235345833968426029372314447605109", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "37": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "0": "1374324219480165500871639364801692115397519265181803854177629327624133579404", + "3": "1", + "37": "1" + }, + { + "8": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "8": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "8": "1" + }, + { + "18": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "18": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "8": "1" + }, + { + "28": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "51061550955646024978576101143384273722293033235345833968426029372314447605109", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "37": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "28": "1" + }, + { + "38": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "40993286491461846084814174648925789391128665924565021489700464711187288192041", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "38": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "0": "11442588683664344394633565859260176446561886575962616332903193988751292992472", + "3": "1", + "38": "1" + }, + { + "9": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "9": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "9": "1" + }, + { + "19": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "19": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "9": "1" + }, + { + "29": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "40993286491461846084814174648925789391128665924565021489700464711187288192041", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "38": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "29": "1" + }, + { + "39": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "49876973986029631718998843838858879116687043869814669263555479608900735835368", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "39": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "0": "2558901189096558760448896669327086721003508630712968559048179091037845349145", + "3": "1", + "39": "1" + }, + { + "10": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "10": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "10": "1" + }, + { + "20": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "20": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "10": "1" + }, + { + "30": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "49876973986029631718998843838858879116687043869814669263555479608900735835368", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "39": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "30": "1" + }, + { + "40": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "41245896579833438124627598732587455686500593322610353024865913009811263108124", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "40": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "0": "11189978595292752354820141775598510151189959177917284797737745690127318076389", + "3": "1", + "40": "1" + }, + { + "11": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "11": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "11": "1" + }, + { + "21": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "21": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "11": "1" + }, + { + "31": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "41245896579833438124627598732587455686500593322610353024865913009811263108124", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "40": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "31": "1" + }, + { + "41": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "49172908601962629639762324594028110760479211924325701202071483671901834442759", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "41": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "0": "3262966573163560839685415914157855077211340576201936620532175028036746741754", + "3": "1", + "41": "1" + }, + { + "12": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "12": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "12": "1" + }, + { + "22": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "22": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "12": "1" + }, + { + "32": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "49172908601962629639762324594028110760479211924325701202071483671901834442759", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "41": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "32": "1" + }, + { + "42": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "35405960283582965178043908412305484106138721775160350841992479962234692012783", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "42": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "0": "17029914891543225301403832095880481731551830725367286980611178737703889171730", + "3": "1", + "42": "1" + }, + { + "13": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "13": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "13": "1" + }, + { + "23": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "23": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "13": "1" + }, + { + "33": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "35405960283582965178043908412305484106138721775160350841992479962234692012783", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "42": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "33": "1" + }, + { + "1": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "3": "1" + } + ] + ], + "map": [ + 0, + 1, + 2, + 3, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45 + ], + "customGates": [ + ], + "customGatesUses": [ + ] +} \ No newline at end of file diff --git a/examples/prove-verify-circom/input_files/witness.json b/examples/prove-verify-circom/input_files/witness.json new file mode 100644 index 0000000000..4207715dc0 --- /dev/null +++ b/examples/prove-verify-circom/input_files/witness.json @@ -0,0 +1,45 @@ +[ + "1", + "11073827213114255906957329086229857534997954238002191229153027681252578440908", + "100", + "12331548239589023947742773902311424", + "152067081985311155572379412291064145664100437650085545398190343202576", + "18516740700945257869280000978668015992452092678439170792524989272486120334118", + "7022662982230308648050335399232956948772963131418689887894252002987768546875", + "51956299443392382476770201768219770069593065321860795447566299716793859450837", + "4589832337077045695471924912184509963859780684590815544372399341002009614962", + "43151721263355612095272837571449207599792947163563037652152844379195293492604", + "13923518436926956033248001742457856978649324264284994908337535817691587891635", + "4843162906801503449905078294340993145380292462029620758174286369055383678623", + "10640954399009552536772298136370639347896451914994597493820043860910319045843", + "11291371871739639882110542053015739974835143639864153074617527945007984830419", + "23229375666573237224212401861297898243990213841110816744719630274246595529063", + "13222018352426448324603619710634291845769452930526768742982455911430474197902", + "42603836356642079878382034286045993013202665241505712437737535898375832995479", + "10995269502869734248523438640582785199000366778089562296821197719855018050405", + "40645749183742892759873169143186093331825511065838915139022830659075233297210", + "25618850680063679784636891699173923860604589216209294323272008078711267703840", + "15962905053399236510101999614716108643565959465166315792515757582279748982717", + "973052490867319169260388138475722587919634102742416681089859800463396932720", + "42807352589555389213401887801927095349998932794050126408119589917278925500531", + "46695708553157994100238971471717954933394796381183476828999886829039295221603", + "3626180647725717472054191658206022679537438575868185675506112763847162710449", + "25285980095154378776560516012978903055394632158541238218467652979685292726822", + "27816607785590160446327659697396340081191115924637584423924791369152684083116", + "35525072061136109241322499609324640537598190500428572531014069313824905329946", + "35563106371762815454741304660936732477470586695268953125592126490560288984508", + "45056739979471266569449674582587575213635745478010205909862676815215662974089", + "40358570328226569432826486161426406175042790798088701686126465254005569423560", + "48553457651005870236720726461954064723277080748347636615268856658497960886583", + "15733056697103112875048214017492962432689517825311068136995472144431109869193", + "12625278148081892918696176163869094613762763942891566221301165285408336779571", + "40039685832477979982835247828787760241465927326343165359633440817486155306585", + "47265254224399279457685970677598211706928140259384604497499811090850630191140", + "41481802742198877433199144299630080665026042721986180187526398831261498616178", + "3474751919335953185175349276390498700731214716705337653919711395671740710863", + "13005831308942873552288451182569049178693267833278245989386363118907948517691", + "26086009060096044275403218584294027752488245265982087335021303719996289950291", + "36046495468512496004693489463327404155473956559457160352359091807534328640775", + "33089447320298940485142764058538928211186227475820992627903342589733708196045", + "4173488563640681031480698170982092880592560785072979093381120411619075720669" +] \ No newline at end of file diff --git a/examples/prove-verify-circom/src/main.rs b/examples/prove-verify-circom/src/main.rs new file mode 100644 index 0000000000..eed701d2cc --- /dev/null +++ b/examples/prove-verify-circom/src/main.rs @@ -0,0 +1,29 @@ +use std::fs; + +use lambdaworks_circom_adapter::*; +use lambdaworks_groth16::*; + +const TEST_DIR: &str = "input_files/"; + +fn main() { + println!("\nReading input files"); + let r1cs_file_content = + &fs::read_to_string(format!("{TEST_DIR}test.r1cs.json")).expect("Error reading the file"); + let witness_file_content = + &fs::read_to_string(format!("{TEST_DIR}witness.json")).expect("Error reading the file"); + + println!("\nConverting to Lambdaworks-compatible QAP and witness assignments"); + let (qap, w) = circom_to_lambda(r1cs_file_content, witness_file_content); + + println!("\nPerforming trusted setup"); + let (pk, vk) = setup(&qap); + + println!("\nProving"); + let proof = Prover::prove(&w, &qap, &pk); + + println!("\nVerifying"); + let accept = verify(&vk, &proof, &w[..qap.num_of_public_inputs]); + + assert!(accept); + println!("Proof verified!"); +} diff --git a/provers/groth16/circom-adapter/Cargo.toml b/provers/groth16/circom-adapter/Cargo.toml new file mode 100644 index 0000000000..aa7ff88b0f --- /dev/null +++ b/provers/groth16/circom-adapter/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "lambdaworks-circom-adapter" +version.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +lambdaworks-math = { path = "../../../math" } +lambdaworks-groth16 = { path = "../" } +serde = { version = "1.0" } +serde_json = "1" diff --git a/provers/groth16/circom-adapter/src/README.md b/provers/groth16/circom-adapter/src/README.md new file mode 100644 index 0000000000..29fc5fbcf2 --- /dev/null +++ b/provers/groth16/circom-adapter/src/README.md @@ -0,0 +1,83 @@ +# Circom - LambdaWorks Groth16 Adapter + +This package allows one to perform trusted setup, prove, and verify constraints generated by [SnarkJS](https://github.com/iden3/snarkjs) from a [Circom](https://github.com/iden3/circom) circuit. + +## Retrieving required files + +0. Have Circom and SnarkJS installed, + +1. Have a "\*.circom" file and an "input.json" file. Let's say circom file has name **test.circom**. +2. ```bash + circom test.circom --r1cs --wasm -p bls12381 + ``` + + This will create a **test_js** directory, and a **test.r1cs** file. Do not skip the **-p bls12381** flag as this is the only field supported by this adapter right now. + +3. ```bash + node test_js/generate_witness.js test_js/test.wasm input.json witness.wtns + ``` + + This will generate a **witness.wtns** file. + +4. ```bash + snarkjs wtns export json witness.wtns + ``` + + This will generate a **witness.json** file. + +5. ```bash + snarkjs r1cs export json test.r1cs test.r1cs.json + ``` + This will generate an **test.r1cs.json** file. + +
+ +All at once, you can copy-paste the following to the terminal in the same directory as your circuit. Please do remember changing 'test' with your .circom file name. + +```bash +circom test.circom --r1cs --wasm -p bls12381; +node test_js/generate_witness.js test_js/test.wasm input.json witness.wtns; +snarkjs wtns export json witness.wtns; +snarkjs r1cs export json test.r1cs test.r1cs.json; +rm -rf test_js test.r1cs witness.wtns; # Delete unnecessary artifacts +``` + +Now we need **test.r1cs.json** and **witness.json** files. + +## Using with LambdaWorks Circom Adapter + +This package exposes a **circom_to_lambda** function that accepts two parameters: + +1. Stringified content of the .r1cs.json file +2. Stringified content of the .witness.json file + +Relative path to a file named **test** will be just **"test"** if it's placed in the same level as Cargo.toml of this package. In this case, this method can be invoked as follows: + +```rust +// ... +let (w, qap) = circom_to_lambda( + &fs::read_to_string("test.r1cs.json").expect("Error reading file"), + &fs::read_to_string("witness.json").expect("Error reading file"), +); +``` + +As seen, this function returns a Lambdaworks-compatible QAP and the witness assignments. Then one should perform setup, prove, and verify. Here's the complete procedure: + +```rust +fn poseidon_parse_prove_verify() { + let (w, qap) = circom_to_lambda( + &fs::read_to_string("test.r1cs.json").expect("Error reading file"), + &fs::read_to_string("witness.json").expect("Error reading file"), + ); + + let (pk, vk) = setup(&qap); + let accept = verify( + &vk, + &Prover::prove(&w, &qap, &pk), + &w[..qap.num_of_public_inputs], + ); + assert!(accept); +} +``` + +For convenience, one can look up to [integration_tests.rs](integration_tests.rs) file and see an example where the Poseidon hash of "100" is proven and verified. The **vitalik_w_and_qap** example issues an example one can investigate with pen and paper, giving a clearer idea what the adapter does. diff --git a/provers/groth16/circom-adapter/src/integration_tests.rs b/provers/groth16/circom-adapter/src/integration_tests.rs new file mode 100644 index 0000000000..8dd5b65b3b --- /dev/null +++ b/provers/groth16/circom-adapter/src/integration_tests.rs @@ -0,0 +1,104 @@ +use std::fs; + +use crate::*; +use lambdaworks_groth16::*; + +const TEST_DIR: &str = "test_files"; + +// Proves & verifies a Poseidon circuit with 1 input and 2 outputs. The input is decimal 100. +#[test] +fn poseidon_parse_prove_verify() { + let test_dir = format!("{TEST_DIR}/poseidon"); + + let (qap, w) = circom_to_lambda( + &fs::read_to_string(format!("{test_dir}/test.r1cs.json")).expect("Error reading the file"), + &fs::read_to_string(format!("{test_dir}/witness.json")).expect("Error reading the file"), + ); + + let (pk, vk) = setup(&qap); + + let accept = verify( + &vk, + &Prover::prove(&w, &qap, &pk), + &w[..qap.num_of_public_inputs], + ); + assert!(accept); +} + +// Converts following Circom circuit and inputs into Lambdaworks-compatible QAP and witness assignments +// +// template Test() { +// signal input x; +// signal output out; +// +// signal sym_1; +// signal y; +// +// sym_1 <== x * x; +// out <== (sym_1 * x) + (x + 5); +// } +// +// { "x": 3 } +#[test] +fn vitalik_w_and_qap() { + let test_dir = format!("{TEST_DIR}/vitalik_example"); + + let (qap, w) = circom_to_lambda( + &fs::read_to_string(format!("{test_dir}/test.r1cs.json")).expect("Error reading the file"), + &fs::read_to_string(format!("{test_dir}/witness.json")).expect("Error reading the file"), + ); + + // Circom witness contains outputs before circuit inputs where Lambdaworks puts inputs before the output. Freshly generated + // witness assignment "w" must be in form ["1", "x", "~out", "sym_1"] + assert_eq!( + w, + ["1", "3", "23", "9"] + .map(FrElement::from_hex_unchecked) + .to_vec() + ); + + // Regarding QAP, we expect 2 constraints in following form + // -sym_1 = -x * x + // x + 5 - ~out = -sym_1 * x + // + // Same ordering difference exists for variable matrices, too. Circom adapter changes the + // order of the rows in the same way it rearranges the witness ordering. + + const BLS12381_MINUS_ONE_STR: &str = + "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000"; + const BLS12381_ZERO_STR: &str = "0x0"; + const BLS12381_ONE_STR: &str = "0x1"; + + let expected_num_of_public_inputs = 1; + let [temp_l, temp_r, temp_o] = [ + [ + [BLS12381_ZERO_STR, BLS12381_ZERO_STR], // 1 + [BLS12381_MINUS_ONE_STR, BLS12381_ZERO_STR], // x + [BLS12381_ZERO_STR, BLS12381_ZERO_STR], // ~out + [BLS12381_ZERO_STR, BLS12381_MINUS_ONE_STR], // sym_1 + ], + [ + [BLS12381_ZERO_STR, BLS12381_ZERO_STR], // 1 + [BLS12381_ONE_STR, BLS12381_ONE_STR], // x + [BLS12381_ZERO_STR, BLS12381_ZERO_STR], // ~out + [BLS12381_ZERO_STR, BLS12381_ZERO_STR], // sym_1 + ], + [ + [BLS12381_ZERO_STR, "5"], // 1 + [BLS12381_ZERO_STR, BLS12381_ONE_STR], // x + [BLS12381_ZERO_STR, BLS12381_MINUS_ONE_STR], // ~out + [BLS12381_MINUS_ONE_STR, BLS12381_ZERO_STR], // sym_1 + ], + ] + .map(|matrix| matrix.map(|row| row.map(FrElement::from_hex_unchecked).to_vec())); + let expected_qap = + QAP::from_variable_matrices(expected_num_of_public_inputs, &temp_l, &temp_r, &temp_o); + + let expected_l = expected_qap.l; + let expected_r = expected_qap.r; + let expected_o = expected_qap.o; + + assert_eq!(qap.l, expected_l); + assert_eq!(qap.r, expected_r); + assert_eq!(qap.o, expected_o); +} diff --git a/provers/groth16/circom-adapter/src/lib.rs b/provers/groth16/circom-adapter/src/lib.rs new file mode 100644 index 0000000000..3a01d97116 --- /dev/null +++ b/provers/groth16/circom-adapter/src/lib.rs @@ -0,0 +1,105 @@ +#[cfg(test)] +mod integration_tests; + +use lambdaworks_groth16::{common::FrElement, QuadraticArithmeticProgram as QAP}; +use lambdaworks_math::unsigned_integer::element::UnsignedInteger; +use serde_json::Value; + +pub fn circom_to_lambda( + r1cs_file_content: &str, + witness_file_content: &str, +) -> (QAP, Vec) { + let circom_r1cs: Value = serde_json::from_str(r1cs_file_content).expect("Error parsing JSON"); + let [mut l, mut r, mut o] = build_lro_from_circom_r1cs(&circom_r1cs); + + let mut witness: Vec<_> = serde_json::from_str::>(witness_file_content) + .expect("Error parsing JSON") + .iter() + .map(|num_str| circom_str_to_lambda_field_element(num_str)) + .collect(); + adjust_lro_and_witness(&circom_r1cs, &mut l, &mut r, &mut o, &mut witness); + + // Lambdaworks considers "1" a public input, so compensate for it + let num_of_pub_inputs = circom_r1cs["nPubInputs"].as_u64().unwrap() as usize + 1; + + ( + QAP::from_variable_matrices(num_of_pub_inputs, &l, &r, &o), + witness, + ) +} + +/// Takes as input circom.r1cs.json file and outputs LRO matrices +#[inline] +fn build_lro_from_circom_r1cs(circom_r1cs: &Value) -> [Vec>; 3] { + let num_of_vars = circom_r1cs["nVars"].as_u64().unwrap() as usize; // Includes "1" + let num_of_gates = circom_r1cs["nConstraints"].as_u64().unwrap() as usize; + + let mut l = vec![vec![FrElement::zero(); num_of_gates]; num_of_vars]; + let mut r = vec![vec![FrElement::zero(); num_of_gates]; num_of_vars]; + let mut o = vec![vec![FrElement::zero(); num_of_gates]; num_of_vars]; + + for (constraint_idx, constraint) in circom_r1cs["constraints"] + .as_array() + .unwrap() + .iter() + .enumerate() + { + let constraint = constraint.as_array().unwrap(); + for (var_idx, str_val) in constraint[0].as_object().unwrap() { + l[var_idx.parse::().unwrap()][constraint_idx] = + circom_str_to_lambda_field_element(str_val.as_str().unwrap()); + } + for (var_idx, str_val) in constraint[1].as_object().unwrap() { + r[var_idx.parse::().unwrap()][constraint_idx] = + circom_str_to_lambda_field_element(str_val.as_str().unwrap()); + } + for (var_idx, str_val) in constraint[2].as_object().unwrap() { + o[var_idx.parse::().unwrap()][constraint_idx] = + circom_str_to_lambda_field_element(str_val.as_str().unwrap()); + } + } + + [l, r, o] +} + +/// Circom witness ordering: ["1", ..outputs, ...inputs, ...other_signals] +/// Lambda witness ordering: ["1", ...inputs, ..outputs, ...other_signals] +/// Same applies to rows of LRO (each representing a variable) +/// This function compensates this difference +#[inline] +fn adjust_lro_and_witness( + circom_r1cs: &Value, + l: &mut [Vec], + r: &mut [Vec], + o: &mut [Vec], + witness: &mut [FrElement], +) { + let num_of_private_inputs = circom_r1cs["nPrvInputs"].as_u64().unwrap() as usize; + let num_of_pub_inputs = circom_r1cs["nPubInputs"].as_u64().unwrap() as usize; + let num_of_inputs = num_of_pub_inputs + num_of_private_inputs; + let num_of_outputs = circom_r1cs["nOutputs"].as_u64().unwrap() as usize; + + let mut temp; + for i in 0..num_of_inputs { + temp = l[1 + i].clone(); + l[1 + i] = l[num_of_outputs + 1 + i].clone(); + l[num_of_outputs + 1 + i] = temp; + + temp = r[1 + i].clone(); + r[1 + i] = r[num_of_outputs + 1 + i].clone(); + r[num_of_outputs + 1 + i] = temp; + + temp = o[1 + i].clone(); + o[1 + i] = o[num_of_outputs + 1 + i].clone(); + o[num_of_outputs + 1 + i] = temp; + + let temp = witness[1 + i].clone(); + witness[1 + i] = witness[num_of_outputs + 1 + i].clone(); + witness[num_of_outputs + 1 + i] = temp; + } +} + +#[inline] +fn circom_str_to_lambda_field_element(value: &str) -> FrElement { + FrElement::from(&UnsignedInteger::<4>::from_dec_str(value).unwrap()) +} diff --git a/provers/groth16/circom-adapter/test_files/poseidon/test.r1cs.json b/provers/groth16/circom-adapter/test_files/poseidon/test.r1cs.json new file mode 100644 index 0000000000..693a6d2e15 --- /dev/null +++ b/provers/groth16/circom-adapter/test_files/poseidon/test.r1cs.json @@ -0,0 +1,4512 @@ +{ + "n8": 32, + "prime": "52435875175126190479447740508185965837690552500527637822603658699938581184513", + "nVars": 215, + "nOutputs": 1, + "nPubInputs": 0, + "nPrvInputs": 1, + "nLabels": 583, + "nConstraints": 213, + "useCustomGates": false, + "constraints": [ + [ + { + "0": "47002224662166672867131413033472899870931743636313811084027392038215058404480", + "2": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "0": "5433650512959517612316327474713065966758808864213826738576266661723522780033", + "2": "1" + }, + { + "73": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "73": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "73": "1" + }, + { + "74": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "74": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "0": "5433650512959517612316327474713065966758808864213826738576266661723522780033", + "2": "1" + }, + { + "0": "17301668213014761646596552653015591039760461391617952799153519234591864034463", + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "18121914352619992825529298674955760274687060138678729211531310305112441479676", + "3": "32708508311735022941325600146712381710542921827904536994669574389708558585369" + }, + { + "0": "34313960822506197653918441833230205563003492361848908611072348394826139704837", + "3": "19727366863391167538122140361473584127147630672623100827934084310230022599144" + }, + { + "75": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "75": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "75": "1" + }, + { + "76": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "76": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "0": "34313960822506197653918441833230205563003492361848908611072348394826139704837", + "3": "19727366863391167538122140361473584127147630672623100827934084310230022599144" + }, + { + "0": "19776162473771124504636460540005465934623588388516917789964545078054814040751", + "4": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "0": "39641237770587972878319552685981320289244633020922775863749204380887651483675", + "3": "44087700254192067928964146508732085830934444379186570650215212783609639205945" + }, + { + "0": "12794637404538217601128187822204645548445919479604861958854454319050929700838", + "3": "8348174920934122550483593999453880006756108121341067172388445916328941978568" + }, + { + "77": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "77": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "77": "1" + }, + { + "78": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "78": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "0": "12794637404538217601128187822204645548445919479604861958854454319050929700838", + "3": "8348174920934122550483593999453880006756108121341067172388445916328941978568" + }, + { + "0": "11316768622745143833150712249439306411966930091146927416794626237074092972974", + "5": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "4": "49525108357280539459569165668684164497620522385376616561300824389215851676972", + "5": "32708508311735022941325600146712381710542921827904536994669574389708558585369" + }, + { + "4": "2910766817845651019878574839501801340070030115151021261302834310722729507541", + "5": "19727366863391167538122140361473584127147630672623100827934084310230022599144" + }, + { + "79": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "79": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "79": "1" + }, + { + "80": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "80": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "4": "2910766817845651019878574839501801340070030115151021261302834310722729507541", + "5": "19727366863391167538122140361473584127147630672623100827934084310230022599144" + }, + { + "0": "16445483823163065295596987123801926703922762982696126295152762759513382273866", + "6": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "4": "46659190381000641016999143094135733593911872198348198329939611371656852828168", + "5": "44087700254192067928964146508732085830934444379186570650215212783609639205945" + }, + { + "4": "5776684794125549462448597414050232243778680302179439492664047328281728356345", + "5": "8348174920934122550483593999453880006756108121341067172388445916328941978568" + }, + { + "81": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "81": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "81": "1" + }, + { + "82": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "82": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "4": "5776684794125549462448597414050232243778680302179439492664047328281728356345", + "5": "8348174920934122550483593999453880006756108121341067172388445916328941978568" + }, + { + "0": "4514474156763384993737907502541146539969481658202448264361041161669007485071", + "7": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "6": "49525108357280539459569165668684164497620522385376616561300824389215851676972", + "7": "32708508311735022941325600146712381710542921827904536994669574389708558585369" + }, + { + "6": "2910766817845651019878574839501801340070030115151021261302834310722729507541", + "7": "19727366863391167538122140361473584127147630672623100827934084310230022599144" + }, + { + "83": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "83": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "83": "1" + }, + { + "84": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "84": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "6": "2910766817845651019878574839501801340070030115151021261302834310722729507541", + "7": "19727366863391167538122140361473584127147630672623100827934084310230022599144" + }, + { + "0": "15962945726901666037200703277090943625692830090147479512076829448913210994056", + "8": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "6": "46659190381000641016999143094135733593911872198348198329939611371656852828168", + "7": "44087700254192067928964146508732085830934444379186570650215212783609639205945" + }, + { + "6": "5776684794125549462448597414050232243778680302179439492664047328281728356345", + "7": "8348174920934122550483593999453880006756108121341067172388445916328941978568" + }, + { + "85": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "85": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "85": "1" + }, + { + "86": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "86": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "6": "5776684794125549462448597414050232243778680302179439492664047328281728356345", + "7": "8348174920934122550483593999453880006756108121341067172388445916328941978568" + }, + { + "0": "887718591790650017281197227986729839639624303500401204697133087008458682956", + "9": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "72": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "72": "1" + }, + { + "87": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "87": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "87": "1" + }, + { + "88": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "88": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "72": "1" + }, + { + "0": "12275810531539430738053742281045622394839331044128025660443842052759513336728", + "10": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "8": "5192654897427357008432485609548618383439366938048738267512357806175323156466", + "9": "44191900748914651603154436884985405802624310922043415177054320835582811318799", + "17": "16682593524536877201531712829085670433517609722011452244873718259799228348094", + "18": "43176292574239827709965913132349833968585313120748753931461671119571506050120", + "19": "22454277736302330539981016565441139619576134744538169566477933175530787940739", + "20": "30123729579747296778679082467374526570498598882963001935435199420320161942256", + "21": "46568232823494654032688015031064077399377245709898471396748713760514442211391", + "22": "25337516245609128609822543248097808410082403769697789578791662343706028102192", + "23": "35601550524008744029282673352847160429101650733862130894197735477082149245871", + "24": "35137801412648608602082879801594064027148126627191773745053156849660147041891", + "25": "40398626151690458309263530700753346533191711706310534404013923450891362313020", + "26": "49254854458955331381907192669226021831064520795257317826598691575112032093544", + "27": "34654188339918270879861929787619795508384021635481876666056120963255152633433", + "28": "494391027058814481580993061254426732497840799120447570371498432602819883101", + "29": "44946201903288700296658382468835869814262726797502836774418588029043176260447", + "30": "48528295336382606069489647204400489577673347693131220253265802156768701700347", + "31": "31360798183006332565597117389323951060666556605711330882110548035101473192155", + "32": "14199984020335272086112293703616407891113291629004800921837716240396770592817", + "33": "22499065136731618754150770882412842216746313195882824776123236056140771071854", + "34": "52217880981612453390038597745102175942273063793798860889994274578587614827152", + "35": "11537655746854260565095799304447329691170321378827272307394507431534802009593", + "36": "4976638099565858473647778905610272835781322907363722016885461315219100861322", + "37": "4108392090303695195493660099979157995992377166454976378640241409951861734299", + "38": "15653641529872622376681823131135518307232703072159041211329697102310448663115", + "39": "14800899020251847241232019228031646644613998640250076359556728567450119111044", + "40": "44463855465583845034168653476990587477897453789614831858855295629714808931485", + "41": "10017085478120126963175632015936019718784225748796618639521456603694580582439", + "42": "5964435497664887447234757603860015773037854172250406422904388839641102056810", + "43": "5437229115590008548073876339184123793065964842700306165967098364197229809109", + "44": "31761090498660381152590868148703047507119657770368107945038318332745129332080", + "45": "52164753007942648654126677065408014405462714011956435929334483881356324845985", + "46": "8491974724559101596776574308942970972383695354753462027230993760828778482293", + "47": "46151185706456268294809352088665486118335041496311606337323937958920678053636", + "48": "26163285151599097458896485665061693812858393921677914525792777641618531124982", + "49": "20680354245047335378058215136376195768406919946856627631309921694439969779746", + "50": "17670284351817699338614554067914420616735028118279118466474981361397453000395", + "51": "48726527588140482709743231003634452131141550449721745648864847320882060170540", + "52": "1855745755075703151059428086310382931309105627860435429284103108472625282784", + "53": "27754302890119318476717015603950964862285802702681699302181928196592129086473", + "54": "49105981729716423446324504208277584360266771134924957425516715062055227989458", + "55": "2431220470210283703128932870876730811953054921751866995952505982901254332105", + "56": "17241810903661829527159007203551354915356058054897363299778832770398291954875", + "57": "5506609965393505601379869526086751832292859950316561376217538900402655037296", + "58": "35055291447473077149257142781429556079981892410110587627461981785180960067866", + "59": "27099544121785566071163804026757738834751009441787367088902224089246104816217", + "60": "21168488962979702344414435570748821232449040113325022888730742258043507028405", + "61": "47670895780436930537707698149600870156430827387591564803827756947402825569930", + "62": "2796943212009229214673244125547912349110865240615935726835249132294761701941", + "63": "7918403660682730431927324352637792984964501341438814631906703645998903792014", + "64": "32683555564922264902143485015196964126056753474964765939073261049223026516501", + "65": "13416403507941528912250512177702720074184965506688177765950834406754453210568", + "66": "38787375715048970217010351389657525454533757158251583363414573878811191758526", + "67": "46406132564233381384920233542963075657760887680299224559198572377706144536577", + "68": "30201327076396983193347672435573825141534190996210192641635524573209002434330", + "69": "38470913765980546510790377478989823683444782719827572704647142504929737797128", + "70": "8710830633971736968251063972026569291314211937138214596925867734113744983382", + "71": "51635308733343782767757203821132158717542520956470118440081593984226660505683", + "72": "35111823997307573390460048516833474775712674889514381017874831449584379582888" + }, + { + "8": "47243220277698833471015254898637347454251185562478899555091300893763258028047", + "9": "8243974426211538876293303623200560035066241578484222645549337864355769865714", + "17": "35753281650589313277916027679100295404172942778516185577729940440139352836419", + "18": "9259582600886362769481827375836131869105239379778883891141987580367075134393", + "19": "29981597438823859939466723942744826218114417755989468256125725524407793243774", + "20": "22312145595378893700768658040811439267191953617564635887168459279618419242257", + "21": "5867642351631536446759725477121888438313306790629166425854944939424138973122", + "22": "27098358929517061869625197260088157427608148730829848243811996356232553082321", + "23": "16834324651117446450165067155338805408588901766665506928405923222856431938642", + "24": "17298073762477581877364860706591901810542425873335864077550501850278434142622", + "25": "12037249023435732170184209807432619304498840794217103418589735249047218871493", + "26": "3181020716170859097540547838959944006626031705270319996004967124826549090969", + "27": "17781686835207919599585810720566170329306530865045761156547537736683428551080", + "28": "51941484148067375997866747446931539105192711701407190252232160267335761301412", + "29": "7489673271837490182789358039350096023427825703024801048185070670895404924066", + "30": "3907579838743584409958093303785476260017204807396417569337856543169879484166", + "31": "21075076992119857913850623118862014777023995894816306940493110664837107992358", + "32": "38235891154790918393335446804569557946577260871522836900765942459541810591696", + "33": "29936810038394571725296969625773123620944239304644813046480422643797810112659", + "34": "217994193513737089409142763083789895417488706728776932609384121350966357361", + "35": "40898219428271929914351941203738636146520231121700365515209151268403779174920", + "36": "47459237075560332005799961602575693001909229593163915805718197384719480323191", + "37": "48327483084822495283954080408206807841698175334072661443963417289986719450214", + "38": "36782233645253568102765917377050447530457849428368596611273961597628132521398", + "39": "37634976154874343238215721280154319193076553860277561463046930132488462073469", + "40": "7972019709542345445279087031195378359793098710912805963748363070223772253028", + "41": "42418789697006063516272108492249946118906326751731019183082202096244000602074", + "42": "46471439677461303032212982904325950064652698328277231399699269860297479127703", + "43": "46998646059536181931373864169001842044624587657827331656636560335741351375404", + "44": "20674784676465809326856872359482918330570894730159529877565340367193451852433", + "45": "271122167183541825321063442777951432227838488571201893269174818582256338528", + "46": "43943900450567088882671166199242994865306857145774175795372664939109802702220", + "47": "6284689468669922184638388419520479719355511004216031485279720741017903130877", + "48": "26272590023527093020551254843124272024832158578849723296810881058320050059531", + "49": "31755520930078855101389525371809770069283632553671010191293737005498611404767", + "50": "34765590823308491140833186440271545220955524382248519356128677338541128184118", + "51": "3709347586985707769704509504551513706549002050805892173738811379056521013973", + "52": "50580129420050487328388312421875582906381446872667202393319555591465955901729", + "53": "24681572285006872002730724904235000975404749797845938520421730503346452098040", + "54": "3329893445409767033123236299908381477423781365602680397086943637883353195055", + "55": "50004654704915906776318807637309235025737497578775770826651152717037326852408", + "56": "35194064271464360952288733304634610922334494445630274522824825929540289229638", + "57": "46929265209732684878067870982099214005397692550211076446386119799535926147217", + "58": "17380583727653113330190597726756409757708660090417050195141676914757621116647", + "59": "25336331053340624408283936481428227002939543058740270733701434610692476368296", + "60": "31267386212146488135033304937437144605241512387202614933872916441895074156108", + "61": "4764979394689259941740042358585095681259725112936073018775901752535755614583", + "62": "49638931963116961264774496382638053488579687259911702095768409567643819482572", + "63": "44517471514443460047520416155548172852726051159088823190696955053939677392499", + "64": "19752319610203925577304255492989001711633799025562871883530397650715554668012", + "65": "39019471667184661567197228330483245763505586993839460056652824293184127973945", + "66": "13648499460077220262437389118528440383156795342276054459189084821127389425987", + "67": "6029742610892809094527506965222890179929664820228413263405086322232436647936", + "68": "22234548098729207286100068072612140696156361504317445180968134126729578750183", + "69": "13964961409145643968657363029196142154245769780700065117956516195008843387385", + "70": "43725044541154453511196676536159396546376340563389423225677790965824836201131", + "71": "800566441782407711690536687053807120148031544057519382522064715711920678830", + "72": "17324051177818617088987691991352491061977877611013256804728827250354201601625" + }, + { + "89": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "89": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "89": "1" + }, + { + "90": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "90": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "8": "47243220277698833471015254898637347454251185562478899555091300893763258028047", + "9": "8243974426211538876293303623200560035066241578484222645549337864355769865714", + "17": "35753281650589313277916027679100295404172942778516185577729940440139352836419", + "18": "9259582600886362769481827375836131869105239379778883891141987580367075134393", + "19": "29981597438823859939466723942744826218114417755989468256125725524407793243774", + "20": "22312145595378893700768658040811439267191953617564635887168459279618419242257", + "21": "5867642351631536446759725477121888438313306790629166425854944939424138973122", + "22": "27098358929517061869625197260088157427608148730829848243811996356232553082321", + "23": "16834324651117446450165067155338805408588901766665506928405923222856431938642", + "24": "17298073762477581877364860706591901810542425873335864077550501850278434142622", + "25": "12037249023435732170184209807432619304498840794217103418589735249047218871493", + "26": "3181020716170859097540547838959944006626031705270319996004967124826549090969", + "27": "17781686835207919599585810720566170329306530865045761156547537736683428551080", + "28": "51941484148067375997866747446931539105192711701407190252232160267335761301412", + "29": "7489673271837490182789358039350096023427825703024801048185070670895404924066", + "30": "3907579838743584409958093303785476260017204807396417569337856543169879484166", + "31": "21075076992119857913850623118862014777023995894816306940493110664837107992358", + "32": "38235891154790918393335446804569557946577260871522836900765942459541810591696", + "33": "29936810038394571725296969625773123620944239304644813046480422643797810112659", + "34": "217994193513737089409142763083789895417488706728776932609384121350966357361", + "35": "40898219428271929914351941203738636146520231121700365515209151268403779174920", + "36": "47459237075560332005799961602575693001909229593163915805718197384719480323191", + "37": "48327483084822495283954080408206807841698175334072661443963417289986719450214", + "38": "36782233645253568102765917377050447530457849428368596611273961597628132521398", + "39": "37634976154874343238215721280154319193076553860277561463046930132488462073469", + "40": "7972019709542345445279087031195378359793098710912805963748363070223772253028", + "41": "42418789697006063516272108492249946118906326751731019183082202096244000602074", + "42": "46471439677461303032212982904325950064652698328277231399699269860297479127703", + "43": "46998646059536181931373864169001842044624587657827331656636560335741351375404", + "44": "20674784676465809326856872359482918330570894730159529877565340367193451852433", + "45": "271122167183541825321063442777951432227838488571201893269174818582256338528", + "46": "43943900450567088882671166199242994865306857145774175795372664939109802702220", + "47": "6284689468669922184638388419520479719355511004216031485279720741017903130877", + "48": "26272590023527093020551254843124272024832158578849723296810881058320050059531", + "49": "31755520930078855101389525371809770069283632553671010191293737005498611404767", + "50": "34765590823308491140833186440271545220955524382248519356128677338541128184118", + "51": "3709347586985707769704509504551513706549002050805892173738811379056521013973", + "52": "50580129420050487328388312421875582906381446872667202393319555591465955901729", + "53": "24681572285006872002730724904235000975404749797845938520421730503346452098040", + "54": "3329893445409767033123236299908381477423781365602680397086943637883353195055", + "55": "50004654704915906776318807637309235025737497578775770826651152717037326852408", + "56": "35194064271464360952288733304634610922334494445630274522824825929540289229638", + "57": "46929265209732684878067870982099214005397692550211076446386119799535926147217", + "58": "17380583727653113330190597726756409757708660090417050195141676914757621116647", + "59": "25336331053340624408283936481428227002939543058740270733701434610692476368296", + "60": "31267386212146488135033304937437144605241512387202614933872916441895074156108", + "61": "4764979394689259941740042358585095681259725112936073018775901752535755614583", + "62": "49638931963116961264774496382638053488579687259911702095768409567643819482572", + "63": "44517471514443460047520416155548172852726051159088823190696955053939677392499", + "64": "19752319610203925577304255492989001711633799025562871883530397650715554668012", + "65": "39019471667184661567197228330483245763505586993839460056652824293184127973945", + "66": "13648499460077220262437389118528440383156795342276054459189084821127389425987", + "67": "6029742610892809094527506965222890179929664820228413263405086322232436647936", + "68": "22234548098729207286100068072612140696156361504317445180968134126729578750183", + "69": "13964961409145643968657363029196142154245769780700065117956516195008843387385", + "70": "43725044541154453511196676536159396546376340563389423225677790965824836201131", + "71": "800566441782407711690536687053807120148031544057519382522064715711920678830", + "72": "17324051177818617088987691991352491061977877611013256804728827250354201601625" + }, + { + "0": "21143091624051898429049779202777783090616631078773674742631481136382890245166", + "11": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "10": "49525108357280539459569165668684164497620522385376616561300824389215851676972", + "11": "32708508311735022941325600146712381710542921827904536994669574389708558585369" + }, + { + "10": "2910766817845651019878574839501801340070030115151021261302834310722729507541", + "11": "19727366863391167538122140361473584127147630672623100827934084310230022599144" + }, + { + "91": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "91": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "91": "1" + }, + { + "92": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "92": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "10": "2910766817845651019878574839501801340070030115151021261302834310722729507541", + "11": "19727366863391167538122140361473584127147630672623100827934084310230022599144" + }, + { + "0": "10171452642243387955781526332645193123346266850900972162093561209595357586423", + "12": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "10": "46659190381000641016999143094135733593911872198348198329939611371656852828168", + "11": "44087700254192067928964146508732085830934444379186570650215212783609639205945" + }, + { + "10": "5776684794125549462448597414050232243778680302179439492664047328281728356345", + "11": "8348174920934122550483593999453880006756108121341067172388445916328941978568" + }, + { + "93": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "93": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "93": "1" + }, + { + "94": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "94": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "10": "5776684794125549462448597414050232243778680302179439492664047328281728356345", + "11": "8348174920934122550483593999453880006756108121341067172388445916328941978568" + }, + { + "0": "3855895713134056811998624598511873826580243324673003091901619068671473231435", + "13": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "12": "49525108357280539459569165668684164497620522385376616561300824389215851676972", + "13": "32708508311735022941325600146712381710542921827904536994669574389708558585369" + }, + { + "12": "2910766817845651019878574839501801340070030115151021261302834310722729507541", + "13": "19727366863391167538122140361473584127147630672623100827934084310230022599144" + }, + { + "95": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "95": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "95": "1" + }, + { + "96": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "96": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "12": "2910766817845651019878574839501801340070030115151021261302834310722729507541", + "13": "19727366863391167538122140361473584127147630672623100827934084310230022599144" + }, + { + "0": "13528768565745931233460851026527843568952293200662922221190432010518079703355", + "14": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "12": "46659190381000641016999143094135733593911872198348198329939611371656852828168", + "13": "44087700254192067928964146508732085830934444379186570650215212783609639205945" + }, + { + "12": "5776684794125549462448597414050232243778680302179439492664047328281728356345", + "13": "8348174920934122550483593999453880006756108121341067172388445916328941978568" + }, + { + "97": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "97": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "97": "1" + }, + { + "98": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "98": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "12": "5776684794125549462448597414050232243778680302179439492664047328281728356345", + "13": "8348174920934122550483593999453880006756108121341067172388445916328941978568" + }, + { + "0": "6443318563434187156482979037576690662213493094314678699384407936675395356263", + "15": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "14": "49525108357280539459569165668684164497620522385376616561300824389215851676972", + "15": "32708508311735022941325600146712381710542921827904536994669574389708558585369" + }, + { + "14": "2910766817845651019878574839501801340070030115151021261302834310722729507541", + "15": "19727366863391167538122140361473584127147630672623100827934084310230022599144" + }, + { + "99": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "99": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "99": "1" + }, + { + "100": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "100": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "14": "2910766817845651019878574839501801340070030115151021261302834310722729507541", + "15": "19727366863391167538122140361473584127147630672623100827934084310230022599144" + }, + { + "16": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "14": "46659190381000641016999143094135733593911872198348198329939611371656852828168", + "15": "44087700254192067928964146508732085830934444379186570650215212783609639205945" + }, + { + "14": "5776684794125549462448597414050232243778680302179439492664047328281728356345", + "15": "8348174920934122550483593999453880006756108121341067172388445916328941978568" + }, + { + "101": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "101": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "101": "1" + }, + { + "102": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "102": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "14": "5776684794125549462448597414050232243778680302179439492664047328281728356345", + "15": "8348174920934122550483593999453880006756108121341067172388445916328941978568" + }, + { + "1": "18391027390011658052434319788313832985258800726793609915693141529846616218392", + "16": "39976218779278093542861309592985538942815568401541314690583304734527154574303" + } + ], + [ + { + "8": "49525108357280539459569165668684164497620522385376616561300824389215851676972", + "9": "32708508311735022941325600146712381710542921827904536994669574389708558585369" + }, + { + "8": "2910766817845651019878574839501801340070030115151021261302834310722729507541", + "9": "19727366863391167538122140361473584127147630672623100827934084310230022599144" + }, + { + "103": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "103": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "103": "1" + }, + { + "104": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "104": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "8": "2910766817845651019878574839501801340070030115151021261302834310722729507541", + "9": "19727366863391167538122140361473584127147630672623100827934084310230022599144" + }, + { + "0": "12274216425815286338344348482336276117995066724093487299512262174649563976186", + "8": "523275527750387873590246815039557098366775355168517172710947678319526243896", + "9": "29863921153103613859282946949144467702712859644865163165806334700261602539917", + "17": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "17": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "17": "1" + }, + { + "105": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "105": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "105": "1" + }, + { + "106": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "106": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "17": "1" + }, + { + "0": "1050758930252644049914605206403427631313247657935800041327915318465466974783", + "8": "14647793870698006663788078479891969955203674662705784514362579274748145255342", + "9": "44013170922976527852837802860940497245253994239591664654910384441309179470950", + "17": "44618527102236044714623041959177328003816642867354995233005889480954713736162", + "18": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "18": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "18": "1" + }, + { + "107": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "107": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "107": "1" + }, + { + "108": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "108": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "18": "1" + }, + { + "0": "10607585076226348745183629788245008577438579576330359487986117688517235408881", + "8": "44086260898869827729461696793073698695171266839028803560440724451968694562878", + "9": "45609318636240826618104404231943273075745914428284787965153199837375146018682", + "17": "34689122506791715776071270321964384164520116559785394498199709612928793950519", + "18": "20500302356120126646304935893371217543220209172169789961563086856428115597248", + "19": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "19": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "19": "1" + }, + { + "109": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "109": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "109": "1" + }, + { + "110": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "110": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "19": "1" + }, + { + "0": "20509009694313778489858884111978287368685508463213168251197030962719682409205", + "8": "12607992335172491240600546551739327470767846536047868017918750947802282287335", + "9": "31066938295670410723054688528383889966878843405893792865037517011432310377109", + "17": "28444766044878297851939071031958436774401690490685803415980417810351285288175", + "18": "46992068175337004244612270242884504024052307296766029016148008260534360879369", + "19": "30998169063668865873788972002963240699852520757570395930308332452580097054007", + "20": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "20": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "20": "1" + }, + { + "111": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "111": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "111": "1" + }, + { + "112": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "112": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "20": "1" + }, + { + "0": "4563680725198793251172562411623420668869330885202539013185566348548255071635", + "8": "23438669612988967744394891095824517659633044895292482524073888033526829516987", + "9": "27332645648899331453309944209892012570458875279051683414008536707518527791934", + "17": "12756820937250441106229187825805449016933357428518379195050618891473007065071", + "18": "13558789015118527713957930658666130417146533292655698478770748946628830945170", + "19": "133745349276713264300556318422135592110994373519420655612344503638515360841", + "20": "37362060064797730184705915714627896388964928616834195472855686100461021030130", + "21": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "21": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "21": "1" + }, + { + "113": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "113": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "113": "1" + }, + { + "114": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "114": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "21": "1" + }, + { + "0": "10132793020925051358967312895903080509340240497490871556356344077873835967889", + "8": "52054038910215594550350530851443290570393185222311899738807668115885166480748", + "9": "21931046423993759091296806349383041916752643429514287099782135231963611419871", + "17": "38509896658554346735701809271368460008849036093648740709803418559671241746918", + "18": "10404084851932792103272289385895210754252900162091158424484943133514023472134", + "19": "44197672073455331141053970220012513759520245384805484238044711836794287013028", + "20": "19111610154350099526360715550060897883235808614222370357672419532172792868954", + "21": "49197749829697731916730220414012305162239148718896561097266732704587314877562", + "22": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "22": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "22": "1" + }, + { + "115": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "115": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "115": "1" + }, + { + "116": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "116": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "22": "1" + }, + { + "0": "2647212931513679432767054030363504863222540192567519779190979594289737202550", + "8": "38265739260659547545823878167336804938380457069528607389540990840187913625048", + "9": "10977316254521966142079585524801037072517021878534582944038349171363363010424", + "17": "24670164380422293972563714110452662424227945793854522951291921694212727913657", + "18": "13428317419311691864066108855224782671524209281113452406120194086612645933003", + "19": "1306729606245615638105902628288325102878471788441872534753886762054758749285", + "20": "42459919049932035097624789991134573942266120535137515909226761181108272964659", + "21": "25996860871921503911544082043813396243054833166873924304909577117740333819085", + "22": "47042174649050522390501748178762639544653448991838551088262477161887058505704", + "23": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "23": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "23": "1" + }, + { + "117": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "117": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "117": "1" + }, + { + "118": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "118": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "23": "1" + }, + { + "0": "4359886051856780224292971980741406425492649906224296730054335077893394909530", + "8": "25049770149452949374467751744953832674825149247215267735945993077948422051037", + "9": "38513659637705165414771786174460269397288080548044442743384172534373206325937", + "17": "52122341676622476698989697463907931856383406157792658408512797620781224506873", + "18": "9839492682569537610819765512504521947628538257548325302727677139273265827420", + "19": "18655316350694565641464950746239354029108944720339362036628705957794260437160", + "20": "13600593241380128370270779462252518827942753136846635056083174406395864726952", + "21": "46866975249348385204996497054439891787355641311250052516740548639217601140643", + "22": "18300223650325421706116599425722186640066050378465269788761004957205339296481", + "23": "1108292025407625726051905408276804397965195841607222412643343962994880725416", + "24": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "24": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "24": "1" + }, + { + "119": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "119": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "119": "1" + }, + { + "120": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "120": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "24": "1" + }, + { + "0": "3054847578866604975257033821021111653343035155943751913629683293137065347688", + "8": "1571814154268717365911099353068294390185480398602746730473175244831011913749", + "9": "40944618482791468333288891986527612484118332155090636872070947106473911680823", + "17": "26544098650097602827530483799155511251841273545311750035204314985181742249889", + "18": "47789569197925979394558652231068257823414656437532033330332972750615121224973", + "19": "11766554378928597063804608229791574923485243610554158815715421873522134958138", + "20": "32488380112214489255202140173040041641682802662141975501481890469994212878140", + "21": "43944567479141735733084647695553977221103054591511189509433824240395745824912", + "22": "32142445010587398401940223855151394061997208110235665894288758048966534773810", + "23": "19708456662923868506331135265189148400623717017138247198937389688645833119818", + "24": "8710199628819774376887170190660500058809235533705819821767327029930309306060", + "25": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "25": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "25": "1" + }, + { + "121": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "121": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "121": "1" + }, + { + "122": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "122": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "25": "1" + }, + { + "0": "1596959724864208462318973909411993812742702283705404297188991879075781032285", + "8": "597586323079623342021154412625898051176897679340023864083676874051668511934", + "9": "7856192806994717731873545182397730487544363372736958983631501652418019505935", + "17": "50264507679943839576798439730596962159743072300230863395483751916788544964520", + "18": "34744287446837256340485864020734126794481742487713181744756072870918865035221", + "19": "31536751286981380314003196150422144896562966034030808672985938732266457747648", + "20": "7011128262576212572413596762500166619168819400050749490847811724813985822562", + "21": "34393510166785394575647698404563761511600361745324455861299096957522581151882", + "22": "2539820945593229936033516859775882239362549663900519549445893129215823354926", + "23": "31830160268950011988415843485889916909435506750195255746749797547385071335706", + "24": "26163545989402538687163581171383833840715572972843592035966208808229216185106", + "25": "28655945309801649476497566762368779734248351654321856351044823474760502562791", + "26": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "26": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "26": "1" + }, + { + "123": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "123": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "123": "1" + }, + { + "124": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "124": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "26": "1" + }, + { + "0": "9261998448432672939016143689737142959950360294646800435636112732010430895748", + "8": "29187660716279070466787210448535577009279255682815140908027674703152603353097", + "9": "34127721494573460562626390511713334078644561604752937144809917178660613681772", + "17": "35579634117589868096465119861802472339972768591256890404363690519067366418412", + "18": "11775947800468834411936124909313979868489795258570487214954130629687446250427", + "19": "26757645007250378196609692159012133165990312145599643459296878881105757930181", + "20": "27665572361398849436113159412832395956213860747776629163045867949595935146953", + "21": "8605886056650093142247183627154593698747475493192517229640802595075646339512", + "22": "11827601560949004328045691063904382330623155862780950862428796047012317979804", + "23": "17140429297242487508373023503976741370501964850620935389018442218477773274633", + "24": "19197190215986596441799021031587930506996378487446902302730638321380074945023", + "25": "40294901855215798913817067541369435026574706677301803503482667829096473569933", + "26": "4428148813778707766160807786538068971023325871880931422496658130186965151085", + "27": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "27": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "27": "1" + }, + { + "125": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "125": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "125": "1" + }, + { + "126": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "126": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "27": "1" + }, + { + "0": "21811458719499960186771214587366397959723618323848154217660010569954685810715", + "8": "34401610499586966881619461335030210072479838401278499810788565707787185255455", + "9": "51165492728394242983663379841727284624200596842151612659217220816743963203538", + "17": "7957160447300388165441996578337445694734798230657804121629037002580485804588", + "18": "3112296533843222836687174985460829512830498821936912945097238271636899007951", + "19": "29763270315477331916450274239517016674168147839226194069123460836065020823172", + "20": "24045372628603965531640755160668422831271597757979033486858224704815861441342", + "21": "32656267590793163554518363289836788062436883137510286552200807360270842252201", + "22": "43240951980381493526299749711619611481213013101865296211337817937016731143926", + "23": "24343674894502055927091066748288339464015196069594062903545488680302215556884", + "24": "27993811030819184317552970940800960241497363672173730398321464726334293958097", + "25": "22152655807744473877336354872503231583082965085782926063629967178853133089546", + "26": "21983049277506886158038474252140360350322964821609907598656506573318739437848", + "27": "21453047890104560453118921752650875921831568987001062676099051267369559909495", + "28": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "28": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "28": "1" + }, + { + "127": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "127": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "127": "1" + }, + { + "128": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "128": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "28": "1" + }, + { + "0": "3239076967784329489572444293576130919094218653342995300018245457598795548917", + "8": "21029159653293094852701089505851760414211005952802290736984732909843171386992", + "9": "6099653689013781554444846056378306891303416933883925215025255810832583578247", + "17": "14966059711859970165987342015410695006396269680549529458279318356656676092078", + "18": "11669683921054668546877318202199638349464737070388825019929787329418089991121", + "19": "22936347808378387795366137433807865747318828653532980672336704756330391161390", + "20": "28520175517985735849599910603135742858821364584281742893610499563740602141349", + "21": "1972317795414592831264440063142528198019547091539219716133346020110636874516", + "22": "44725062420632732927700594162692920449497607746903752529035447992870531990083", + "23": "18245339776025151066698543282567574090818306067639678467857056028416982921995", + "24": "33666071778868081577534013820928639052489491575650584804439875006850755630775", + "25": "29006803614327437572794885934940680170158140010867839314591082355351172926441", + "26": "26664354854209176428562622367752563855213297208751125047536148861356830877014", + "27": "46540170169284300712416130581131496192458354284627871312157958099560592800520", + "28": "37552166768553729842078435667515655279661905811024726972391043179629665575773", + "29": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "29": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "29": "1" + }, + { + "129": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "129": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "129": "1" + }, + { + "130": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "130": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "29": "1" + }, + { + "0": "20462520400712402627709344205131902699657125916001693532154815488581362749475", + "8": "3286079220927218273323471015859387401808211963700847942237991184532915331062", + "9": "2343353509527431221332805874580459769477254227005869364491719637404275393556", + "17": "15835679397455681978852345178921585571770478820469628643245691677831111209106", + "18": "25968359525593086699828741390841462213842557620921661117888781513811006682992", + "19": "39997221789469405004859238830109971808117973193471679882930960070408268917550", + "20": "31156624005995695462950647443564568709839806438278546285750322523829652149710", + "21": "48034682423002979598595735627082470964414057999025019120237307914909210515445", + "22": "25682390162004926648126512596702300684563123040119082981667172060065342954604", + "23": "44102610159658350122248945998262639117012424368083906748594985507669525398290", + "24": "32726117160370677784865534342031335354951857703739264647854242975769839117872", + "25": "42972349808106017539874972881902782760034769830822810182078396041017049664207", + "26": "20250495254710141779242865554672450483083674839617623855788372037336087569162", + "27": "24649455789456834061394228559949696511291535147962937233602998410882693391013", + "28": "5273471053396930295336690560480093058729058663067686078914810556193817947632", + "29": "20828928976331033411088404076326953775690739983590058821574144317057361316145", + "30": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "30": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "30": "1" + }, + { + "131": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "131": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "131": "1" + }, + { + "132": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "132": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "30": "1" + }, + { + "0": "15540512546148021086829191867945740637058588949955294856096961322685397103557", + "8": "10594000682191512671561842596850404768915215951390201064000301330876956225481", + "9": "24273899499008308828010116107035952946652360552962421411901755620677425559520", + "17": "21652127980743386179775703988143498909493671094413131441765583886616678127316", + "18": "7618365555867366171095384948441447746830408002681924780236233228087176595746", + "19": "16755497111647544518527337728294241483321161788841150515946266621678200849447", + "20": "25703243218349343715292199910244143742862242078796621739382563676444918929261", + "21": "23660236320146546117199432747642895528957581325887281208357215695199920019617", + "22": "2357711090522289546598897234729386613974028245803311836473732510536217990527", + "23": "28733109390173555215828644728966016814697501232510340716340765521737962277261", + "24": "44996841128396863114245258798635116637325455782740466297389023640723938426165", + "25": "6599789027858686808158438761231663258872408335820355159742928007712988636038", + "26": "28875710406631775034784952874367371890072865222379164063203700341303660516619", + "27": "50284829871210718242517076663473729011651558626688537645367329442091428271822", + "28": "1762353919069896882843960674301272407929198385872696572475666081553308159800", + "29": "10472686281706988856343297719402448851837898306731319072661790133137287988625", + "30": "24651292315699772044621115381931231967266843563921217358063230858396457193949", + "31": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "31": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "31": "1" + }, + { + "133": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "133": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "133": "1" + }, + { + "134": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "134": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "31": "1" + }, + { + "0": "13865340336144010740428645313739899438060242120535852433410522037321843803156", + "8": "14528663677549217700800129164589240270333099357676222217378864147671364079489", + "9": "11838001831142887965161049711255116731008938006723415752393105875928823923846", + "17": "37732396118242725888244754173643394832944788121742165982809199686401861287085", + "18": "23530732678750065385307338533592755450395924605310386851176582649096474639407", + "19": "50550572544129774267342194539641465324961602768578697715406753079042513781561", + "20": "15681255641087045917754868438779202436188948959404981614827002801118140285897", + "21": "14475111171075784286728374505417106731551073148221576213378864831472932847906", + "22": "21892317478647426493537220403009064189435814866706096421969697051020450471478", + "23": "49689139596570110748553740997039927421991030434841221960385634510364249022485", + "24": "24478737364037223335741847998307333115695913847075173158738694618639327321585", + "25": "23620509942094221335144955812663113871607773353773706235850667951902394330342", + "26": "1107509655449675373141801514668550306082947757353068871276916185101043394203", + "27": "21672129563678408258542791106266827495094250942223150056012336225035897917964", + "28": "40747714802267667523974000545189899228541863833165007357953802391444328469473", + "29": "34248378101069309979817762929920866414732447870225799199323440508751612246222", + "30": "35737277879488434066315981735687763550656392649338564392724059919984168272314", + "31": "47600411446882452507164335670385039071272755848488217750798424417826323267472", + "32": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "32": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "32": "1" + }, + { + "135": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "135": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "135": "1" + }, + { + "136": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "136": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "32": "1" + }, + { + "0": "4030925228209360989389332579897661669475428247758360576989046703985980534507", + "8": "14858100306733543830524509776306521753986490895213794511117380368819770756599", + "9": "44671304073227997346166121088379726371809129767681143691985426306899658342", + "17": "17765016743291917293348217143848029152268927397297485711988339683993251565304", + "18": "12964095691769142343773882903970457860146509467297206130486623695415961710194", + "19": "32583882997290336890435533681419785790048166306686416329629090622958600343611", + "20": "49880726576714371518407866641215833961753359214898505221320997746121053278085", + "21": "37279684032623107713129904363178895751371645527786470363426886665677707859510", + "22": "8079583818299097245587658691508156392962956495276449575816587971727797972240", + "23": "35071035289962475935149929989628309574094420629916270880243266104415759539645", + "24": "42412176687250432268065419865405620074868093565660661895808364766176954784949", + "25": "1304424358085773743635032637550606677479958615291705462427564388111328643902", + "26": "18123863706460350717772224518948997136960189165692162918421068438515605331180", + "27": "15247387742143107700869638004684331078239062417893832300017981275653423992029", + "28": "40795696217902147849441066156704542391211206690054538600804155824232978810725", + "29": "11710849920167296168107062606282981359033447704029463211736528472494482512845", + "30": "44932719700262148428290218524399144765364648952886442361660894793170415079845", + "31": "18553267487594477155394598359202706283204821239882196657466733946723748123074", + "32": "31873539077738869484715001286646541797062663060098859143133736285480854825686", + "33": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "33": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "33": "1" + }, + { + "137": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "137": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "137": "1" + }, + { + "138": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "138": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "33": "1" + }, + { + "0": "2580022244547148022781785697172503311467595214847728559144402326933969076319", + "8": "27181109173473107186592951733888426823570839381186649897096332580930062940328", + "9": "46873524491435198200626502287228048075211204246868986503104136165641791091000", + "17": "16379919815991409619844626114342202540154347571398347276443860490806914645879", + "18": "11215928921155056297718210586372702721892685907533235168022562517029343843882", + "19": "1330974974779279136429085649456844951070467436753555818629827501355776171085", + "20": "32238479736710015534064993383806271116202583408359114092914087949533985207602", + "21": "41437026133774595801694975208558376439021336104883292767726661373231785547566", + "22": "39025745105875015827336770743473543127798310955808271568591940634510927401951", + "23": "18721971601977855606709983187995720067291812077544760484198819854632075982187", + "24": "48004104043746425951168520121815459983414955463778911459915037961735580717718", + "25": "28972033817708454024422908480199183522160189472616183084578941864288748112462", + "26": "21345098043036376894019519366487490654696740986373323407488281376162220863865", + "27": "26246535916519084883477629318090541703747049200756286242386224261745288927184", + "28": "25179221006167358111653074356355845330978933642545584176962297005149820651640", + "29": "31629172517777438013855581661549792417351427250750916176635759848538075124917", + "30": "36614856766820819896890097301420229891251179730422633418135500946732781252415", + "31": "49079342121772723457703921427965310366784818866056592450274390639804540556053", + "32": "41479607759050823926556936572770111002182672160916287369425357901766050133984", + "33": "31077921017487499812944246263959659803791987246355972434453375524498987390104", + "34": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "34": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "34": "1" + }, + { + "139": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "139": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "139": "1" + }, + { + "140": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "140": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "34": "1" + }, + { + "0": "337091914144357888262743136529662076143869414926179844835581507288841653842", + "8": "50723568755110666799389577571665792632962662873358369901279293864384186561143", + "9": "27381029524956830770342921432213488541773610786265562701437276274030509756474", + "17": "25157163025006675813840556669981528186049170754748173478938770434777396816988", + "18": "28220291531884295875085884990996904875205766936954026921709458393824277943310", + "19": "44224780248686618407322042303949308702686705189457533519373292643528805622645", + "20": "34788159059940347861135457423000269516445375584087753308537484728309055205449", + "21": "36660474990137303773157128866616209618111858267312087687536945007857245393990", + "22": "50291588391624888429074352082114698989490083229359406152520519227161145955752", + "23": "21842326528100635611925738545930902265606859755888367305503773667640452131595", + "24": "37760017257082409198026431670079351419967799140801543277979178371853586471369", + "25": "19711495222248109494758541085854341796257284924339506972066620427354960872585", + "26": "22749383682185903339974801655701739973700060135585844052178901866256719745285", + "27": "34789994377602427233110181307437542598456534172351365146979293543752814588779", + "28": "13094345979130343631637511943758586092439973481034244383319185982296702999440", + "29": "15337830510875330083847337164522713022265707297957458492661512584103490730001", + "30": "43396174188327815553236876768678164070817193476535712490535348655096541012031", + "31": "41879290867236239830078484326818488917092697577902934320004706674829159970527", + "32": "43709028298909923903233945287688330015343407681282869080265270326641824875177", + "33": "51861947707730949692802647980976865874872943600377291169311749144625240692366", + "34": "8949707910887086829156187647044449922875040275018614353774963009243352703273", + "35": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "35": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "35": "1" + }, + { + "141": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "141": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "141": "1" + }, + { + "142": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "142": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "35": "1" + }, + { + "0": "21128818615001540137263856211467089199630793116539340697922423416110745118506", + "8": "13845169169543960551325081618817383129322270258184351988862082266238056066234", + "9": "8226205125048119476598120382361959897256221918431931751979010784270410275891", + "17": "38906599262480486164096033254986152016544272824787712454349266670064444981418", + "18": "49524041899556842462282581562545444136513978713907354951476349361407804036311", + "19": "48901194030454629608041684006494516246491574008936092961415478070453381489887", + "20": "47017488196543169375853198988631926012157609120078177171042041709223045158498", + "21": "24704598254494170906978985158025975987627976205595592823858779473094965603342", + "22": "9235527723173510533028272015275429216226938838313413125926991336173069828382", + "23": "25694322235152318296973156623042105963668059641399971137993098938512850741569", + "24": "6430150625281502499263367545623485637542997100772161154937808907917540064794", + "25": "36818399479123338381126843754845473358867253932349754618057690777012487995222", + "26": "12026308592203002671755915770366143632281549246146936315633345713513495626039", + "27": "15027531273239294548135408743811046336953236319381205820053392255603275101761", + "28": "32209254178022292255523713989810816367286658061472011291723236143902874517341", + "29": "32631081872689453428850131044174664754415433374321656372630646887155927531161", + "30": "1687826072397159240028492639840412160099394262930722026586109382335944438145", + "31": "13644809454034025291462669073548153801222969383556126452124682748451034061288", + "32": "28378004937887085466224964764108652218018754514582192794350310994650993308245", + "33": "38336552971616893359511591087441539361256363627353678656085081581112517358916", + "34": "10616810266955583517128484139187353572132153666289449673663128542986554461416", + "35": "42178141075323017166567164113145783395347919199890554609075192669801121474907", + "36": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "36": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "36": "1" + }, + { + "143": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "143": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "143": "1" + }, + { + "144": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "144": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "36": "1" + }, + { + "0": "7314289664170998780822250984795805793842874757314808790503348444042779760074", + "8": "30662043156597574790057014846962168542122497721087294491438631696378782227484", + "9": "6488437480145820551431940315431694795565037465649971588553196450940297368277", + "17": "49813802759714230353405816804126837960809128426019442477297038364407471055193", + "18": "12517256310096590504853274600996957800188381529902527165118665831865424884325", + "19": "3079999161275035619855647255162768679151481673673206924605948290605869361282", + "20": "38160797019872468074970542291721311411185147474986686063412484101066367780996", + "21": "5277882749044928939030434407454708831407032006908971901866230098567169953986", + "22": "28697072126854734145391363710624207203902114564006887954633261484935914582650", + "23": "48579635183661323089798871550932517842869241978799981633144406563073340407994", + "24": "13552388601447211119872664938077459954366466316771215357085573378346771750855", + "25": "7544676925590293827155319499305944595115166818563932432061837869160142749267", + "26": "39701097489896980160555820140090032405804153322133866493612527491494076257191", + "27": "8832563016222880454812569305019351221709735174922622662818671036750521782780", + "28": "42750630213196396943917030570936433911208787315609504067186228862973230444057", + "29": "23497096521892953939825819131151357197272352397104394152594762199795198551054", + "30": "20758017408834418991609862867846704076072430843743186943621596868377820425651", + "31": "50536232266277788037039807491929537164213431138401466625614258399941441016136", + "32": "31218313643500738727668245785981366209495259120102650649284720166935247643929", + "33": "7139785482164772453235574425501179796160507201334608607359135451510956619769", + "34": "21426037128104978208428634291788170441480970374740082327269389698221829766951", + "35": "49826112753746887747948778170207209208712717450784818887368578292560647786861", + "36": "45239551344620027413844232442148888764664155410237779046456427596526516401713", + "37": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "37": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "37": "1" + }, + { + "145": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "145": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "145": "1" + }, + { + "146": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "146": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "37": "1" + }, + { + "0": "17774049587694351616089815110956846453850106707275621110789201687277957820281", + "8": "11850879631656382017697575928125109153224599045215266929537827948998316762935", + "9": "30232256179014136090139975203662404632649090238744268830894121143745141062215", + "17": "29242549176650905843987268756578212698779552564954022595678629296459076816962", + "18": "37306561170878606140625331462011722616894127953732802260861353333403823943119", + "19": "22146354924546398933803212205358772400522488608603479059166957231321700290340", + "20": "21056352391025112863656294310438454807175015260686937517359604598039224334392", + "21": "13704796627622720731527881330357435065100578401998242636187743389482523710985", + "22": "5664689534756509992878435762488602169039148765158857723195653635520482094697", + "23": "6322948406265495834170924118212099318935348969238839867732296789678826291431", + "24": "4419712412905029863629157295207997565622761346624656165912705778637331410931", + "25": "41879071297502907542631800868601571246202948262922140738202733956669232495729", + "26": "5539920222027131258347851840485044060148951658459501473708228553401494090271", + "27": "6034211861305683142766877367290777028665117612565775600623624258474909659493", + "28": "38566821641000356042175751663373312299611234373543418708190468954267686638449", + "29": "12484257238020764278248486244494647925813814307196031258457529180134522717520", + "30": "12088770739118911904854912539240099012516172519206902495787529669677212134533", + "31": "7575995152049874141648958945076998534958559475728407379234922619731221024203", + "32": "48745628520490379445538824630341209839229824311092126125927789112873273510064", + "33": "14653310810396563398291495591422972601807358119590621831471857245357386800611", + "34": "22776226952437673635196492706144875987471929525928842515109504733197962000397", + "35": "40224303441185971055810341996542504167102054070463552370880570999456706479148", + "36": "10295064350542447578898388503786417973681429914299410609181650632091658646327", + "37": "18858277053094609957166923567570958423513516228825289463735088131328490411616", + "38": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "38": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "38": "1" + }, + { + "147": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "147": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "147": "1" + }, + { + "148": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "148": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "38": "1" + }, + { + "0": "11019693257420674975398059669532837767980992812803956883547482631461450651960", + "8": "16928277678457539924493636008939749436959266355469745961219654360226967844472", + "9": "31272499369987139069488356498241864545917741852811322857225556083384913250240", + "17": "26157339263080822056836925159177176817282458167818256859411195220746299363768", + "18": "37739682229216337513312114384872743771114286347750114321577922031861638568423", + "19": "28706667408894407595930033405124374686594522481996221525610673305918807929027", + "20": "9686910624990245879390164764173842737690126858792111117231271949615157241094", + "21": "21275802581959010754878487450494975466564908081680224992245190540696983218537", + "22": "1541638644456041256239739688853664780387002832732752635059619008643085956727", + "23": "21352225176308708369972004089606744818312330440918733898737346445626543253648", + "24": "10920606669198589431243693740300420744709350994791405626257801971811240909858", + "25": "14101170012663090398234447491860091445224108024064538147352028951872354341574", + "26": "42149286697789005626888552551469332441104296265015971110906263835316730464965", + "27": "43265524969980899902328903531277380451722695171875703865404860244414634947895", + "28": "23539510236848902708905675777211808654773168756145962429198126822344226311292", + "29": "36566296967485201076823316234644921892676701998290561546349475040193815853768", + "30": "7074490561651379315451189268597430431955983028423277252088214593382360289302", + "31": "27553902952833260856639181376624219269377712692931136828431127737552995267295", + "32": "17985626034133801121789741334690470221178497155863162704401703190061599938282", + "33": "32632206181409287963727907342521328247863471041335478524341221560497273911934", + "34": "42867432770536947951309983303740179308274109337679318841065170445443110439995", + "35": "19279362180509195546034568039438280697103471368061754165548486469339481548199", + "36": "35952703204886281564593944085704058268385563155210117348953529202575188173181", + "37": "2865156237875579677226096900280071780422451880687485768734854411802841039962", + "38": "36770014299349415561677255349936090831255773519943501154753537073496539244575", + "39": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "39": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "39": "1" + }, + { + "149": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "149": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "149": "1" + }, + { + "150": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "150": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "39": "1" + }, + { + "0": "8945986251101329707360666524341408357502651307257925367450947820355368214535", + "8": "19621957599858283039228942414831234334418543669744174167780883956126851745264", + "9": "11782529295182019304153434378211039374798107207551458210521069024226098915337", + "17": "49278758536456266448250434641644395437445817130976722165653129757070794680478", + "18": "43633802059756764926680859109607038522312580612087153378466366499937250039429", + "19": "32835346063310279740662961962148439418498078693684289598954528231161153602154", + "20": "26811596446196172505626896366057669134451858814980164707356948392719202417005", + "21": "18875579163824385203072996097698536623049403899538511519101453842279441195842", + "22": "12842036419072882223015619555077392569923678687719068677619340623146866809352", + "23": "20088418219834287471426140997943921812891137929012273574990725293301492007625", + "24": "31288287700170681476885182152424994678424833044313794480042136427974213500292", + "25": "36698767274083859448273317493988168946131111089883483865166818417722883061644", + "26": "46038392220063806307879075425263041079377330486123603950198620212776389942258", + "27": "23032405341825757775578463429128633955891923289454007280640185908198749001912", + "28": "2186688854759609604361452016300647084218833634450843622824488202522142264895", + "29": "45727295000394372337156038973578866544817779387166483606226723031940532856463", + "30": "20341199797792943554641051033521515418250074811232164043118791622765364537145", + "31": "35782365127887941991118638082089445024557233685616522140596732819867487273316", + "32": "48565143725360679749285030214373807703870519138359664475372562200498890597725", + "33": "10866552960921177324838233872013586107530388890430387178835984713886548409635", + "34": "30243336147172932871675464029427792437425092184946484793249386344719415489953", + "35": "16808846921184437640264982516275108527068129185823665379139680240363584732029", + "36": "47662546468052363058224483835014419669361605046434986215334456201714459787860", + "37": "310352617817380162711792202336770411324252279493429063578066374551155484999", + "38": "11935013315395360329901434478257972609774780647305602986025372919628917585160", + "39": "14755321404618334499811932496197107494510782350478032457581071181404951210635", + "40": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "40": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "40": "1" + }, + { + "151": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "151": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "151": "1" + }, + { + "152": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "152": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "40": "1" + }, + { + "0": "16600645183477638722007904287733521074791737381945794958827103590279914462576", + "8": "42314825667221233237103551252644362643241169551710964499188403709980641444856", + "9": "28227699328129887719001794074043836722927747605197280790703598355096308450470", + "17": "1770400685919935114818401647108303603064747177990157725979935477782847071625", + "18": "21840627590191711326340995799848952233700153485768138726013208940285812715794", + "19": "37154751456668767436688129068272332702690893803770635598821410155289651649357", + "20": "27671215364757217206860459697877057574591132801612199789856265575418820268136", + "21": "22629003087615824156742308679714307643960186523753129308462402343490024260161", + "22": "15756634907567765620811405116637788161196758865320028919380129821726602851434", + "23": "7695495109244326469524587084883257683119941243876328534898678676461121070251", + "24": "28765174347382233218157963896294260934321968382359379351961967530079420939430", + "25": "3390844913631200580785296647074137597117328556753398565746952446078751450437", + "26": "29594491183238071861591287655584547894683749568167079241274595681372336956266", + "27": "28913142760178868502173166118136685339224790086189785111346811232621189532728", + "28": "45832861973683163004894948677391515171904179441823510781756805122947314442567", + "29": "31558004927815607533973532986675246387525448767302920227379319447169914134083", + "30": "28028681106952368280944961917656853287140708870462904602587487006160033513546", + "31": "28907508224624220904701568806509798149998887253368752586648220390082805265286", + "32": "11610919656117098898729531747702941813925211479421781261973856161589172667729", + "33": "3231369469534854164266393753610546350768491779350919640154553933009579696683", + "34": "47169630653861250814855656637100662267446690330862589731663803506456155773321", + "35": "1452247855224159301983841270820901528408784252971929590282721646087721441821", + "36": "34677618128559183808305500928931160410323459304586421065054364094808869251292", + "37": "50493826240639096618686945080317734960716061154872562135852866956741813571169", + "38": "8817074993573976128477339618065802477287398014200413035703159730211889016320", + "39": "21978630713134704531716360243096572055955824692889309463025467261314860112262", + "40": "33725811018185567734055535291884000512942208143309228910982194679963823389667", + "41": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "41": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "41": "1" + }, + { + "153": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "153": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "153": "1" + }, + { + "154": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "154": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "41": "1" + }, + { + "0": "11176512602209691417636272193861235132071391793840565562361651389294061042059", + "8": "32926019421241766115886759857390645421406956354213986673502257002928118703355", + "9": "49322693414070112361358512281698665879647459215440267595469827738584492496854", + "17": "23885849599750960614195676552190104781624167550702792930135278782551959680912", + "18": "52027993194289789878721235717901002159062426489631176312815162515892383178934", + "19": "20662874286277103781593972467614217896771610380042762792042189495340567497488", + "20": "11024082539078060250302434570254659466759872833700654022273959674816033156069", + "21": "47900169680356514769473251177281839038424597295070992696786332498725144115126", + "22": "43128414037998903280225286555100738166628908168028202345158002838473899035005", + "23": "21873737877315362585111871031542075627401623925590880962326448593844173256594", + "24": "45827880819010052859682398093934267495546231911068322924583720842333110096830", + "25": "24708341089878163845604900673376650077518903274152284425587869564432263833901", + "26": "38249719634626947028774516518377519238907029494092586227875997773569916494095", + "27": "38868657591738799754450976530845541053781177916338697072279523785882116264122", + "28": "24666967491863823872268894608464430357570174118224274426374241769221722189445", + "29": "20948467994356262746790204439320110128618944925073494537213964454790641088716", + "30": "38488727835666536472587626179631781040410387452477608884818993755045121332319", + "31": "30599267710866281727840624159446152374249752767773192547878239672562131840684", + "32": "15807707260705186026934442682639374891852306650080608713250092557433280318851", + "33": "36757500844957109817886920806721144962967018390345783625309683336805947217031", + "34": "16195063003814745206853764524105132153073190480596855335367388375459538763071", + "35": "49955515121534659574626278012551066333081933898174102697619904729893950800521", + "36": "16770123621612585525700151395012787120342672139714596759240361110446120457487", + "37": "38732057274905822561165004373199701615249935934342560547372833408650701030003", + "38": "42037880624657949431082276650057149517219633097126345695858606280354618584649", + "39": "25523153092056605796472789240196574098233133459144651411703225514191886783058", + "40": "13208626618338019841673304812021246827423373161375018886007460504304112417024", + "41": "34799616780256086016754470315050336574258377279361730937204119314378252243228", + "42": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "42": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "42": "1" + }, + { + "155": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "155": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "155": "1" + }, + { + "156": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "156": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "42": "1" + }, + { + "0": "14889617408341048364135563212181036206522304313837983213620424531022449761460", + "8": "9821978372370396565607801129981669222334664256788905950789229827664602932480", + "9": "44862232445783687748726242704207292341327785797356376593676494830800916057931", + "17": "8001707016140060525533368639759466050815245287169753349367248364608803361893", + "18": "19434270661729297800095840105966764422631322265254599438375963928012041689370", + "19": "31037746839541599637614789781208480394244415226575855916289025913966388902435", + "20": "38086421464767233228206031579834479573435705416833136798931821388239851989438", + "21": "24515471995485056967766024106378888453007265452167891603007338553757952287356", + "22": "44335491948290344772488376733372694528692413586275385475595292284760762478234", + "23": "16105744552339749408775181532270654053409499087931502174638318673614801557613", + "24": "27062978657722122306789121226197958510515451476845272398605686330265121100929", + "25": "5520923236345478641996786741370818820503973997372831479955196634617592721773", + "26": "40372254748615791326162736375394137416565170834115680593886351983307326680263", + "27": "3313230171378708344916878929359553603690478115731810973246369027418791684592", + "28": "25168768161733154384401824521470485165397728927771272393402763957272848436196", + "29": "7254257427238599687012675713692488682283170336131220142956080989373488208915", + "30": "46529158845605654480670634214474125910620651936182760464285801117685844940226", + "31": "40165790948437272557581734132036130141153118107590583938048574754391390752399", + "32": "13766184923483059424872988105181982574114466203261560587617546353967345033685", + "33": "41314350190765687995272185097953747686249237407949200695918953887204610127421", + "34": "27436818555742363029176064996584252941471030296862535710006175920585573493096", + "35": "47817333641969328854732962986196346305893730082899700901100616340685751184060", + "36": "14655556891179325738020446357323826975238866008126384323263343552314900265044", + "37": "29841105892017310032127252269542861436562066344755093514110688347137715362628", + "38": "17301699307353836037259823782188805909487958290808515729827120876865150598413", + "39": "12218919189459031534444047442125277423180155681078368028325283640039624669329", + "40": "32273155224374158801770363506480180554531983962048253716369171577946453015556", + "41": "19189352981675128447190344166435719843207892852012150882908045445221584611614", + "42": "22639478768968659661961089202534664418483898785848419662908078854285901317920", + "43": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "43": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "43": "1" + }, + { + "157": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "157": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "157": "1" + }, + { + "158": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "158": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "43": "1" + }, + { + "0": "13725846858893036951158965143583678272726150787955443316044240114688865768260", + "8": "36711147995975920595872917053759219718988643029692576312671462774480141174686", + "9": "27172094241862832421672996325553855005375442296725922842350599103927202236425", + "17": "50539431486023871778126791939737628041642579364406999647288020791451610107862", + "18": "48015925587210585502497747531311096565745330244328620974852467179372687363617", + "19": "12694811585244082672882319007797720760771830847145535184152402024864247304120", + "20": "44433479935271094509501806160762352061113545734692252336335228153800612643096", + "21": "37386656397900222485002324306707781812485208262771064720704260799052224672522", + "22": "31206282322712029119630700061865260856303456354616137846427295407279117548273", + "23": "43763258151721165051273034133497210148902677599769646893855705295584896019849", + "24": "176577944156624346035173047433732315625625583936739762280238588418515483318", + "25": "40096303191267207628032101582573559356008900308432736858384083963295127729427", + "26": "32426050228559810017376986417514827877603720450503828415146126617938123435633", + "27": "7983822328991665313700416344046138157339466452182712542571151094949742362394", + "28": "656962417534521476066849282500450979079944508788912020618878626450111853800", + "29": "51458752810552025572996496677206893011249949517129489406190705102025798619139", + "30": "44370342490930171370758565971532021877479785502771011230219648034171740049220", + "31": "30212829044460511741571511887257717278125615814334995886433062816531420087166", + "32": "51462551491324820088567192406299811177339527385124975612463745473417906344511", + "33": "18202574542611783737362937477361408124277147541915626784961912224105659198445", + "34": "16506763906557014790524743957685465050643297150420689535701328289711220966002", + "35": "22538466767702464908481839631359603636701979452058713396181692050522590708232", + "36": "2889737371787126059259758513601934129969758783239892532255711969094005311856", + "37": "50387068289250485498381075697928834591329919392790185570508879491333962703881", + "38": "34607726097378365187641414136907165409176372467005504221209584056799351224853", + "39": "31286936081466490687047104501942782791001960334578372043308625198999889395140", + "40": "12646589838472978096138338501122514906520852391060195608825005144490511415274", + "41": "15608735804665700466643300779646889978518192296080682377287443381139223335371", + "42": "49993459431056528522590237504686568710210356597254656865859431600683266684920", + "43": "17161225510441542669896798530158788679153679836317295003128575350675787351907", + "44": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "44": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "44": "1" + }, + { + "159": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "159": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "159": "1" + }, + { + "160": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "160": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "44": "1" + }, + { + "0": "7031966701933394996335226463904734684231938370740242159297465282149711323302", + "8": "142012157162732790476712995405203508236839755439096208359662992891357920076", + "9": "45512549781131894787852726095630356935102934880792575620757067129369241134465", + "17": "5262593509101086771419549406334548268667695077124764692098655571429760875613", + "18": "4962143974369544789461484771893115416145749735198985940119059033798638683565", + "19": "26489941391968162577700795132149135904666886136198429518668309055258539820571", + "20": "5631286445105881041551469083518029532985232239958802797853191393969982129189", + "21": "16933341551246723932075808548395826172521797403020301719416223335719271499776", + "22": "15047808481617831302684792227077542378281757186745790146735777283855485797715", + "23": "47406587404723779473212568051089605220106692098616671654508754167495564631815", + "24": "24841980625906827075911289162239918083684419155029097953141657744254274520929", + "25": "5691167378968777327238142672202348693664591089695149053054740888775836413668", + "26": "20602960291808973971745409950139760614584745447700843206081823707441531906318", + "27": "26056642317876551124932757267109182497254717756225955270427164091195222966678", + "28": "7282735191207013916587502141658990009093363787239802764138135976059195221469", + "29": "46677591209305463328428007775592826718062206778083989246446546439705255971652", + "30": "38378418323519475723770544359600973357768683300447638132540759524233742520169", + "31": "42642949952483049707453255595597615279424296789275207664507626499734816035190", + "32": "47218652939016341317425777778014400780436768771128722468616430386170557150218", + "33": "13624129633543806012332981695804056963000035956067201901626310027831375170020", + "34": "35930755608853632707003306945556513160629865385051788381691419775567527806354", + "35": "45138358027759727736114240842907199493686963710834064817571156309429114137551", + "36": "5782365809987060486144015037645983854378634345782370676036420827593408852153", + "37": "2667579255481456752762628214670847533038342860232427263641149401076611056726", + "38": "28459610922089974098541159827694267186070956041726450257767444965924612436292", + "39": "39125557997459914703736221925330539592561246508548203277041418738859583645077", + "40": "3738880590785599133153406905368577425751147523729218981253385839886755679796", + "41": "3100785493698492171850829896449248633539415655759176279293995796633568408735", + "42": "11052236898562956832925465497615751865853367445834666626093853800894272646616", + "43": "28293801064931662160623436755904130864413208165510843867734909083982942429050", + "44": "11969561556661521394075796469760243514765960948235377349874003978124234398371", + "45": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "45": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "45": "1" + }, + { + "161": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "161": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "161": "1" + }, + { + "162": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "162": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "45": "1" + }, + { + "0": "1598623817079294552053879422210947472173483306271647853752616124799192256195", + "8": "19357375764928658486125492312903159240962516177547653766639560342970447513609", + "9": "17118701616051148895425563017719752116688081282488191314593730879998997672528", + "17": "23903302725285530814764911488019660980310125807704778650028442951921783028799", + "18": "9897263044193607155627162695017667381801834624220133564131928889622082388385", + "19": "47490516596625040873684685722291707875685916662882003823468373379942203943244", + "20": "35650378556195341492829421851580373180514703389856223209693179747710610666342", + "21": "6442299495546724762090119607188928448279286781673837336592301342828742402887", + "22": "51671889287264351694348042003912808712722331694462281256678512026240380035362", + "23": "37366119584409138370974470095618562237665824326794809311160782371088705795442", + "24": "32791788447625478084986353216057490565370704028609400145698666511146163062616", + "25": "31075851774814637707598884955930591295308633473932978116698622475944127812357", + "26": "36546464339158916041350011351352576231065070984191552828215525031671446135349", + "27": "23936470630097230164450049645278622502326699395308969546378797604571614370544", + "28": "12863019227041163679357132342403072833493994330243086370189741032121951009865", + "29": "46396999292767829232413635208160980612505988303487669327281747452575151087801", + "30": "51774417703689346175269622718539474352936079983151706333491620927359022446243", + "31": "31138846263665044144447764956866331329116971856785098041226111389415994111666", + "32": "7385118339516078424348639584862546644726644641358359613155622493151278694598", + "33": "32772595414665738987529295269541840911904817580202721890676403815428992374992", + "34": "48609450298102975410878002947010993415780901701734494293424138640093185264497", + "35": "33065909175909175231243458130698368815121775338564547511889315722304937955810", + "36": "51476353437800693676898582629048518729381383092760728912765830528570010191884", + "37": "47332120333366057171632318477468055992141535858476641095121598375949582189052", + "38": "28379018099761924258193916621470498057810366514738305328467687876634890535045", + "39": "20442923051403164779568983221233112502659333458720967483565560818617854662021", + "40": "16778439902420796923288572157417285152644655501314307730105153774655178486465", + "41": "29590561817755464173884206077046656028869621477687420126651906676567779047550", + "42": "50778979844974474744310943616990541216931214758741462071249181328648059247853", + "43": "48327756960186655700029610093525378413444717435369524613947391343393464331474", + "44": "51806651970964959124394335285633687623390235447738246814070188395444571343012", + "45": "18602332275634592716672086837920674817730217379007489248168742572627279248304", + "46": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "46": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "46": "1" + }, + { + "163": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "163": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "163": "1" + }, + { + "164": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "164": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "46": "1" + }, + { + "0": "19774466718056564032734488707833648551011540998602523750214654491716642104404", + "8": "16227282192285380784239586845831622786641088857048607816373423540961705833178", + "9": "50622252848272042658715088266286380788452842744620902788927155637878454849679", + "17": "17258180871075628593496773525563950820511982198732771812968569892157559106177", + "18": "45389738865430948844944923011329608447316758171755954381791240884705086941337", + "19": "4546374487117493137600343529585842613046040850218517029809310558948665479612", + "20": "43693730665788888221316550144101092797505262253722201038781041771484946266477", + "21": "47395612810614895046124839754368317666814348510703666653329484040637490338740", + "22": "32613789337377137132593303034618216811062156327266179921959981653424153731504", + "23": "20961534624814738790940043886091546454983536368386801913924874812306470719575", + "24": "34980387216430823971905122251032436335341226455311383589064003849459268442873", + "25": "38093528760732579390346070830415951623496227298591897320095481005009929098157", + "26": "48993565115964824721977709313166617227423679784757921262652161152997201094311", + "27": "27290507081691080659755915833677151289006857969790653544104965201856832774627", + "28": "42080594259869551656213236912377675437208312885996812520150816981125551904468", + "29": "34319759628681464785281049185675829809846555283831650736307510954127411094187", + "30": "36715072233611125792468802308617692745150472758285162905942150811274903666221", + "31": "38692397173361669864504675882326418916578246304109065414701919708958344628017", + "32": "29326103779314365483244268789582955730433686983794469383867867523696389840625", + "33": "32695501838507157153826566959370390879471215395376616760000428287943710088071", + "34": "21078426719703939258054705017567310573521158020826307557557811024396181708359", + "35": "19256272795231341010002747488580365875520880544875197343295417395234076942720", + "36": "51105112782644593471995659170752563254787355732144879955449614778392594359142", + "37": "16672157567103979778465856123393972043004245839972237888512432209886157335352", + "38": "5132718335644465242765393801105473255944018728137391526391882331617876955591", + "39": "44702633937131440423951237378783041350021520379895635577392201297345105096513", + "40": "12253910526746071346700304786036386012889485879232095534046298822351619499842", + "41": "604272257488378493608435388821877965592309006351284850634467177233314107681", + "42": "14579891564640186122012802035449470722979846868490443252818087990401335565873", + "43": "2528555589907304480567543995740873254269943236110359458607521578313185483455", + "44": "39932222907452663354169180873737483411772733705167487385372693194233755169387", + "45": "8878563326952107781211530709200446220236926168591198151805735789344752724931", + "46": "23148774627323638096156968892438537428059434414982163460401389722540031123577", + "47": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "47": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "47": "1" + }, + { + "165": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "165": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "165": "1" + }, + { + "166": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "166": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "47": "1" + }, + { + "0": "10833489778171075947445720806211760058004501131759886332251918804308190690081", + "8": "12485065852966330612667926249192926404519223821600031601817032788228891751173", + "9": "10168653637090274400132323743446697752243041907275221524744554284791341285420", + "17": "41453060575518500136728336976042780403730184505616890546207211019509276838010", + "18": "3938423710941079636991353088832759036727715661432461483499029976398365656156", + "19": "491541280244853203172834507238880271894148136506540124692605895905014660155", + "20": "48497205504597853575818979888835119588852486763460700459357191803627976763716", + "21": "7219600033858943759042100507882608202841692249864595510049142695040104225571", + "22": "4688629064620755656645374566897785120106912499694128358988120826552278586445", + "23": "39201623907570466488796080979309584010081500074188715075395158757700542180316", + "24": "49074992071532227596043579046673235209644648959565117235007669356528394990476", + "25": "48716948409848034998049900660312197575769034220903857168894035433554003012425", + "26": "2177743461631360281223354428537531257077701806775378570805194061184599829447", + "27": "31675794719237103210178779411581622881574978706409981297741504044072856807432", + "28": "811579569821149950334432326133607288840384635575885264253518708717387072503", + "29": "14435231682989099908668465716963816605318278372862317981160513302516754947791", + "30": "43886947675217745271113944732849795357387235755374611934564453691327951246100", + "31": "37318079882616467187103745378659794006255299213551432520229535613827126805107", + "32": "26705613097504594196241984922218932755879842131529070424378182775736488838823", + "33": "44381509634746186727509445274744396626696995163947224142541586586947775674057", + "34": "8921157924943686401802427551025836126174391280714568357295779209147616560889", + "35": "37489743120529567389970634350129533772311765733328362538523960919047450838569", + "36": "34023203323877654128747935165011354052658439645515440557742072195157993727030", + "37": "48937644247515191079345779508999693422914276623222677706840909167356884726099", + "38": "7980942975810932378585036412845287768191052967369455151308522889980260340748", + "39": "19597085003381045547978930945751050195838083299295792405300527537583188453008", + "40": "6489354869503383462041844038090974303720501359012215067361568777452575487416", + "41": "6838561344113985155114368695325331235965571993011010125873393223676748420593", + "42": "22928325978138128729394435268656540845199026426117189525905859542652758462571", + "43": "5389936583667132916324241186677008497789274957691366372006156196544340983353", + "44": "9173137713889742705446604445573410638315174421328481234661353292979240463503", + "45": "45868326017838507058834427152559482978484561776178826334391024375469665278025", + "46": "16832804545574783575930464465446066370068144932129311780865410396805403252955", + "47": "39339549402361046520356004604034987007221427095395601966119220299226094274826", + "48": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "48": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "48": "1" + }, + { + "167": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "167": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "167": "1" + }, + { + "168": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "168": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "48": "1" + }, + { + "0": "1643230281589922929913461313269721677840560726699527243824368999070606462076", + "8": "9150124100202883496359667368289649418858428348285828628727641093544362969306", + "9": "10374480017835766120640512168723903721981209848307028438552563020656473018860", + "17": "31315773388575221903098703113779066631655938513490713759459613250454585798324", + "18": "43936062048912166867549848842467200820501804318748178088898551696577170694204", + "19": "1828076773736506060829539308554111412837350780127459773619575726383250235271", + "20": "38920045238477788386630376348159850463740461860153994897137085336989816809733", + "21": "386467343220786862253800105704189636532522647485797147798326502661554856122", + "22": "47165177610393849397585382068993459802984220782267731789977278902028059960177", + "23": "47596726018418239838624119297346790990431090841872748084682226400752169518755", + "24": "47079066136437787747726217152500800014350215339610046526487385750721400723808", + "25": "6944423624350972837810059700762218699492055009462260502998172451910189178411", + "26": "48329751551891319440395668063617981799707909857591627421763975978828656201472", + "27": "4547274341935321648683725053485757619433819657294875366334675861170620115302", + "28": "1204461565236492774643423119226833922149069210357752482563346534582979999916", + "29": "51637481141688044174696233988938619965098833844124525570587758719212515268855", + "30": "48781594189550063345783163596186923401920942089227292649931543057294164251676", + "31": "23407735082211443838806599823221247441634437474246751656435588997042112949012", + "32": "36446872433866869878113284078987975458112078466781651601463757078376679305151", + "33": "50823574225017882450332143233678616897569768344547463819008641869165329356627", + "34": "51791322192639338826528454043887610610124124954033768691588198292856285006349", + "35": "50302977761241343969938129534033638902350425994906136627925824358240485055781", + "36": "34383150358904224955813498808455586505136229354308635565211456463999684991449", + "37": "28919085422878005286860466514092737090752013910694849285993469115132210944886", + "38": "43370767523315502286746526799047213374006413514885574666559342516023412844324", + "39": "27916942360791600208390409813772600806996114342820568405459090556866802697695", + "40": "42968812092627766453438027113874087026410138469580999821765729666522832886667", + "41": "42286969470473001982885681062468171248082670978244270234393936681378890733893", + "42": "7436595962763155960284980707299893121113475361001948563296637185978678135853", + "43": "34442102657158387979474935955287866375576048980995352221233310611484081512290", + "44": "48965567413064480415468552016520697916069754987910033805778587584149805830527", + "45": "10110748048509874446200626286757642340521009132908729511776740165593480869200", + "46": "23821455589710264137993374241564663787329505123082215823798122849687775323818", + "47": "8836922678029898678801888127383665769778240981576043425283136509491716796228", + "48": "22848952150216221657278322388055055127341707464964944907439556694761909917829", + "49": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "49": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "49": "1" + }, + { + "169": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "169": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "169": "1" + }, + { + "170": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "170": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "49": "1" + }, + { + "0": "5529383825244679302765929967407905660423153508826597450732592666784449667225", + "8": "37055462750066689003461043268482093768255524330162480752380091744775301088625", + "9": "2868687757480077334032362986069262808410660948463783084539963536058220231809", + "17": "18061100468992391736440440646368959899497826542215191389141247863370658943938", + "18": "47420493926202178152648909058166454197033548962877870937301621307515594009886", + "19": "42620731115860326370608481394974037636684117222339165479158928550882646647179", + "20": "3039478907074962470472079110870376186260520791501699381050807827362409154969", + "21": "25473289429482678472777713523788213153751319977754872366595368764257157193750", + "22": "46422562909458209494273308239913451970949078380982272138128658581220235122272", + "23": "9128765778263001237008255350280402035217861414456145324508896638993613012460", + "24": "7455669787603810821627829188526725058592097054309104291564175921036624334455", + "25": "14353798396702170852569961524848286586466831194733411090981745429416157700095", + "26": "5424141662401179925871596514666228109669050911728604012809610457734604459333", + "27": "17167460947612164759578153328942490216249175115796801124253018286563859905743", + "28": "18468904687752525748882063428017842286224731148767165756090751574467136647711", + "29": "36430364577432022342495838191696718843117338372877184232481871587699764210386", + "30": "10422876835121098669596605121475209716844737372362721502163187847904988517432", + "31": "6849549442861257735207428637094791593981959650991526519412015270561430668532", + "32": "32383336136694996847732898211450163182940030011613106346867600164489195536246", + "33": "29463020886287809181977004269040535691584942691717167339556975597839484274571", + "34": "7064777828360925765798085877300103558247219785867199374290137175795956586748", + "35": "39804699850084118816746474891691207549708458259880821034002552028448868090155", + "36": "35622346333162668044567745298489894606904047119572809148689811878521960796057", + "37": "12002751929148267900185461127103679795788513307375770233480590674844237734319", + "38": "6238610245645407134238174062018982427556465933498326530100267938116756389765", + "39": "38223334768324367500451957568928771935518287699975570445422841288143576825204", + "40": "17569859554436091520522306831116608885764842349847700892479876557069302161074", + "41": "10984176370297423938620763651899444110304955439092386135700506339663632930191", + "42": "19781856117837581188239633563253835326814048142930359419504123948510918332513", + "43": "11493673264049883921135845884001518168836515531075901068950172865812266759915", + "44": "9857065403299824442261916026741552823607819106464157480898257584216083359060", + "45": "25219542011495972260220822665248381963923395508188510715436078085710606476784", + "46": "45467884437327280531791482804876063238991302892630751555933243104593120753680", + "47": "5396042962590938500697767758869095412354374487351525793103253040485277911785", + "48": "30284619413030338066398106943902740082968037974727604058918565599755308417687", + "49": "37974042889562811290521989283153743935601079177541358157166481519370768542906", + "50": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "50": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "50": "1" + }, + { + "171": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "171": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "171": "1" + }, + { + "172": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "172": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "50": "1" + }, + { + "0": "3182718166498008812418586185198779390426386793456672324496083987133297273028", + "8": "32926915752434043089867058169666297752313776372016219331728563277690241534083", + "9": "47976875954232073336554205585086358567803613462315826321029621315345058443524", + "17": "5013767729997012319537535223742671376847216036883396905593755311750771851124", + "18": "4042102599875199704360227070290810262077356882668493057202162483802847551247", + "19": "7523167637422404073837718433613161800922502611402235838506500718978337278060", + "20": "29363760583617431835031510144827098016649152662807776793457114327749053170730", + "21": "51793675347194196027107483187723312731029262058165743625042792930272256346227", + "22": "28784486182402121939677102428494458446056217346449876112534872083729197737179", + "23": "33196842299770698094777836345369062044376762594603668793910295530004395860817", + "24": "22208414789330235684212724304396966782410301945268989554076441457783721016667", + "25": "28580447473241086180594740858448882001369133488186246055180461214635205909561", + "26": "34278135444415729840826722645351753769427628300194311781939262098964143660674", + "27": "48193225826157385232782694370852811173938937474981025814999570481072944081411", + "28": "52201237824720083752363860060076587793378140971033785093924679406652381363175", + "29": "47552906929785624091452435551737721455988804786883975584992420475007699810773", + "30": "27132472653502616956966642728126699195788400198103973948993023516431572589362", + "31": "10389811231893989052934357579831789017638868489307187783157199748358721415287", + "32": "36549607029688752653370605148221026360249830237184887264419022181287783306400", + "33": "42532666236031626673360246982240202331291830693927235736901700185198836760783", + "34": "46494840385138930761416763459839914858861862032292579750712123959140575486927", + "35": "34371304866850425822747943494500712401006566930164300319197998496807185126343", + "36": "42908265370426739389831127013082888253076642651088871623458013388879086873986", + "37": "11266282299598410997189206084139697517390930788939438234281336855974629584778", + "38": "13805468254465408450402625430120689646754186366290144302725820351252434866880", + "39": "43434726263656988720248000007749398516863399008523143018931161020271912800792", + "40": "647731032233422217558127532773373463300504203189397392298264292595875487383", + "41": "2905659771028298817004550722430838979198457315870623726262319644807624942985", + "42": "25698046083270312750636259327184550058421111519323309647198223674899960287011", + "43": "7855947208728139557226339259540416057017531347482278615209160307519622148288", + "44": "47708852949726384190581221945733806953051097619938074628876833805174210141435", + "45": "39479565339885969083033734435984479668373915952688061804811835305230118135333", + "46": "7842387998943086825378298185293619679502215847273077668397997731014939121008", + "47": "40306784563250300758131954226384334558258162701206642695140064284918287330673", + "48": "9197092075254020697128929074555292623565702505297022739167122481872051270291", + "49": "27546004459242409128714464151873563221532990014603680095750652265227049128976", + "50": "42458762056737171250789835374827842987755060473775593241102738142319044877826", + "51": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "51": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "51": "1" + }, + { + "173": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "173": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "173": "1" + }, + { + "174": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "174": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "51": "1" + }, + { + "0": "14599400764263231688213618032482449522109778447311452342990557992771279312515", + "8": "18912742569144191770162346423650482057014722093013146591972376900150909929530", + "9": "38548250175464665192127540856411534634963604105490431104492468719569689398231", + "17": "44348538671285686934884133685986338744527348022344885164891332779321400366538", + "18": "1317035426462381896031095674260522491638297528453635216908139118977061741406", + "19": "46539207139660021075588674954360581639176307945744542063239224977085836649648", + "20": "19948988903310505461818670726332844174056822953145061275074663474023611784203", + "21": "32799341221863613713315633976844686242513156056573436764399772292078998002902", + "22": "47882070842801306810625066651456545217207722143553240827563066436616476338717", + "23": "37288456982982674791710885911199410879115779381419600020643092129816688345351", + "24": "24590071506477008281171416896588602430040047086534166442574329507096343702194", + "25": "21426534331298303745051173870539947668741631378123539841613483736269106030915", + "26": "21500915328820030333608864248737705227390853190525669612567282458918537468989", + "27": "2308445996127659243095771873055937834746528951850901014580599297683329698668", + "28": "37436558193041549499094419234762480296256637673958654680499876580003225945988", + "29": "5876951665448425737513934386595289755669601152481593379720880778812976650347", + "30": "2931207815460508121850433958866787318687555432772051964500636556873218580423", + "31": "39297787268304865366875080259169708651282955033008844315219223063622811132742", + "32": "3815516441516166661642172869930941161203900213418247385063959232984890767063", + "33": "28286489692742642209328005839749003580767201527597857886363299992740921956273", + "34": "30362392711822458116774494325638110400060105826693561155539104482639338528376", + "35": "10080174423788243550547718097463919226130273089939311600243914136125286667950", + "36": "27091549112553130991767524660764913489766818069077890225413351581320027788468", + "37": "18826009612321450242655041363080133503507468988795699511697464020993344212329", + "38": "15953098987300962448626455676063143253197121142297994297124625590770153630274", + "39": "52226479997039263893288195155905971351959680139821013658974470901311902455741", + "40": "26919088194009920442887843339979507927310781225351493408216270427103744817440", + "41": "15958228281395294969968506938836163432356122968174445529633184099557083551354", + "42": "24026242102138439782480649244306880158304466217867285135586377535978229645528", + "43": "8372630119721329513598071506313643611486345273849051306859636519105003283484", + "44": "45222015296981788493755017514116328636458841196562673595761093374086989985476", + "45": "44577972078797192698174046205333304946212575340719842707581790406040507255641", + "46": "40272514905000928736293458265218941340231225508985571798376485411066362977764", + "47": "6709837189341035330553101939098937948377238343260378126852853557079310516844", + "48": "47807295039052943200192045607452430857512347687674434292683582960089519079597", + "49": "17586268334218852322280026530709274916427397519665142185944639475824175461129", + "50": "19493625175981631156698363301813094890232951876979700015593327200705609103261", + "51": "25683586717985565161948594091827604418697644794370484562766993783686395908239", + "52": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "52": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "52": "1" + }, + { + "175": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "175": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "175": "1" + }, + { + "176": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "176": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "52": "1" + }, + { + "0": "19971122460007657859508211404523175040055308424338161607196356611508685672711", + "8": "45800820128173391792185096204771604566910744248498168395979465763434726200074", + "9": "3296593061958405454222623767042377492294151640890709792162681729282441860959", + "17": "47577554868383470173772963558858336929033862232427644487064158734754936268283", + "18": "18477055984664591791168426741989663816098043141357366638520053497338079402575", + "19": "25220082235435097624027415701773571462515511010670278999287335449451268531191", + "20": "626711679103864410439713004447866840839704333952923655574744443194054128520", + "21": "46168177344309306601260358932398362664384532320511350508189345939910842708899", + "22": "12210542597760506638588020455529460573339586738742651768549690640596356472824", + "23": "4382854497241020342368818720791628600373586432302204096445971852065242242109", + "24": "45682661849071321924503119515687782731623959437074118200276414169882856637949", + "25": "49399949275619986302265977830833405944277499222523470864100997833855183769335", + "26": "18450413655447460334878199409335636421323547099473359223820431819470746119311", + "27": "1837028932618437220297077170968059055290689679994891484332187122910651899938", + "28": "39622122628997086779775300897944353896275898579263552469736968131323183682930", + "29": "10948723487912278740535296997019334230669113019607642499202210519535806030867", + "30": "15697358055270789222913660525066260537271159134069000173252065709498065979446", + "31": "27857821019300782343485018756105818966357710298942387798577048806298503028817", + "32": "17356086639314663282692549189543132986148130847434722818463421244817259728223", + "33": "891327086656865113381281477779838422670221314500243227129808492328666628854", + "34": "15143558804250167271859225448771729546438234112652322237017579473405520284811", + "35": "16390615825144014250159192152580361697013774158644572682547086120575102613470", + "36": "24884018759847835638638532005804645087825510580402991836802423535026848890402", + "37": "27884325742779882949054032106561462868317711852477810554036909137384089655002", + "38": "45774013456159699697037248566545754692356300584177254754477820182750814439767", + "39": "12456232222288471227144367158891184160679107279386793729713014786582782323815", + "40": "21622819518092347312784241151526807226685736830852547810228089884173491716460", + "41": "26701937558854188229061367392442715915411165328623636113257176896654406684794", + "42": "42033658794673269440783147627697273078428793909581651885129093452456370823044", + "43": "32601587741740562494877757669929289782841268464357082837787932579766868623872", + "44": "28991960260567965231978744956343826810629279953958189256198349905624048560904", + "45": "51737555115584236985075043616985711544105687714282862501121480196841248355425", + "46": "34201144676260319605708261812656239403953964667988043477108767974993143184197", + "47": "9906106918365321017105677790435123615339082526894244822796091051050072605410", + "48": "31260639885130878794843351623708476260309342082607367020952318208258443597815", + "49": "6977163481927963691187158449685853311426752776578931518685822891256410250137", + "50": "3514454668016928522178975669382735701277456742852963606568745948886411661948", + "51": "26964653365035093099079233300737906096765913771649525232456926040546945369028", + "52": "12497266611968540567111644893085223797720357073685312991428428732122834393648", + "53": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "53": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "53": "1" + }, + { + "177": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "177": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "177": "1" + }, + { + "178": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "178": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "53": "1" + }, + { + "0": "12801369279155577131760037436686619341421686678830792595575775840669776442563", + "8": "48314670915362627199752432936376680501039827958805748846625888559233657950802", + "9": "36193325099956969212371624565796622990386626924369046066585654744916067956227", + "17": "50173205642135171924920681355846645523717857709157089501646638240843254608466", + "18": "48667477437227384968606401517801433351367041061184844460733929214411245515153", + "19": "29468633431938254341174210027244178345528760649133603172754558558924141821880", + "20": "14345993343623488938290976856477841428797757620812366906795990921674695156417", + "21": "35366090867308845531673767619698229594652729166029855327366968050336069683389", + "22": "35511542731973774503017775596344705542250731048918915430508219562259364736626", + "23": "31663516183477238231908557668110710303588643107783599067195586215579342442991", + "24": "36294237593843045602877574052408930235865392795896448996051948224974258999816", + "25": "37264147634278328055643958769928693472117849154812706124555185877271734880109", + "26": "6405794658226361651932970226715465952688138048776789154099691258582864265581", + "27": "16644667594192474495283244120292911558085205029420622892260221298971905554587", + "28": "38134538098278005702493298765434409251270322704749634056448927576445009842737", + "29": "45826906271895256079093037232020869649557982877749626792408970774493043871574", + "30": "1593256909260181279006918088898070339693815483577656139152349725128201040543", + "31": "42991136075009807934268348038867327634824416770002788686976655950875250823473", + "32": "37708865735284819187879728055988359746024244646477934111398423647452361709216", + "33": "47164384664177555697846017933874747451603461484031012137458439862459381805074", + "34": "965897963308505670259252396349758849490684199114512397124646286838592010104", + "35": "30527006209889105742014547584929936775107102185333973362772965349019086644642", + "36": "29229608477861642923912423043441599810674586380622648291982756970402380291271", + "37": "1953211450577961224325433364858897622999560620157734175054307880950069477946", + "38": "9353519980616867754753210515127525477911643995317359005875530721518736307544", + "39": "16185706506967175686265770066846559450323124283797699141451776739272925401570", + "40": "38022062023407203818525259102611229069856916794072976458543714108368590343694", + "41": "46465208811556690916176364326908979382487747551315561629727874724669460928081", + "42": "18561524374418425025293682348210367189154475189225886149014162833411012225454", + "43": "32475787033882626937186047914679707543688806472804855206596574310071848468173", + "44": "27777254178959933148238688998877629299620445205960491876664172162600227405703", + "45": "42281456474174918556176940606933783615885059091629897872382333450022464607768", + "46": "30220411442471558101331871257374116184578780630167048780559754194684624191702", + "47": "5903825956785405493059608031611842077972649879646080175587220918915621220574", + "48": "17260187455220800157500219115622945881734720793662323569058006167767093361336", + "49": "52128968513794320763886436531635675169094572810123717503985686939701742113750", + "50": "27688659169175867744387350098721751851726897990151039928118164768438867661644", + "51": "29060634690866525617320518365559890485375658123513445532987097910753124707637", + "52": "12674183554060579328168137719987416387732764071784921154729503956463272509612", + "53": "49032264524367070039979300981022405674483090528243494919276139725840577629803", + "54": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "54": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "54": "1" + }, + { + "179": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "179": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "179": "1" + }, + { + "180": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "180": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "54": "1" + }, + { + "0": "2874800145470695258580041840911551878272283565060591475417515522159069870291", + "8": "20856609100865185787751612448733162360224271878987395766388433936362043695461", + "9": "12194183133497856466174688191209059807219766320629463385834794408249963412301", + "17": "31120003419260810433513376907978875667641771785924900128059201650129025002917", + "18": "49075744729252835999324841051845888451029339824366977433296527179178796120204", + "19": "26649798772914118313774692572897728972996138081192524682225116227379955805723", + "20": "41481613659966279609324734461745490978016031957504218984109857404997551581190", + "21": "30946854478876974127030466698546304482867161543226115801559905435036618512713", + "22": "20306023826684576400012600130891657535312452106355231428727797969977899524386", + "23": "42234672811986758149547693373931303325722717544933127080177051976441786012261", + "24": "9968736060683541482096459058594514828048520841619612563543546965290819049926", + "25": "419159326803355504179044755466687201380679803539890028835597793036028148670", + "26": "7396879683204645534515863273956505889287928485285985265001562544458108372264", + "27": "33107708437166453066711746978644129600215459638571298655909606369328774708558", + "28": "1732395166632007906540260951336623548518684916962654086166318956454494582612", + "29": "38038727361781312909939564755112728410225794225274293695641011853692913942887", + "30": "47064636956155159711372043655525582593330987748710505959772210793150844427629", + "31": "21094028601983788282466965388694059964657012242126432762809912658058837513025", + "32": "41693947444146048268900275157088917679898621087439750905288151198471636691825", + "33": "21395561571199733448175766131346558181089532251915490406827735912339060481275", + "34": "38344438168145259744035490010153258028894823122889981318274790921047311177021", + "35": "36258256020328210054225953915467393970280126992885092782600759336076807906414", + "36": "5148818709280297982538149421466868438634363587044453389440824490919438380476", + "37": "10278869912806823810196303006899201166586662306567305858617877001030314127551", + "38": "523562038924235281409734882151422465950556227071179417612305001927314831554", + "39": "44169929119578255992801129855518330082719838779908561108568163718866855441244", + "40": "16123470698057306807401503360854890044980663506556273137399859491248793076711", + "41": "41377980663559068169285432194800492798724863252183212831370642716258744672546", + "42": "26474215360742893662054977905863824919387896215596411102532934134275961495347", + "43": "49964246569323779981619465035875384729064815705712628415579200513034193278638", + "44": "35208116100267599078440655715509657194269847386778597064885133844425211587329", + "45": "31060781036617704279363296484561798037376197962341776875664819457925942107822", + "46": "3187565374732278756401028773377528675775290133292385761572821738691963201647", + "47": "50370578993513916347001504316826660523542037902909360494292428417978980967529", + "48": "49609829308379409108571524386113107966178825462271389944901570747423379187910", + "49": "32837244640867386656635274474487603222200973394948633305679410931669689931245", + "50": "20093098078022279649854787717657644175357059710060694480824121550302320328051", + "51": "43628106233154507498986159342755166333941765449497175563291834244511737379217", + "52": "19934393442660559057401067523764892965923164220007314439356829698670167778640", + "53": "28954700295118130234512355849317298799232179094852566623421541652106186276562", + "54": "15958782681044120532233862649699354067562059482538815462686088366110135452008", + "55": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "55": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "55": "1" + }, + { + "181": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "181": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "181": "1" + }, + { + "182": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "182": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "55": "1" + }, + { + "0": "15558578381003392888309173936039806021949114680855373870727168432126175091041", + "8": "36958213691714857769216413913717418756278650557262436863112402114560266322453", + "9": "45014442397094611256700146330680183783333287366446722041429690667721733015947", + "17": "36699347915436590119012342223007322693871385423905777984001272614601809060469", + "18": "4182050713175943474869699871949603240467902844541127021822081383262698883227", + "19": "1273529694669713607728232233990315371713710688403897798989378639884378802626", + "20": "8672800637664026646743353507843702204571133196091624193841028239432876612002", + "21": "27480134299646099452152758729175766347604505303723655843813415817155731692605", + "22": "30500110147764869241663641725809932131980022349733875173938526399578630402695", + "23": "37030819562059733930764362059115754276660327317281064767897494458549206154039", + "24": "3660739564462922177054254887881893920831064401602616405594399048113866124360", + "25": "49831051361945158893120755370319693358884714166399824350805931828231122758907", + "26": "24567375305900541593389151988598983318358988428396664010009286087762387169287", + "27": "40754943758301933511617295805822605115493844891518129662616663106045623085079", + "28": "5626873820042429608006775761281872331410675450527484263670837735872600436437", + "29": "34863835242065454762537466692915586106813265652827290812350232547736812461308", + "30": "28828205476385997846779928983272003862852760906233275569602803301408742183403", + "31": "22404421863587080361386335251285610425901872423967912438723918768609701754090", + "32": "49742800412465320613190097571905223754246690598046716044092048951594495144283", + "33": "43303826440986422772306777141453898681091336743660802199226193716736468111732", + "34": "6887733418436517002533875615346854133651070936202786825206750583634416865435", + "35": "49928646512630617197668763320934773675279798078327894506637275425144811858980", + "36": "31195925800150561447903998324756407744939544137813193398111834438159029670629", + "37": "50728333294076698795328593499497941485753817730764946846097348332971820028089", + "38": "47431846741560944119759707044268607324491358823045671830112338234018569771208", + "39": "11768075163522120199872609279918140574977309412921216959940230218079930033864", + "40": "41473359991692454826320644045116445959346115572840334171707672586867253916594", + "41": "34193163133561962307658969863144337775495246144895307564894490707896028980959", + "42": "35867805232289326499030564831339998043659154145919031292301374748120022854211", + "43": "14993180337074960720200686515994140668145164628921675157751616402398509521981", + "44": "44064398282333257020730328421876041904474323246572881596558050018032899535332", + "45": "19948524166797692818960016080188213484029547942940502496106522580431568460692", + "46": "25789203347610016219245228643172820780131628919673031699868379621320034965224", + "47": "23778934183651653875855073897696630838083898449618010562925986432739163562010", + "48": "42873329740499792269864769078473886692959327353108742535862616780175502798850", + "49": "38446814079139810910457761664258995461481738309202125910212759757408039109745", + "50": "15169960863969117799681893272465749807243108331232990797941252799802904789983", + "51": "38622443651082277770338516920718920222092540374828892382687036544580326399635", + "52": "39012125427428523625270049677804413638281221676939693649555247230928602879857", + "53": "11009779126651618604805444760109344004521652798024360065291954761372826045508", + "54": "10333640033246829710459890372538173174968500552565000956697270018521681136132", + "55": "33085109261284620782260186134834786881330708467426846946188432828680927670741", + "56": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "56": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "56": "1" + }, + { + "183": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "183": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "183": "1" + }, + { + "184": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "184": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "56": "1" + }, + { + "0": "9811599964264530187304305794911397412166832842489170888364387877850235210426", + "8": "35257600960717538875671174989277404503928084911858834487979693639941982630379", + "9": "3511536225223262604609683995454835423729933191908823349529006198749754827458", + "17": "11140552643295538623324758330780884994169601899807457822393096174630573504170", + "18": "46499105656219891570679669047008880047550492622686403885395088124165904580949", + "19": "13199005296328705942742673700739398316276900099170163010895756592340180569845", + "20": "38964461774913690861526712655704437143704150074595460975020257188853694562186", + "21": "46887995575115075192085668564705929400665308797905212794851598240413114450963", + "22": "43882743115731196202414273703052922012595016859296339769740332206157263189122", + "23": "20397062127725501361465306241040596120458947829181053355790739032074705276821", + "24": "23160115496829174048084493986276064970641698048212834450299759532374273843073", + "25": "4268056679769359643937094304142320277221752714811575715839175071336588346582", + "26": "38249448006087871870414075597249197962305563763288948092987171768225606048056", + "27": "33596237573662860295450833846931282978098516966413400438078941425910835629498", + "28": "23630434733803689743605699222542434625025001933784843468220959267528142872101", + "29": "33575464307243128981723379154379172357079406922008987267817849443623380855631", + "30": "30626007667114502838585126358916475666886034246231519650495792272912006029020", + "31": "13633205442678024490116374717532131352359980411562278664318957818815276920767", + "32": "12161045078858759438780510398498849284840447054488718213829402694006262441613", + "33": "50030805989570793011632246156070787126245014493357494630801666217569732219304", + "34": "16967256452093040311257114695634358181533509810798447616355511972126811938368", + "35": "37159904135829956970090166621705162746922718418428587224171612039491511282234", + "36": "27082508832330131584428263875403436892556356800227622939998462667466888078376", + "37": "8621624402418440223444480777677121828796697294554054054921746855244960962871", + "38": "13850968289508252572346818654663049160399799234068973515041336808130117998136", + "39": "48348378963979534612553729623784696025942387346766985612264001588619022509895", + "40": "20465842086964107698124849734843009969170881610962290987835753743429296723691", + "41": "8670623148692012434609961242682871457964873164561845443717617228286906566132", + "42": "16145238248104054550143407880643729479505295189450933988102913064388173330271", + "43": "10145441268572590579208613134932101955700079461488272082330201550579502389725", + "44": "25679027856520546825358322768399413062788017707148561415116457406931508103195", + "45": "32193319629788271552211183220519976653532663919955926627209228839062721385556", + "46": "13345002706260255504834651581939602387199150714457171852797771708361543609008", + "47": "47061450638514375826215811908744866879258526610731896947900612310952630500848", + "48": "6972801335038734140453678068767945491926699338337421365533088755153382412709", + "49": "45826496760241964327805018861710011778187306958856979803130891325927228280974", + "50": "37232668388052912044859799313792650240045356124449905327667091406656129739611", + "51": "1532679147724594765474517925527692031171670435697271341619284126367634189102", + "52": "13155359903310327012531704167967345564423841690627110816735525415741074577023", + "53": "2643346701398652130190188285932478236786842320402775663801174175616386099833", + "54": "8450242745402834923810032977394242745150947624276083478110833191908818570550", + "55": "22650864147209266095665093661522062646273819273669143119794073301199367811327", + "56": "38444507686116491782456252560622280787395517083096505398020732946145982829252", + "57": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "57": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "57": "1" + }, + { + "185": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "185": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "185": "1" + }, + { + "186": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "186": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "57": "1" + }, + { + "0": "11797479380255190086030457967941350172480879235135372778366002137304980472711", + "8": "15903879427501232694255638422894771343347562435171741841900994323840681792831", + "9": "50933137116934872809912330682256821781357990795311511926646529443934874684866", + "17": "35996553932923897415086385224589569272575176623262682197040707185932980608310", + "18": "15673980864813038456649688853613609271108903784258878253725217485084375952374", + "19": "24174431504151113175261776274814121376130441284859089138757876354435937799758", + "20": "51771580265810105335926249893197814447984473552914220937219071265403434683058", + "21": "11290676623867776344114482395303171169781518793948295324309426128608604849031", + "22": "8409495521111008620436530099469680340946687554032749058284685581311015911667", + "23": "40277766370322337046224132367735432681011902480335046503085989917085258671141", + "24": "32351579748207146295947573665198897103936797798774700208149653140337275101629", + "25": "26808655080887219095537193056365166400344791460751387396265567694499495682557", + "26": "43939295993427639264523982908312155952270428904976951179149363619349171568699", + "27": "2615928250125534253983662023398397482642537775194048496353954712112464381585", + "28": "24665117811273098571791268405924882650770009640818441195485571661529124368653", + "29": "23310083990793389709278189173553809917938459280773029801578963832080194662847", + "30": "38897903662727474762999506260664058810863249897094730433494501194313760658978", + "31": "22152896730736334549888318638692287204513515214316028404603478706319246406821", + "32": "40841491001727582810923937974220948519414818120996801118165557378803379209065", + "33": "45804241428533841200143162657819328022465976214145860566982147891478535457215", + "34": "38247945248539047400507866706601033492064308564388986885894572889109560162144", + "35": "47940123283699016257558947182409062548466132367938684643112467714426120763777", + "36": "12092623607389999641850228730930499684025853387799891848171999001242156520113", + "37": "49612578069481060603003816627697197677305941822287909347803282058610057851646", + "38": "20808330026913643960790880775016541975386323877332274178447810961387653739530", + "39": "12509250239645937872135956832140815144675242147625726684019380216316765581796", + "40": "13282348156818073297501589837760392749731423097724829433731087807561077290345", + "41": "8635613494893295811108084342410205802605449093122787212547598535283126066382", + "42": "32921001631426041445676343899570583143896202738541110737370163455053198523276", + "43": "15072150072951460790252803724636999781589895337377831063611633819852290167493", + "44": "47738287137100779085704833103435594777837426768554691154123749531090265614528", + "45": "7445854682870371420431653252737133712854292373432054892095511395705085407679", + "46": "21419594226096369102011540768316311221996509834983414160253966398167483277798", + "47": "41412475794020893132046501869760288631274866268483141282007604116478522130215", + "48": "29438264997412425909247180540071295742601686211397643346247079268958911123793", + "49": "45548144845518422625308249397535081611763184016229732029888668317030817383283", + "50": "41927051337616883142943994926384936534125160827462461617823879167958338420243", + "51": "43871397036862176880455740854832172473688538889696440670583829898652011761449", + "52": "35207008718646426805720704075193183187236956162781027008678627115192383928486", + "53": "29994332457423934758231668689495943901058791066006355079939621091191349632753", + "54": "38772336053192597942783585627048220283047009949910621214754172288582954650815", + "55": "23258426506563365742480079527437241168385234319706845454083583771341346157344", + "56": "21925302142198178264630423325182135754836599254707043729183366482558865259361", + "57": "19658305843685569169430362365353837930373042553254857801602254381749376221871", + "58": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "58": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "58": "1" + }, + { + "187": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "187": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "187": "1" + }, + { + "188": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "188": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "58": "1" + }, + { + "0": "15812276861397201227532067085271584728094218111982315967331671382133625425702", + "8": "18535644248950183777137251290930303361902992375131844745869851531133871101591", + "9": "51279430787531082701705987084781412833104680004081069854155329187001349341305", + "17": "4620280059807225859841498832568948712166192733167194648593693014954508365885", + "18": "32279062726889456243515576789074612857448705807164488364752217196476984385336", + "19": "44184272794121612856301067916009731591444999632122835020008743833827814863552", + "20": "29330345497656289885337341599199864997103599202957467011994075379964143536392", + "21": "5810129635340722855995660842622571514496893097535104267342213526806885038139", + "22": "22093601765509068412097730208250625216888878428029620474620624391082030724566", + "23": "33823292390456074445857176711494284388031659375969059374615101024483851681562", + "24": "15072443219894216835360983777898383891557547579089367459205122866145685995272", + "25": "11626606821172032584621965350821246286763970077350448014993294448335424093939", + "26": "25180933374455752788679644005606966820561921667480756716673289054562010226309", + "27": "1293692419630817662246021156447890909935006109796007300336215233157165802530", + "28": "40038366087558648585659130172915749952856978749469196738924528961463907971374", + "29": "47485661197731712229971694659034918012631606979817871191437440272676288502187", + "30": "2266783342230428215697200199668626694995414935224528224332416477665003813608", + "31": "38938621350782041225841985605041242562204765227075428144303567109368785432651", + "32": "11750757641454844391624222022215998328321386209820668812170311710921023483959", + "33": "4991232372153516775627384368557315643226357632901061310999707044873437432007", + "34": "39792158166938465032391835383243783697520243744886894060261989761329089919021", + "35": "49219084037788441430833002157865002740643066075395238743097679890017637651197", + "36": "24290370875537977927341659948899202892675773969715971504272559801894997624230", + "37": "821568644471580341005322773319808354960034337318505717800240692934651502145", + "38": "48762614452492834136469422970576561937183920526135495771505488136430876876113", + "39": "42134329839847921670579319483404900443425581513469279384164672676108050967277", + "40": "895129569681074695138752992405210404493215552983063837481217347568002758337", + "41": "7127544495965029401646717773079951414444422596100117426315918732427731834503", + "42": "23561203008659710736424481520837744068715071337987497033620756364166920628005", + "43": "8765990301331921992840574586282673763273298928042305630462451059175060999866", + "44": "36967831456732430915449372990747641804529407171981008266600435052906003828059", + "45": "14011901445376071324335811805745684445627094483111232940105054388150045797253", + "46": "50374876510000627886928660363770266275324035283249568246117252443100228691096", + "47": "8752478880339119208975018249995394197518781758545556932041583769657207755366", + "48": "37462509494912456254133476550641732048029849031342304242982998805380001516880", + "49": "28066082151029757310758300027320057333871698171350795423585946842186060828127", + "50": "29266447935243209577950456344099974544965022864956546295908626823688007890951", + "51": "15663062836082338776813337146561950964713663215969728180399468063126031180017", + "52": "22152069226694884890791439616391555314316473853628051925772872910546792004939", + "53": "45342217178073138250295208119690541363360396224002497690104428892154216307304", + "54": "5140994251500456411231211828824151820179055227524877764851708249117356248925", + "55": "45650138088064769636030235114597838277767315488933920125305256055766941545400", + "56": "9406552773588238504368824519032723679370593795249549746547590939424200942174", + "57": "34304589006885983711696510309541293412660869701243945658506473451337462560973", + "58": "44906303812554767121099823723834814371787058510416082935177272166347207070672", + "59": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "59": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "59": "1" + }, + { + "189": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "189": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "189": "1" + }, + { + "190": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "190": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "59": "1" + }, + { + "0": "14555033526911765831054005951477598685743695466168667850533171876658643729676", + "8": "34863523424364231614938921732466296539096491121427033596608711213460107724357", + "9": "27207535934594294618567784126810315469019735075077155894544655864054151572902", + "17": "5750256653513464772270728240767106259049960238754078985236533960553573217603", + "18": "27966986139375070816317855599335811167712069543547616545463636483849903171319", + "19": "48996383137165744560061674561699476843486153794209246017313888406269221666270", + "20": "2476119499950347117965077281283419172976844485414883598019890992416300049927", + "21": "19605519810492726935429407060044067856903606542149496202792719949332025169386", + "22": "8613512556546439080890935591940424299608376457901416051960964138272274942071", + "23": "11436359065316862937883286899732082402214811066474061966990279097030365329070", + "24": "39554166495063583479815671404631836465055498965504028848471474929024611216042", + "25": "19523470983586898988240630454875779055340295958702401903231329869131873961057", + "26": "26348171561658105438770458063226156174491270173373023323901210992687510469166", + "27": "39000576329217846269267382972726852667891052881859239144898377686097306720074", + "28": "1759539451344592922231121524951202200686716472285931383985167368459252745243", + "29": "44215007384708812547026515417691940988308520425821705337635516823963224312320", + "30": "3862928018832750321923891854067134902921544629899703616314984218766964942138", + "31": "21901636045985803764716269921651167505902593405337357105978024841479321558088", + "32": "15277032463621263351820813264538405039452211480260088892733451046931132793815", + "33": "47980315532056274693469074541315585470204512827658914626207874233482560262938", + "34": "13928209294676374986354534054581251377364148962389063419717048253436134839604", + "35": "46507853233669737936947896284949410488000541732414151172042936403069736895843", + "36": "5975339878438961254510761711737913220057327327920429634635847855679974385968", + "37": "46008417865678207009465851644805333939374068341600672204260151528384657420229", + "38": "32503514419112369135379707976457969627621664842193727041696160656391827897762", + "39": "29769885641142348996066484628958347559121673431399592937816912426690987936086", + "40": "28529485287992002327998886451815402427854447912805386641154547997477587424000", + "41": "10966056069092924465755325624999776666254573866314064813816398376495429392400", + "42": "23532024143992470589447289005983263662372741992402502112047294085724646358400", + "43": "6235066832243651718711793764111718577564538023035110780311297583819589637393", + "44": "37661601410810942143169047226518599079836676761701770864494875029400923702229", + "45": "51812320359747782931547711187698452386999889004542292053699082845002721608565", + "46": "46176950838959732318853419882362989611918701877381595807619426338789099528392", + "47": "46089031264899263959080610837239385297077066650560830826453176977157677727376", + "48": "35263622527179513804135349218413880394118823203804729405259008337527426821440", + "49": "23095995603625684421889036204755221630019576810534568201102507181887473131855", + "50": "8386585992550556921137720806880337531315050013800179766616859101176600258161", + "51": "45286850868675883216907245060188269722019657115235649596763286723407492330126", + "52": "29999732457492875872545122490568514877382586569195772952675283928339147878608", + "53": "15482532462112043627191388992155886864269024630544596242863184665227394845065", + "54": "25634082300307938257694021266206682661095479777731268539621430425145306759008", + "55": "40809550935485141086337434497663859640055401701049869955361322997962814204623", + "56": "42599837123830750380711027863755497897308646321548115070195289612716615924754", + "57": "21977168978137609776256406509083264783855133110410345478252231994821428414661", + "58": "36545003017022304986596970369089955362889935421785592657720103615656385746601", + "59": "11264203372774413051457764167603997729900179027056370285563478883438007644364", + "60": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "60": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "60": "1" + }, + { + "191": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "191": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "191": "1" + }, + { + "192": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "192": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "60": "1" + }, + { + "0": "8453370176619636688730899865196838058367647719211769227158095525122045566926", + "8": "14700273049248148503004145417342472819489376223376523850579514678795192227081", + "9": "29499326547663415118039654483404228825085905754372888154597331620186324201400", + "17": "16900751352067322471321849692971462399854556457660170971998689894833900813331", + "18": "16689479123960579558525350640076788009266299858209821170307162127601213020682", + "19": "14386894150226514038993853486320555463526577351517015808534222973907504459731", + "20": "14281827511074562696250851356442184389645138997631056247147800856186302003365", + "21": "7601252818192062195187621691597227288571904750280742359906535937941906367017", + "22": "4950822731455444783467234639504457829374996503506837168099325001874615550183", + "23": "51837903246315225107713370053074430254423132769542085893706060555586792897700", + "24": "16546152870877373244122296708221062426096626308631253855930455402080796562574", + "25": "4267865283645358193406033116664140612846132199837271175626375136847081417872", + "26": "31454641283437352122887508382533251804031425393665228594397434200271283770360", + "27": "652351439019401607116973282173938477922922008986176658355519764498125477040", + "28": "18594303503105103590816782598057378876343333312365732299430823372586744082303", + "29": "20533746798332961527887867601021334314023977450240156997756134802307938010802", + "30": "31730678564668931612365424731140004183405310786489510937867001188362404418596", + "31": "48479350898178129790326533098191184443453539697488280147441712352960713016015", + "32": "3701397702704437653048502268996115699107880672985127178774683611658752663787", + "33": "43460925668457066802977853258916243668192492196292654929076745569308999855359", + "34": "27733837539902012247848527574232219638074401231105290178750803799129180705787", + "35": "30083372598883073357569659985884766847092469428102463974683224520788843750263", + "36": "13416139037409930437710452642455058429395604708926529298923428519360184552116", + "37": "27623352308908286682197442773696828064780759541825113166920190830465760115310", + "38": "24467178523527661412490840403895102707219693834308197483111012821849214625368", + "39": "23728113528246855478500232569870948003639556873931983873702722387224671507274", + "40": "40129666380656807062809606434513663321184682779877056834215304787161622530992", + "41": "23196600856704274435727136372434040707394830440542391821430543031726044902028", + "42": "8215865162361209177076800640667002682904703694618158726144936914506095863437", + "43": "3321432016766039564500829840965935044807999892231160713467534524496739885083", + "44": "28396606736882264536595363707806916216399321241793162972947130804700644375984", + "45": "11194814843932421015565967864086907107533146380253464829460895377752980992085", + "46": "10247629864320245984498290366880059792803521307928493823642220920516164182974", + "47": "45540947434270323589980283215503197959394615493726851605142801290557895945522", + "48": "6351410723033070278915663444147684783159571748995149346685113381367496940470", + "49": "16646450007547282223758767567849289455552591191901648461491104448301851645160", + "50": "24889229155976855852906874602243636161245617243340644213538531529932171805657", + "51": "16505800654202230305733090602177678389553495759416075701766877632336332944277", + "52": "7675925178062114939817324806065476013942155510710362786272913586341990387463", + "53": "4359946372430343557819891012909070894466214109202481725255824345350007819348", + "54": "45310328951976216802832977340955247700000185785697448432973364509588835227620", + "55": "1384466495725852204781033898726991475424675908064122876245360290035272122590", + "56": "20546022705070598934171404288007102076165295582340576848525332838925487625279", + "57": "31529351690707589786177302613748003542923394436330434021084483472278799068151", + "58": "36579664282908550417057810780214348432407464125259718233915609127479074532371", + "59": "21731188521940091435304189115941138939077038176310508314733831383137706473253", + "60": "31242499920666589644175623123420152488672982280975416311907961288030179258970", + "61": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "61": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "61": "1" + }, + { + "193": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "193": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "193": "1" + }, + { + "194": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "194": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "61": "1" + }, + { + "0": "13746050345785052659407845574049356403121452981555493239274450074369130425982", + "8": "12160298752630338254530407945916766563834922532629505948426056026762355688759", + "9": "24489210578788599746303010662424713680859298825664124500851658126460028611472", + "17": "2416282630496950895368468643656141052319363876716233763023393100414280100706", + "18": "42981599081066594574328294535999978881017233028753835538536441541950646694255", + "19": "15212058715196543168691534562115742556260998059165932940223155050835392905871", + "20": "7202642958849074041149709775648076784468091348519822681347269528720073196143", + "21": "6522432676358732147478141817940573321601463188148893724131345313299366277943", + "22": "30767391711383501088521957411965231355303322859244512663417573036486769560650", + "23": "25746217630755160409444044629613582263482418055996449213633577488700523972799", + "24": "21021489915403929056022381202339071137483935615957803312647510804006503608618", + "25": "25542488973179203547537575381757126623160646063126252149260646642491985455010", + "26": "39202783094033560367251586850007418595231762966762456877083689422103114302873", + "27": "42659979988686870538834442012951157000488835088586275318454859917364636180137", + "28": "22430322677324130181763040670691241668786011709052687276545407961918692563488", + "29": "48406987307229118673240050520579202466569377333779345715053781378573549122625", + "30": "32512762645259969846085846374668170239637901875870563058345044054829768690833", + "31": "12964332751459612423825674278436953024702343697445272589499909315219193614844", + "32": "17674929204239727197236875816434856294782854402608690167877003244499062707806", + "33": "35996901399392717462862132250727787257166816817003415696247648759044238397277", + "34": "28325316069932751182520989939110557399260474921579709781574209643558465758695", + "35": "21833357143948235033591121406164464285108953595523603678956916489804539718072", + "36": "38331690060583629680685237980166619778480849178533510350226140209194952416669", + "37": "1910008285596138509433156975888508301958334203765702016398433769673831959592", + "38": "20529999853741449522757630250231340974686162798879163149077571373915494358582", + "39": "47621487574637106182778429441529768269093324718613739643526908500865444681430", + "40": "7640467605139465408312247914559549873127370928782720115148094253764904080185", + "41": "35573711437974105808858853822651224195828755279535917162598043903770539612809", + "42": "35715418186459305889507607119939666907048938427469427022964475999452421772838", + "43": "22336959598789106495327873836901651981071934364977905040499914092266492901141", + "44": "34511547816643469568866276318926640155368224942611919472019254390342347425444", + "45": "48824917938452478622888631878667621239852169635968133501076368017563996390439", + "46": "20853660078940660344920339985103970034680290671611986933111153861490558697822", + "47": "10571432867175603940150031107922561124766978468619575879683648289217524381660", + "48": "49493276046799327428140895006466786215873772846362310379203146808983456575065", + "49": "36713702121150926082432966348187867976049574274749083575831213287992908318467", + "50": "26713043222935439313168338297667161549663121998436625146885077388937336772475", + "51": "36921874834948147602387153908118301866871622664597884998360102167718472222034", + "52": "21171928867526122304893463972788477735084019247057030465089017334283634744053", + "53": "102857812645606371641637208241588513525948993002616265152481194966021407713", + "54": "11157164996773026209481356607883839838979228741589344866739125352400725182348", + "55": "23717811700099572458850518496200474317486991557110676129799763478332773039046", + "56": "39414262539969457155290717359724715561792308742773407579245220001788434864973", + "57": "14340877577137189560256276309492674267175395555397058879478961925444677924606", + "58": "31915161442890750462810947067448112034018865009430288942708990316341338025344", + "59": "15874618092216782249393338768265106006925014950905031167874131481528276254681", + "60": "44678910721548955339712967126788169304877529192714225642695406925806633973101", + "61": "47156379770217313095519756335734358221876217483869599784859342147494897869852", + "62": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "62": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "62": "1" + }, + { + "195": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "195": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "195": "1" + }, + { + "196": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "196": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "62": "1" + }, + { + "0": "14759221361221742392877550517283338785302973165056606116918148040408389214809", + "8": "202407840431875867766643426059833405749180713740029168212121726829111456034", + "9": "4389625065657449317030702350118528836723412888175923456795303622692603348461", + "17": "22124547763030614956723956856326261205118864432496713670905557893356629288740", + "18": "45015563437869612030875693329426287865677755054832015531433903251609211909263", + "19": "30132039976894230991911643394121154959353962970395263040064521052303401753375", + "20": "33261906612104730940158418188127527192912654771923390369884450357809733512018", + "21": "26075012561174944464659081211721167856622575581389757714824703074162184755500", + "22": "34422329714935664530650383509330601829983540590145237423922650433433290306244", + "23": "22826653351476414916129886030807788398849717147480080565816228954869033149809", + "24": "17143881673837099860443000027845204658537360143875256170701468782769380870994", + "25": "1155594379190122261495268389870511496052391222425417245436215318946864734397", + "26": "27994354284010570886378705670130542222881562968881762784737961665295328109152", + "27": "45231133596052197635441293735131396095159983596261768316187212236318546544039", + "28": "16262625025122187759545307417174368345931365220187530099940772777713941503773", + "29": "17744349920858472243804562537874098925427018001413294470494809327274841825536", + "30": "39349295918782787440679267240707908956600518497269391393014839001610583708951", + "31": "32757745102683417706190882994574011250024626837577371684864966374698366374416", + "32": "10378422045359168268143655276949180380523554526659479511729656315605983861813", + "33": "20295155718568791125722514790729739347910862321393260313425396612833381792986", + "34": "23673313318641707960531293961064692186143094921293655158657384119991662470445", + "35": "8785396070667577989992666411528897019609520717717293376504614371173471548867", + "36": "4105435180062589839415042674755865976958947375050106721326799093268850695917", + "37": "45202079445709425613495500848516752301308963291977529462377843726961768403108", + "38": "44583613145060041115161155641231271374067442119672941778587718531269742487124", + "39": "41082691868835919128935860287122418783595901946872388164274532321275156677148", + "40": "29046324304980759156362827555335638076628152980071794850825882786495925128687", + "41": "18667535964814177829900659772648241778938686873519814281138220943998997612903", + "42": "40387146549309737497467663883891468396539144007385755558789294261647364013939", + "43": "13979902850909523934126392020966080066041119739795649557053411463088861758217", + "44": "17527637028087741448032923941231911813916383117712210814057933375044595533521", + "45": "8093583585228186186026281210884812121230182868152944202457872179246298741037", + "46": "26476544518972331283253815016259224039059162169809722353651089996545464056047", + "47": "16930513270556706168816870780416023598389664126082227060736388156415338467046", + "48": "26378167911658665390128023595423353673806432673057019895828190214510813544676", + "49": "36438971143067186466459211641069632178659359451497133561777853824712959150707", + "50": "31219984588343227847567592575943601250271080362604322004882881874762994202476", + "51": "21531408845797380042597696391618043923815122995271396214228758000829838292801", + "52": "45005119603522978749818109516984003357286054479567303857884173247462067307659", + "53": "52158206475962808364205342072108229411532691697245532292168363626638390530973", + "54": "22972056838090000140748294757470531319524401910776998371572311009586332693783", + "55": "43229442928392347842299135599657644251105686012690357203224589867278468699484", + "56": "5880835793078016588051561462709350330896161665659458373952555687144518761911", + "57": "24568610925075405039864661949450358667168673161553757339074381162686686643210", + "58": "12539646897245244286054609727668992110829914176219447921630768207798677120345", + "59": "22877905117837514250317404440252599030960777959680398572233601350668547841979", + "60": "7143486405429330723189502435109301316884002952786063678248225165035176463854", + "61": "27419536701911088779893332686301237261792647785541455115979948637938215988950", + "62": "22724626402939750092672426482330819282956047222097810847261056122387673907003", + "63": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "63": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "63": "1" + }, + { + "197": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "197": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "197": "1" + }, + { + "198": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "198": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "63": "1" + }, + { + "0": "12918384943133505870596332126482017188382093626741625148832869110825500058603", + "8": "37884471416135629084723192987622969071086230264500793597466006263030137077950", + "9": "40997719029526128938822562421152492865154216291293700642781556044594017130687", + "17": "28422544056114001658103762492539660648378977517899528721398186317915948612359", + "18": "3777851713579777371958374617881770761271960394744080397007051823789849641816", + "19": "20827762194490943506410781321651756764545592934544937415436559374710741109737", + "20": "8539356410893075195659365992316188968031657384439031113700177936830697517126", + "21": "46557132888501387188241359432113836916710605499313174639000457027283747484879", + "22": "34978267062325686259874599292218175361180457311333429302345318509877047033559", + "23": "35219361896831725206042534504188001395081288968945915824641456462653969075853", + "24": "35596816375591274151942729752532234635679149886114395569813380802867966213102", + "25": "47148162502421090881221294300417151695945096449423734460024056913379613668879", + "26": "29651522042631797561422500254422319203910570148836217744653014334164403772943", + "27": "1847631130218946164597098437158686334545365640077428838105219075711049634604", + "28": "29307134038554350007637632447404944007917016757747002014845600111364985803941", + "29": "51348434721896323438054108232374976710317278715495295660141702151571596569055", + "30": "11538985237996048437856555123431754598334681850862992672846414529606314266722", + "31": "30452492680584036611884799638558477586232445724533220827796413838743585021305", + "32": "10738371907775639766377402684062060893726283997071754458567283588906748285425", + "33": "42249561372145875564584798327160785961939181991103025819325731623408043502846", + "34": "17384460043942341460753370117147480611077456175890768866882184555085093185196", + "35": "7324475402400776752613422030297234561498002095837482724161990369315988202836", + "36": "14871871983284849586898314185895862721722540673412961437338782242046066203720", + "37": "8791752674186288337434719118017720160276642641087529536728799257142194019788", + "38": "25863809413522720318490550545243958988225776745373671280593540276989282981518", + "39": "35685300507826852096121812557700271526493381219144479637112669279809775634248", + "40": "17960006980736475815000058245874904596782169554537034715563879238696961989605", + "41": "15147995969583918611422482441824641725306720470228930566133362853229743868656", + "42": "37939574642141313900644464917258647561262068854008519949337337794397706450390", + "43": "24472467249941534687992611259859372933036087014776849400815946180270625819405", + "44": "34795645894334562558341714221686236743790934315646650188430670601999528951212", + "45": "38767101515793527839724033728231422891446012493820979522040624599261645637887", + "46": "51842944408328664131488103675314170545079642533026534611369105342485959007095", + "47": "26467268014976196626683570195589840758388162413314253062706483680791632384255", + "48": "36184737938426586089667113896921975582648766381854376917666556710832395679768", + "49": "22274491065043784835874413348941313529531557064357999466399937653111349248361", + "50": "19181509388264500023489727959063259557029217617589168959461022249029388383641", + "51": "46335338763635641898985867217132651878286217593127042861085708065485767667048", + "52": "19417656836045927120748987511559080650879372396173767406745654045758414567495", + "53": "16371970590349766009874643690622166771091797777676607265789270580527510135606", + "54": "32461066818222490038688311538299905988991813620133592752338220509248469684698", + "55": "35545969304008272171542829103829330482452203789770741905697711244411776816308", + "56": "3585214683093891494729552695583340390838793369189982744620754034343267965683", + "57": "5717250460095572680081036252697272856749341439526325479554925055633393920012", + "58": "45088810464445420970598504738085820976478745955450740198720035851613285424806", + "59": "22889678906707205465882207002697731324433984931875973764116893412533852353562", + "60": "20246726150842890101123626292770561959755012050100455971819281434059733660399", + "61": "37308293285466307167049349220612089335089218718450562346102192007264820097303", + "62": "11526891281939313199283915366936608788576466278315840466850096701862306953345", + "63": "19329167694872896057870546841567444325193072978814365109208504264676308420872", + "64": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "64": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "64": "1" + }, + { + "199": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "199": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "199": "1" + }, + { + "200": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "200": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "64": "1" + }, + { + "0": "6090669736471884927589246515939581624927624112611999595504716515722644260809", + "8": "18105251099585817569835043999385430215806563651193888127073386558902396596344", + "9": "41526291405968308678221194608828183005211853992667515271879265890974408750226", + "17": "49219509368077229192942071442807422097839945222055444899081529892516169321458", + "18": "11334560377258205833144348273135474091373431022959076454854066258193704327890", + "19": "2506508100877849499651303207301636670026230837692870274229885413361621870185", + "20": "40246447128506644978850804572358196374832247163743673671469340334972570231358", + "21": "45222439883624862587946396030080444588624721024093310773966604333822400945002", + "22": "23479663061856897000062310324514637771716867367139061550699779575420501026181", + "23": "23338022178919762668066885868754666854455717253264977457455256521992460756170", + "24": "2814596005228444192350999725740468647017485705068745797397179203863814478623", + "25": "32442123377203054038834281710321840020860763228199753516852116146595162114037", + "26": "22687386648875819875585015987517622435020679537314158956442276325533979531821", + "27": "42607835634976770906793119482717689012209402340391075236842715291294189368510", + "28": "36047107014043816788456772264444918742940686969403091181804639631605816343675", + "29": "22969419565233898168994871240159902827951596689703514828432608694723116107203", + "30": "19924728791436406491714484631782892851789178531173809577475349495899031819818", + "31": "7335824083778420543976623335391766319255872057519501385585542331257382709970", + "32": "14494490028954701737605930677483499025021395479613479506863034869705024032280", + "33": "3112583029899138538660285395956980830348094096912762028808367745082961581141", + "34": "35291127916319902928033830274267769857513523206153555626135063764014496603616", + "35": "4400714566440374574744561101193006149424032925832886003025102748254307346989", + "36": "36469376918303233933766274358971415066132066433752538835540242385238637431516", + "37": "47024657524237091558130579012841298812529206391204800189813171179474302353016", + "38": "28487291842040381413744735037427728615151302117837067425702500383621279598662", + "39": "29561222909992054111416571039982623683374336269353761486042174929834579869735", + "40": "50508781043589651771011556653927758176062057933242227547157410243315868497283", + "41": "17146615808929550296773456530763421355236587048146265440186773271443776958466", + "42": "23831093463760166157409078240763132662730977225061749719269163834674590937102", + "43": "9104073966198879983757819132314587834146985487258225551145142651317073690951", + "44": "37421392875808188007537851763884460124426196384618642693564751819575990531588", + "45": "12413895683646046925942597159696063185715352142515623481609090218549742921064", + "46": "22696357473199461416570771076555296991426639967632882877973822166407886576276", + "47": "44352580154064927153763751358768744093128095445229789832138430581527101309215", + "48": "48517453146321583484203670059007142342037697323539465805659974474904809507251", + "49": "21958683350938132268140867475785616243873969149206206814383773314047212966971", + "50": "1173836269856856295028964019110711116960994767738047215334016502772772047504", + "51": "23771401865152851318715410824609768029118131372140592123498772566769121634204", + "52": "31186850478596835615755162198441498862549854163207382962064308273977816309120", + "53": "825844607743784307945347104527361817104784350321657886580894118679002291572", + "54": "51134953916632441060462847180166796025218433023741590593889493636977505417173", + "55": "35619145164174505356266704107412060808684011660269423044995482227874707825377", + "56": "38006681173682221167228564483182169105601655732033660936879138556643675660209", + "57": "20160096619046027285451124384487669973338585183637016507512971648785247355962", + "58": "39339024394244310857002919951215253370549967835254042446049442860469731544899", + "59": "25412228166228200904079093833840955100111534127125963016657062390305530944197", + "60": "26139634550891915320553656446148719429708727411997914181042225639970370428498", + "61": "22720938231177202001939796125063120366308497298844865491888693096075225403213", + "62": "2137921758406683954443404933020497542127313276607299321099632492248859975302", + "63": "44525510071135339933687851559324847511100413984904835875185688339499873225170", + "64": "12441252914149718702295129466443083148043622311789141603181901700485078285379", + "65": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "65": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "65": "1" + }, + { + "201": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "201": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "201": "1" + }, + { + "202": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "202": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "65": "1" + }, + { + "0": "5818256914990297609452278687275570020517086210519703828397962481130049333349", + "8": "16886079687541724562690581328344298917364793110879854895831399777116893637240", + "9": "48120063633031812035166768434439480639318970907693851558904662831111112572919", + "17": "11549473686999029992645724506487348379462282945872767737452958571673863440187", + "18": "39497379618000149296711855719469117254948881653652385085599228212306691176761", + "19": "37626527554054003640119820408171354262180845137269474728630411854620460636604", + "20": "44176145540096700676915226978695765623228912160013981356498432208717092862842", + "21": "20172138230818294496585292994197552446414738915200862331716424599255839772622", + "22": "3539763778150435811442849303703688861172949084256459494751327464542589249373", + "23": "5302853349950207638849857393260799479358798568039238517212315122442580998843", + "24": "51395342537742067628806524007746481375506598953772175556135273664459639749332", + "25": "46351734528949099020871844310701449434921999874202492674249947563040312692035", + "26": "37156572147558103991677908746740193329131617612478837467906922459217526430096", + "27": "26541857214625046890505606346464772162956284166089401764860866768125413560399", + "28": "49272565304209497471309843271642650670664477617740860126201160730526378524153", + "29": "44641233901811704474926795588119527505940031447103674055906826303067924172063", + "30": "28928119520625370614448507762698367735494676561915670084893760419469006658444", + "31": "9476171922760572905935739764332931346265314610313639961960034605297840304651", + "32": "16625567146320184745768815198749953598851527559448099631478480473468954425474", + "33": "28329392871781854888581019046861902447981492336476457427733271269769529906676", + "34": "1369661764262020529469445937917483207891748653198732779280365052042746176564", + "35": "5483583649041200701150335130100661262616965605597784004779741143891263402163", + "36": "21951495011660570322796526825334043519803200448462712324197994917016906180456", + "37": "21398636118643343201390659672066247311875318621993092564779843538570692735008", + "38": "13307876292837631461539961906040696053480825242606323465448584389064203081183", + "39": "6236991249635313076879767685753337320622240980129205013195900938545317467253", + "40": "27835397807967762240261088384156775751784649430355373484614647602637774534671", + "41": "31790069572885742795717808500100960455111161536268504809957780615304573694908", + "42": "20071865382219335471577788449738322920232578359084575210043654623954973932390", + "43": "7535528675038112428031242515022606349587975693734031438879292876905951865144", + "44": "24115460360816387445486595341638181040754598857512413453005479045949963684894", + "45": "48865535761889611418824055480388360015872134554790443375518319438802297547250", + "46": "40456865076202821997418028814632984105252177423838328529121856187471207760025", + "47": "16943061436318094287561257477872730952359684242562932773702873251838744337353", + "48": "31207628300866901298463342096415156137057489675842168463213931480649376071490", + "49": "37829864701184972740812235598093157528232987956785507447008623045734747424867", + "50": "20737210560007762890923805944473968159483894557805546906694965050661342446736", + "51": "44725602815927210898029025256526434834414763708454075680766616021284482042493", + "52": "23822670638298706943959556384153359137573323565974344864429928793545362373032", + "53": "23490647444586733977238678750275615435881433066126286406681597357542937199166", + "54": "4442368127083219467359858382639898829367068849341350637593491732272100353862", + "55": "30002259305586097863990530495065626559773373913960658802953486745450099759553", + "56": "8801453602701519111052530988408105862276180928197579354183531401224304573101", + "57": "12532869501606963398797723910612090230718937099261431263334640622293692290665", + "58": "22317619582477753815482091271128515364228446601650063371190563728683969728070", + "59": "51551507597405477301911508867764058885057517166346227055341170599660695333090", + "60": "12487389287258251428934795629306210046122136011424889557054482782731930839930", + "61": "50049286197091948785630681053055790564422412751107260739903691917452633628501", + "62": "13097122013095355616930354035744060399033782903029472199660181880283766937835", + "63": "15281855757331157959533326633520498980204938317757711805812320117113995302056", + "64": "7785813985806907566232330210379162160750217947757546496340799009824587830275", + "65": "16275755461783187583809512826957500092486877567197714174133477045457407719651", + "66": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "66": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "66": "1" + }, + { + "203": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "203": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "203": "1" + }, + { + "204": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "204": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "66": "1" + }, + { + "0": "21665668991006174860786913595488512200171275130423190085616080866607498513357", + "8": "30507404025381522269600131880367962444871567514246386809469375298884173043110", + "9": "8875539339103436460218999392495639490304489488901678588388085548698629290375", + "17": "31204636303324709434999301738982489604338652711355462544530211397885986877711", + "18": "51846145419202947923327749015372367419306272995524625817328537421320430442239", + "19": "1111718517356132532386590672129414904199161187422505169286434521433370608479", + "20": "14544241264016276951029946978958111569079385799757550086488106899444827457842", + "21": "4267787217702637664101856010688561941421084834277670936342248046379441389167", + "22": "44899608136002230894196449081929888490051554629422855436858915883604068466546", + "23": "52330272032963331145889624003938742272270289693598161106128351449541450753763", + "24": "22572195481986825892758038478573625010204260601764183633754280744995582703762", + "25": "35794334857998514323903583605094999232820689675686940869136423897134931675488", + "26": "38785414255245004492635961001004501653408126959239598918419982980859822274054", + "27": "50191488472862114610701949559547755110863200324993249084218765421223986993350", + "28": "199242690165686288073913244503430578113264484790644664780849154755014186792", + "29": "46383900825122832006482745001285028074169464092873540455868614874656314567126", + "30": "850983914612468364627065902686152028620080509323729024544645589854110617387", + "31": "5836497826779138043522959714413400435809938416927786929179703963888146228859", + "32": "1784393604819848437454000489646311656328319520328328583736364716606488345507", + "33": "4146278025383699246168139850447714143023267822452214392560565435738887876599", + "34": "23431500533368174412390803946628180151063938913480568111285430064921914692158", + "35": "35888234271154605161351721061806105557630325284349245823055538970225020471026", + "36": "4469363946371184696492043002684100839918548381996842877990046449209210002638", + "37": "38071831341898010261465071397541893469847318059491195957229791252292399356917", + "38": "39567776739556138363273968517160372369626996500353570946604384895739839584059", + "39": "40917172085802706071657971434472012495079766543834967122796678595363781360904", + "40": "49389974474944355249948888394445555273223933347564691577485627516521874006781", + "41": "1932404071083105703701524852002897608493085449532510425826262742997783288221", + "42": "399534921351879543424711924539329248284479211244687002564025160460570901805", + "43": "26425394299857290643386038211766540784307009640320527060942463427276745301379", + "44": "21859962362666448427681422373195733201404130832094422848590978814638696650587", + "45": "8526435779607488789490052945552966754318815158341604630915538292938845526498", + "46": "44576254071620971100146600001786112291291380389478450630028412618411598248620", + "47": "17106549514958316430045624567551382874469495708991882176345867756050584090460", + "48": "32404030672645571745776353209772645610996757728421467654913069647807270673015", + "49": "25372360495812822398972241094506552408326261090071227231284863564308763830455", + "50": "30046288344231147739273279154052856278368214827110836559539783191839250091743", + "51": "45084861332213492865636229857128093772131937665846776582036980131414987663493", + "52": "45765275839105241652834088562886647103655014791876098579044387490654984850556", + "53": "3124055724428637395135659647837257059523349642196739624095905473716900902599", + "54": "25004876446586064813934950007146289962807962920369542094480609911962504794042", + "55": "47627965322087120269019873344546673114991648862075255773883849924879527522125", + "56": "23132172113907149861532396473924934847100690812932747379469146711379912405042", + "57": "42629253066145047719028230487301821654265759428883944266596267612570718789348", + "58": "5943001090118508162539351810387751400551993261793535136057052569165765825830", + "59": "12460475920522930922004415615623509166787837909275476044607188615432040726225", + "60": "46843820541314873774898523881983574521088091530972191296511045440327015033072", + "61": "14067123983844959682538161310095965964167648712957484795009820026164582381074", + "62": "14119055534806965132731330532400309559074028456071264674781592874812544450141", + "63": "49050943537647976300239469521371615224390921443321014892080731068069501025948", + "64": "36562725080363385624164461347437875870902427394549599270213519318021459865031", + "65": "49337876944525854017704900047138067109843203981615246324454897016961714568737", + "66": "7633106466419211795855349573109400483930333323377713263919614912900007318455", + "67": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "67": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "67": "1" + }, + { + "205": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "205": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "205": "1" + }, + { + "206": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "206": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "67": "1" + }, + { + "0": "2268297495968854614780848291068505574765456615293615512346180903730018964697", + "8": "35877990414132628773605193313470305323317814794935389655621199110738954837930", + "9": "47508263265065616565570489821155015752960484475610334461200710438181333320611", + "17": "34993532542453944782979069798391451723163362083392903233557958548457185664461", + "18": "13946790474995103029760579402879948960490746331685120471338455859016735048311", + "19": "5901599305185159007975560094616575851505988538342891876110343594489658570608", + "20": "29928404026726806152943356875525932448637626674882100757214354576984966884468", + "21": "49920664144093215447123878523612335841597358292738938595431798228135683243263", + "22": "29183082832215219415919710524036159512602704549163381090393255614084206512487", + "23": "3098312088003111151651874596986880311682801092261129304427154548059658543501", + "24": "52355399735396209126434734733906557274349910395682880401590612141527747011267", + "25": "20311895988813568086604447001343791076437636703294720569920436354588084488412", + "26": "11317097308005776684955185499374537793813088950866298750942236326874829776010", + "27": "18181996769109491533831183038613760199412477790365964460880177327246591485895", + "28": "16565696322261620813963399706583313549678131517253913742133618117724633126384", + "29": "44178028625176747457397681326359683868666696971148465888162563174035251275565", + "30": "38966834234439017273064047550249941995200699743111551759739450629829303505192", + "31": "39710776913835611279773173882878998455404467744588108206406048176458944163414", + "32": "26307267385156089604749558269874327914501651529986548980701524025540511606704", + "33": "9770225215092028816593376862101366977309661521800335443692058949454680095983", + "34": "35261394279360843085455004570849171890873533654631950487518419775167834053794", + "35": "17032654095748550186921526559790477729405407243044450010473191183935220095626", + "36": "47267290706759194779749403039573114633535476855059484854433648428364969127846", + "37": "49521191618268604122833499491546422926314297069208628898242672088079247257546", + "38": "36488870844486706860274103279503297345323916209771043884753231642539946511567", + "39": "23661630248342976796394953001897902025975495504377549453605686753250476342768", + "40": "2442309207508135740580060584660569878787082124636639469460095405504941546415", + "41": "32433039857633585405348572521286352753051022553763587133322973179785228004702", + "42": "23373430325134341564374600231059458367357804740037904695429377573404458598329", + "43": "42126889597291198397251298863497822342481205374510784432119973740468648212136", + "44": "15859486764029342941273439325843903606406770011573061562310801627352889111151", + "45": "45087109542147330325668865737995461133456581823315464974325553553704382801784", + "46": "14452179250861604040765499785175408800203224749862047924816304318262621594956", + "47": "17144917191806268086959561125255161779452614799253146195852421894573871720932", + "48": "10377364284453390405152984373158716609162878046888675265631266476888733118630", + "49": "7358894747676596288502669068422147377112035379280138905658048225146999120370", + "50": "27104349451124518266527554031794280080077406188302534178981859553938710405172", + "51": "13548117566822831253753893830960538144353363808076203114265716335983139660913", + "52": "5813665685938423371174187948977505230669545995930835790709433610904873891158", + "53": "35010200153801518012357001201569280228032473364221572970546426171016514727260", + "54": "8785914674829638682485428870526287117110406229548059834565682842442278791520", + "55": "33886343070008821587037508535012919043970555361603486500896135983365045881841", + "56": "40471542637260246260337945970835116683190556911775665131481846516348337210818", + "57": "50772393795118986662637878085089223691951270244637696147762773051405511599347", + "58": "50753684863262172033541609577795092927309370385750442004030999087359509178024", + "59": "41682731753085550046420817738828916289699410156228435898840882883631225679282", + "60": "42131816690084251573065091413248422804960032593693648819011413706622920230327", + "61": "49097085622213271749682042666943527374252071464076995078188797361569829418449", + "62": "10610863780848317008455595187171729990515669742149544234074900074746732993427", + "63": "29781002550204903658383932783882304271542732656029231451387470735822187075338", + "64": "51776527002339441103956894491367914103406030116412254049590845879491484759220", + "65": "32736693839639572947835522920629067561896969430884632639799539126874894890057", + "66": "32771828863095421310334648684039980848345628200719161861599593264420944609532", + "67": "11837011406228020095853680681968268735481893787424034497353581492517584470585", + "68": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "68": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "68": "1" + }, + { + "207": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "207": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "207": "1" + }, + { + "208": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "208": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "68": "1" + }, + { + "0": "13973211016421000871032597822807506910708863418864348758128380360422656258892", + "8": "41118576002653327499770609016905077860087172937406361336819233815720214462936", + "9": "11517314634182668778771923197452888350046553913028069763707252617830626027291", + "17": "46587966413583243472263752481180461965826054643500807161411831304366826918546", + "18": "39436213021122964038014245952841684080810261617186442986621542783795249860062", + "19": "10018932179513029553888257484959005143128826038685423381503216025190052086095", + "20": "46460985945321966592464567466362026442234216503146633196537877181564391083476", + "21": "5908883549086915351765209385369358621971094877303381421917924256599819056410", + "22": "47960967091060216008075176276692203902003057182173975056120234521311565439593", + "23": "49883038427772347064611367186764889233875975879611438271784458452096273618434", + "24": "40993746929720535562602719169864240408884758852996005295971689780806548680134", + "25": "35688053528774992662759004656975229975934343876058043844830810857648560015072", + "26": "44028534546221291488523454446789123620353471121272351679708253761199035390732", + "27": "20346104874714566637789752714312695131443184600416931555253511747454845249125", + "28": "15812839473998102219043608654885406364356613079752581678150131820915664665163", + "29": "46286554907408251919609236558891349821694038099582976464342711939836906152887", + "30": "31702649422986590810892657089742984286878491272823648297179723179481267741197", + "31": "44780221370017494066854628494754555526078528612759659270267812530788072156742", + "32": "48619117205137954149057858905660464806810241495253957117013513237262764634930", + "33": "38560325351523745974420206197086782236927412873373082012481006118556803825594", + "34": "19740160354550333981745868986277470578854391505450441041161324441829111815779", + "35": "50931635444526673034687009335803999897525768626455469728589872661682795986450", + "36": "45439521820153132828424846573450275866573360061787681356223254678804194735919", + "37": "13271244582374382551016842801156570419421681090068697938089697133288725563519", + "38": "14752503463130422563759796120682237281392968535271599546430110081533286343064", + "39": "6911092654582091827842824292020762604327519934363302553266764620429918730636", + "40": "14340036000420207043348163927383816914746220288770559736021681161648993922410", + "41": "40083516194373381922512640448412979416663195485914765860317920452914894137528", + "42": "52344664480053029839987054306285306390036343318460932681161781276576860269724", + "43": "40578040612578296951712727693847954128466356338067225008030144085494953494740", + "44": "7648018416564067493763428363704200774754966109444175367096507168335520864212", + "45": "21680403839205765914026199590281113186237655529026051577642916763972951484963", + "46": "29828865668769799544354542262967935361939111516793405358539406238619305184889", + "47": "26572034157615763740316582558341821743972964157027373462938375555888956297754", + "48": "29735951033867555626301148938281567725499380253026544707851743576969595221161", + "49": "37525459778110246792534870473864244146624364672574355088530612450474543472408", + "50": "805462877325465322522426328091680911339128260564495972276581418717261478452", + "51": "25486437027630641623716268653384580237387229341488144306664661553146846157871", + "52": "13985216014824674207436227744683187903200441927312966213037656845990622275732", + "53": "37181615508203272185119848305681855482311707276789788769018606670808903478486", + "54": "8518023537973289982243295684343710770775440879699134108415153768499953370401", + "55": "10058459074016898471452840172912664549765220738943102031231816162822299966275", + "56": "22917775133588387535647206655930531757782137657005273743589892010467331324730", + "57": "11961339413556332976088673229764685070633315809136005504541134060474735253358", + "58": "47218599654066214746513620730589797681782218986557446034580471365233969709866", + "59": "5589922617318229733440721291139666829941324114830458247390575227895077000996", + "60": "20058535264368568287169176021088436914579925121615582694002098364429021007324", + "61": "8465883864765429819610880788915776714870297415231000066513177018199257137978", + "62": "23699955268385785740204419017620104605659712114837548974541208370921358568742", + "63": "44265759655466264888409474845867917501364819735158580748689773146308403884072", + "64": "9779152584303729929638748541358088257552442603356569841424553548910411460961", + "65": "39520775488934540054907132289078015595467767018120758223570587099591342304980", + "66": "45846561339321469409997990214872591231331282129670948960544001629672878200483", + "67": "9425348310700156528585241699227789683580378754416749705070669108621520025009", + "68": "36884896577898408680381200313233480677158898830630579614146907563189332449201", + "69": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "69": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "69": "1" + }, + { + "209": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "209": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "209": "1" + }, + { + "210": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "210": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "69": "1" + }, + { + "0": "11877184595954796005081407550764117823731241224470762866371883626576306508793", + "8": "21077572762623317419569220287919719709976640199312587691191332146075002902469", + "9": "47949632535208881392940201692077097151432614187331735396014917149206176691857", + "17": "38368477391238281893446748243478931109162269572982511754265021508646667481923", + "18": "25010413504798967911155724953359844704156939603246355564059432326851066180613", + "19": "49156343244768099675507263330427440646916355002618236878522293867646082309965", + "20": "47398467239961958234466795312751095872158937550036197115446880202038492448125", + "21": "14129873784233010472773499602376510597095087957746542793734434604295373938675", + "22": "29645669308682900740034715715100948145589549169030371988537832513804587806863", + "23": "26916306213900631366930900630691008901047983616874092235502421882352927377047", + "24": "39648316014469838046546777585395244407900626971317480765008940921476609101544", + "25": "1075805810326825888038456416810460180459853549169321212979680442629714834774", + "26": "26742611581046357919373890278067256831153690674060993158535463378878746430898", + "27": "30600176628266458666269452096167292830369044471722493024576650779825622135273", + "28": "23159865426933824627394912105045390189837788685453318812972678308193378695975", + "29": "33569207124589688449356319675784204004766931668865931971563994396529906403187", + "30": "34389668036370475501299119755998547058607688303732622516542000160673745284178", + "31": "1201798707829091660443727337089362654847125778464792356989113770070872288364", + "32": "29845572639165180741694798393928453145630079926987904517665346038212264126028", + "33": "14631160877490948079244942474541244801119854032928433756504111740729163437383", + "34": "40080609753519506809463229070890236419441886724017000051197473396542219151180", + "35": "8361138371948448311285813469916607579830825766161994386963750786396662232908", + "36": "12650985342504995539624849254867256949345148623701600985535203429051574018632", + "37": "7576169417291040709717076728774831320541040624447298181739202248122313602171", + "38": "18087080399845775229095049378903056573173506668471196548912476771635857414001", + "39": "50946534756837223531540116488572134938982654402735777739074427414259230825084", + "40": "36152430850120088633186488364406493550709113103942086102379778957087739335638", + "41": "993276771261256858857042169222506230402365302699752273013455852746280656405", + "42": "48568789680343666247707229903211391584965211102334428224951392271516929758637", + "43": "40636188859159557363665675749214558759494650452686193026013807368515210439665", + "44": "46029772444293865102396247527894365699964101588507493497848467960320314917280", + "45": "26249266637970821250701791146259620460777979049839894716272063798452506263392", + "46": "3588323013854012084629250665015774914417947451028956050559283871784121755564", + "47": "27109590105706386751911368719399129408868932064117313119612544754388330338756", + "48": "22842822545771342020646655049319906953380200972650402611554077235462209818744", + "49": "4481701207614816479212884529522984229788773295017285833734949187833907248712", + "50": "10213800354335574509890090444126910081412655199462394453887866032412554538590", + "51": "12911943786842739437184473431475581999292974959447410640796233279857677718817", + "52": "9953473847777408282039697356162319099764007545595606707817786873433355552161", + "53": "675850546279934170761900219528949739849162557392919195060995017481269405765", + "54": "37630393373926502771973655787529943576221548029162459755560034000722212554220", + "55": "12764348908927968630335282140605320883671604457737073667542217034924708893770", + "56": "50706245930980412763274865723812969485072355822647075620217603803995672106738", + "57": "1170569840686578571593783892921588945640564395618550102898663714722873711940", + "58": "29844653650692950920043964778460482972720627374742711739308279164116089505999", + "59": "18464885054601324998317635257092757153354585078611883357060516344786915729621", + "60": "51034031034174421579001461851074144295242117129458604025079465337815247802023", + "61": "24778955697552677253359729766728952442064159772063529404597405190760506153776", + "62": "35206763652405859372781596551484094937589677394707273006733342175552221105667", + "63": "31863332156332650826523486148821675507937894505329655680428907528825075192970", + "64": "14038018066923710868945460054543651344949412340612251004206451240197946620657", + "65": "23525190361144736246461695112605588687199766313886609569060779022129805130977", + "66": "17484638440332673076423669239950516695781461642246077937558618388168006796953", + "67": "189980255182371897597600816168632001776805331922811265704365136911656262124", + "68": "24043117171463576857503106808380901670448450454427930556859617127529380363547", + "69": "34149607076551728407708052728215864049135220529716137798707999116075456387995", + "70": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "70": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "70": "1" + }, + { + "211": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "211": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "211": "1" + }, + { + "212": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "212": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "70": "1" + }, + { + "0": "2986065710695845701959971763474802354333410127136499986005712979427956719303", + "8": "35928033466469113915043399639659388115595663327283483801836439615479370360451", + "9": "40455696369433843077729463423522566799126738105096803929288622280384348928712", + "17": "2070377821046805236887511169366792863565516199982155060750665611222443841229", + "18": "730266693970874542560968442839009003247188377557906130365397968370691750417", + "19": "21138048534877331069986216811680624563608361852946363167193856132642350499660", + "20": "47164546506419339267836876747949063093737113469719759935655345354175695026251", + "21": "30689185748703448234262132041340737297191063057911488291207396644118837270761", + "22": "18508814609533103129334687336852918949450800547802509687407995851128967364963", + "23": "5852588888356612910346079734468419350005206662329154334202689194112205727300", + "24": "3555047135542761739892507541791743801945794749751857066182727427049933710893", + "25": "6639181535566491953974324401044743150841192993343491074436125450940227135055", + "26": "5851444073600198297694472813949071919006059063818543724416081827962504504455", + "27": "46983190224538329950814556464139887068003818146049485849434972826866168614374", + "28": "8697110141815640923900358979950681479129278715519856719055192743061215189617", + "29": "42530858223969591383395652764346595577610068291560698348594871574243031887285", + "30": "28860976429283117875296951042629926267242349167693703055283898782129110848792", + "31": "39222892625571798302193951119855653828010755144089781462171043545173093187352", + "32": "25623920506484621652151013395132601662109142971090867154192510091472183782594", + "33": "6391294981766980758283359864598595564697710719915010115264829367667854611192", + "34": "46451619290714364797693593642112763687588469131175214823103449147068414914034", + "35": "17240676919560983407327951682391068430770222764862316748636651866053990698555", + "36": "33366828914434098972007358155103089980169384334739186333007962645150352073419", + "37": "10632265051260395101050517032159416883846080570056035198885104064652185608820", + "38": "14416105698668853344640206915482771885878288795304414277409458389310797881391", + "39": "38088285821811880332554533768367566906014274035598876032707127345197671837489", + "40": "46551418669439584200367247624531157159271564636676819172694701775220490399194", + "41": "24069389258381007174795235175796955597203591201567527460663172487081987433085", + "42": "31753491251047646634605532864497859067427711586357734480288798149316140483124", + "43": "35178258159430024200242830781396645242844466975304637025752813321412734099007", + "44": "8369759564623907108809020485256827974567250367000339427158839312625933946525", + "45": "47411799307031349211535248121832800944589222307800413519516151428178838010107", + "46": "17328197013774692120227851924722557076123775194668734088611376596866252307296", + "47": "3760127204406038742193762424839913221251768002357627140397901595701522492263", + "48": "17985365196672519940580341363958816473242798899364389661910095578528202341893", + "49": "17693147066671922323115166114044719695751648431858680522524038525195464472332", + "50": "5489310968146209531357143264968113861759434868091837256787531634478361489244", + "51": "35375607401499149611482639914370819011725504562403119428726316554210791710004", + "52": "51351628495562155149497698508457115177297831960488961711778767913139690999193", + "53": "24957314171194706081102671073644796793995739859511589051864181183579592270868", + "54": "12105214646230891131780055672970355755166280383461428072606712071701107820279", + "55": "13179785471006693208604028153235715933529590066614188792204748586533559343592", + "56": "29893964794106339042552443210878469249605406390493565693907590145799849581043", + "57": "13596248850589751633857848518076689125697626157787175263485056558458033483842", + "58": "8582371658824332645706752589609387815429932737009768296224831719122569432762", + "59": "32562867404828714525984124243971410561791224667243626040633861820690208762364", + "60": "4453816334057594981764115291155509081507978851175408950488981839489846059036", + "61": "36861558607422300624556589326824847427492533044157555614976027764147427571011", + "62": "3455617056076236170652612209496300062617326735995286278209221884554029737307", + "63": "49921233129480260768874187309792633646731332813540716331743011743937278080127", + "64": "28268135617786064985980604001406691848047249873260611671862767944965542978866", + "65": "38263875450537017129854351492513619516118371271445500512663148301365220256408", + "66": "23367921261126045456779665113846185824412816840217202773358575734522557992141", + "67": "31572013062006945038546150522672886613753816005900237824931889114428318884439", + "68": "33586798388780967328587204551546640863662079613148093423751107344313410784776", + "69": "2243339108379557042512080931962882760520111113917229879273364571107655112334", + "70": "40388393748571163542126751569869832775620735909491689280521974161775256552780", + "71": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ], + [ + { + "71": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "71": "1" + }, + { + "213": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "213": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "213": "1" + }, + { + "214": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "214": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "71": "1" + }, + { + "0": "12649794127562509279197585900369868076945168057811626745015439261348449322516", + "8": "18460568301597491007878900164052362248927462612777587403745087254932995669265", + "9": "10691064190862303452862603750199024193361775633701698219738043331397052322546", + "17": "50537756005483669615362774033579150435007325241201758409523155475539598923852", + "18": "44151662351522130204771062960801610572369635275211081750592416116600686257816", + "19": "44612985953893012963177362368347100205547474056889298641137417191180618350823", + "20": "46418612556749627983869955597143431904575741384127508709314192592764927221051", + "21": "46792430355948421686541864746937514997785791612605035230581794650060166440164", + "22": "10372014107294763511359448987347871729024609617665964681852057762277632024668", + "23": "15746914484703176943512617861662741217218839026709246646219030771298623339390", + "24": "949837953556186423580297077566238417367075194047097605831825235696240068504", + "25": "15936180135839524274618445341411624509848805467084480095563639515175327863019", + "26": "35661399052929284108306355547044524619400966780651402243253505975861253383056", + "27": "24303633886164997277195266046450010738147861602550592940768478514120593265339", + "28": "40770339283421435760717228293893053420022897746389072894172136686544980088755", + "29": "33631671877045108448110442153973608669336179496669197300149420913676619854288", + "30": "9735435212281313786054816818889380009732606741754008415341978388282611227769", + "31": "51356374076127903498371554796174649537256039802839729838833628877209893874730", + "32": "28603229448651344033544366114133355562345596220279885038057779594832037566804", + "33": "23932726774945329407028948443366546176932844943954767819203057641876144392801", + "34": "38048486477770062168235160169293363458518451096350594627783892339613045725906", + "35": "36667819662104189201565795928529578367737674212176196308756611302364276026301", + "36": "50312369276709306482447794879275303865858679848556909637163630977683758889073", + "37": "40640974594601385122998575282605604993372302971083166882961772980998039680049", + "38": "46573152329527245401147543333094999402550228387130577499113770084243033958320", + "39": "4923275582039348818678448104674287994231344646794752274649248326309595068437", + "40": "12470069672650358918724179454112997355528814449425359438655565554900493437091", + "41": "22518837206951281316923614032592840442877457370143896669898972215304804784639", + "42": "32786387939491905527679653399783341165477604395489634875885725964058062164833", + "43": "26802895997331561650984867742399229411641120218293853043084773960577450868179", + "44": "24838662905607941363605394876572784693539918934144065118606577461309780211108", + "45": "31216193637639764020618021860660659250283820023138966889135307674873264929725", + "46": "11911191095174083352687969707419195808840974547678014728491981206268612459777", + "47": "2362080850717757194188202462187416733947181980738241126975915103449537095882", + "48": "25745662595065700561191293220788139662001942770437723891000012600653461719208", + "49": "28140245600139348990629268116527996643000598625891819270010751243053721747648", + "50": "51751436096363252081363858113432111194503598836372712351332122404701061867817", + "51": "42108778529760768577798404187086628077490577913866117385024205732960377183078", + "52": "30813992311307374443071098934374584071612224649436358113020328600892876683139", + "53": "23492712686485208764902374462231435151209281258529959599300917398612926412966", + "54": "21519074573923031735018942202953742465795451099115310478204881198120764443717", + "55": "13279171940868488849400911348327262210848933822776793527584881528283026293779", + "56": "12065508657954377182012442695846643668233069476721162280958082114700635570417", + "57": "33809005349166058723728123142633200741310625521089992988520343036834657925652", + "58": "8168672220202151212224263402279952306120357211675188061793483598915640145790", + "59": "15840669771013121078993052531823132314230810375787734921546473546120793141259", + "60": "18811932207167141283135007664707227029592461883819414932716707079663507029494", + "61": "21370791779943868955072368082811193781258619493887306245699009542099935401902", + "62": "49030337676146277014704635145026496918996124255134633124406378833861771875818", + "63": "51515549193781248407019642817274561265310256393252259112547694057575168432224", + "64": "50706129836639190576468860988978635963401544111522556439056991219437760065548", + "65": "13819020399578701866935680572677911254391251122844270501318808538845470781335", + "66": "34071492461230958221148022014425493214874680643170300895570809304852071684454", + "67": "4262010540554351033770919624358198470659271395352575610869803763404444267802", + "68": "22508706532220565134086795478143129387737417566374055363406924625643630876217", + "69": "33785686673947073827057590402236732655718193466954214811102353404447372117226", + "70": "12113636918360017528534055150675411418158770816781946695031665943694998962669", + "71": "24250644043370111356525371269458070014942797652829008403143883916486475614791", + "72": "43286615009455031784719797295956349308039236872337887241869415538128324649873" + } + ] + ], + "map": [ + 0, + 1, + 2, + 13, + 16, + 17, + 20, + 21, + 24, + 25, + 28, + 29, + 32, + 33, + 36, + 37, + 69, + 71, + 75, + 79, + 83, + 87, + 91, + 95, + 99, + 103, + 107, + 111, + 115, + 119, + 123, + 127, + 131, + 135, + 139, + 143, + 147, + 151, + 155, + 159, + 163, + 167, + 171, + 175, + 179, + 183, + 187, + 191, + 195, + 199, + 203, + 207, + 211, + 215, + 219, + 223, + 227, + 231, + 235, + 239, + 243, + 247, + 251, + 255, + 259, + 263, + 267, + 271, + 275, + 279, + 283, + 287, + 291, + 301, + 302, + 305, + 306, + 309, + 310, + 313, + 314, + 317, + 318, + 321, + 322, + 325, + 326, + 329, + 330, + 333, + 334, + 337, + 338, + 341, + 342, + 345, + 346, + 349, + 350, + 353, + 354, + 357, + 358, + 361, + 362, + 365, + 366, + 369, + 370, + 373, + 374, + 377, + 378, + 381, + 382, + 385, + 386, + 389, + 390, + 393, + 394, + 397, + 398, + 401, + 402, + 405, + 406, + 409, + 410, + 413, + 414, + 417, + 418, + 421, + 422, + 425, + 426, + 429, + 430, + 433, + 434, + 437, + 438, + 441, + 442, + 445, + 446, + 449, + 450, + 453, + 454, + 457, + 458, + 461, + 462, + 465, + 466, + 469, + 470, + 473, + 474, + 477, + 478, + 481, + 482, + 485, + 486, + 489, + 490, + 493, + 494, + 497, + 498, + 501, + 502, + 505, + 506, + 509, + 510, + 513, + 514, + 517, + 518, + 521, + 522, + 525, + 526, + 529, + 530, + 533, + 534, + 537, + 538, + 541, + 542, + 545, + 546, + 549, + 550, + 553, + 554, + 557, + 558, + 561, + 562, + 565, + 566, + 569, + 570, + 573, + 574, + 577, + 578, + 581, + 582 + ], + "customGates": [ + ], + "customGatesUses": [ + ] + } \ No newline at end of file diff --git a/provers/groth16/circom-adapter/test_files/poseidon/witness.json b/provers/groth16/circom-adapter/test_files/poseidon/witness.json new file mode 100644 index 0000000000..f1f04e5e69 --- /dev/null +++ b/provers/groth16/circom-adapter/test_files/poseidon/witness.json @@ -0,0 +1,217 @@ +[ + "1", + "31232273693565690933177443835503636699764964887306595080004406327965362624380", + "100", + "9842592072096562740192982053780847714335170252748807855743009820904302908989", + "50701446129004058070861723679851844138491814571487424253622500774142707537960", + "2795251894010432905713865185664174299979130231545922463278597246216967809956", + "5761111059907949228974380389013385058975203075056009695887478576708799734379", + "47683181824399223325886335606956763639945526815456163296815820245553590268639", + "34320389318831151809324701654274261190953453403523552511510277052412292906271", + "49273806160521508760006268180912646801166473150686521525395439223992186486002", + "13056267851620141690709076785580648490595766208109774598967795176437311990768", + "49834844679966166072402550652625697903609585732578863130175942958657169537138", + "21349633007472877161747317593693011183910587800455122273541877206399133236902", + "18977998262159322181784324407336515834257167517134967615581319832601511333224", + "48002497218979526538923502322922709173768001388179318976853080849091128279903", + "866587974529386155980844332506695429771461778955877247849651206764444256959", + "20454076047122091198988344101814798393935424290186179890554041978873495892281", + "36212066407949692221727221436726511992381622022397748367353000012107873016577", + "14334497956018842272120480205060022698432281095912071033264455899667729793807", + "929724551545173062077768202634020480804884496831222762066347128046017141300", + "26204955778169658437835079301940997687412608201021299242426849553255879290411", + "22984485593398167382238972608560828841818025851611997173710772948004891095811", + "14363270014372603707871031000113963861409881419075777287268190796116095604023", + "22950712672973464623959364431870011027468645840520948585569396199939564530150", + "48582723826787318769293548505037557170748031825286037464838814197557895730522", + "7606900371885556209266478634801425110876551579485413897713203920590035320470", + "45301542482709858565191417322468431418157302373308524882903510016583831997173", + "42096606039310802466064646477728471968411288651756223725218259925760016917458", + "21691455555697701595140005376418072492613098491430616814912090233829427116555", + "8210951631362669449026667430173490916557983711863298358351381384289788199696", + "702522621901410665043833704231627494906773781171097084247728493640069931551", + "29399613134394562964868697558994748672074801013175726015401827583186457945860", + "476528712206082145016628705152322749642496995389179598087210329843776358166", + "11217389333127134692113680512859397814203349445574315503710644642714791344972", + "27713692054109098588361636930227665300943737959184883163753345042855058580374", + "9444879973318028910038079701376410592439490140929853125626701599900740414271", + "36224756556353870174128953180213478395673323268230224306022276203083464776836", + "48025603426892873267275436565222811037106028412601123616279956708584063971907", + "25738249534595389486234960434870736253535941224460953769723517483152463719433", + "14469306302412218587516382869518321072730350298073995429242671334453114841879", + "32248613324458644110375097418483624910966090068385137811361167113935700836562", + "36712432971349412465527840270410192601008830708216830332021059826106983784944", + "19166905196930194443242504819718121630684738367495424080176733129532354998834", + "12015571556950438237908712150293211728436370864101400631464770437513940187751", + "21879622017058301198588630953406154410691764493934932307981923637023514309411", + "44750918017295010468514060094789405000169855376168380376049255543444907067833", + "34009990478946879052209740900353089716000469787102064456221703724058971495325", + "31021015778311537495203378969201755456696694070301026280051898518614054396874", + "24775639773405856234228483389377942351063200988524130116623737411088505094669", + "23801335448538040172382980662333384912718113086707834308602514631491691964944", + "17922780681299373510388202405899873320175111482374564382218672293085074921081", + "46798460645370436475624630813845915430346536492216998499891409786363970874145", + "51888303627436834761836802107422955992420158912962611248827405605189272261243", + "45660774071110522522335703633814770510899580835824844961602235831367457180659", + "13597656000103804345718254563215441238592762081921954482365116290721284097336", + "7578213906319187847565772700860592457092595453628128206002088918779510553880", + "666495703888215316291874594391531642437388044043777457308159543012685365613", + "23391709620615706797203060991482812649718016244323626573272335489418750552845", + "4031644427541161735052613214302029129168967254538116159376134081978886775999", + "15011469156775200028309530965793040689683318278315309997809821904837666337388", + "6028487647946416800672279619688012070265258697454053371791521211422722165500", + "15872896476579481508907808853245035879948017612122989108112677273560160451148", + "49647860138479149833123738847314980180028846188512368740031824473156813615667", + "1766266619268431959749051692363218439619962688253739833717853887673119465217", + "46938901340287442397733125343391210972416243519458921889620617305181972679744", + "34974536152269264895390581538330583372308416706129421712044023878606494630938", + "32997050125731644356722452154374471677542181203427367133604537644531308591047", + "3504325870227981058651653893451666726101475357008120892938161712789500569307", + "24778770768250628900208482674853136536377931080863688970674501721783679604822", + "21379853174140287544828622329229538639628736294837380775618613408218304624765", + "48264091505420999636692955156049695535621861861087266863470213896462131323538", + "22556258401698893123597325402440096989709759698370506901384748051312079207416", + "16468564672283104448200466929470515559281318596645826058496417613750739556889", + "6216173916395818935558406768177722299666554535076872479228467162006736437912", + "51919839550086546060576838728042663787666489595474746175037591713189893785582", + "18394099542217429152585616676803562851788842374526875587520996533770378239013", + "43644239287154424684875063056883414262437976384949318691024791424650338769340", + "8418116039410524227724571451931975174380747028305604528786664030423105655045", + "24571480203008317501543451310080404273065870519445365205441559169451439859912", + "35470655702338046460906834189801593265013802365881913209281400793995169307747", + "44246302840851283810532477851581135841538922056492748628361012912082806353234", + "34711518017392048845663913904065347404273532619794114991653329970077921732035", + "24645592881196849151540495841540752399108940838595125057353429999053527707078", + "50231845581601874081844922235615563337290372498374796654375088957061009627574", + "37175284189340196595255643156185131608964165254843027857456309688799044024674", + "20965996800450273745095079018524567340310186794959187784879372532751231691584", + "14234894527833582726033074613697939504651529032484363165941916051823505924812", + "38374804115978039510433687666624568137010442005708222407992784536463097166017", + "48201947759009501961165411480744753071537780510700977852997944415546713631504", + "44251678347091898183721177005165159276494500174227320584535956097583332543362", + "2271941035593571682830196386531985122891399334853383248407798113804651646847", + "33373585036328889984274846096748561849742574548232200365224872630035536347571", + "37096118650826153141657195596233542427917508301246539898005805129852136950774", + "3077274877971230942285062684379420567945237706142211970653351514630484348626", + "46921896988671516121140953614115882047970293240045912641077805729249118544098", + "8278986561237945812184690528140506758726766310805659579444451103195435620908", + "10719042859978853922703277473397067229715789355540044261647700142836589878752", + "41096666790799052215603122485174524449256082635555249284292563440632708640201", + "26114302805902873370186882946861298202311317639142124141994265299504240017186", + "24122089512958765547140271133427456387400396624717547430816909562162956737687", + "19669882995535161591181680425103613063685882860653524607446239987650470631110", + "39649037465079967393973261504745617156177230607389388858294999425766221884747", + "52383916787187786777911889920052433504310341347123165209988318590578772649200", + "50835966522501771665584221136036348564226813258336005200522920119167958719806", + "46115285578898677998446473635493929879731329658843548459614979290530355187018", + "43616205091061492636289988059797058480605925926148236679714123575360877974373", + "44329530522827865084043335291234644088023180578221103175111303576988928582207", + "34601581792860273421709974153062769751683305687329509483286268946873019783233", + "24005687450578188372096541063857260559392228767249957409952720880148585683581", + "8401264926416768920840883132755038222173633780452223476084072362151558923403", + "39241562181267423281891483911695916284984376726268807628426727244446257961888", + "46241086060121626607387995801040873362396776854423983806483772384868947580579", + "25613605724693892831510258897496413254724322824359351121847606024217089935579", + "42811144657604425190922061999550634230808010659364321138936479478591900101822", + "16967560316782518983352198114986826778432314946522001211102536367698239912931", + "52216453053889420494115803263466468524431579180812235570426880876696630251519", + "43395431855327640930634396437238403029979719461142355825791073197057828409413", + "5739979244754927427803186734913436480608553861749846762371986686752721210469", + "24861857340938336950472124632749794022378090314657719191835537682862812489123", + "8060818261091417113785129860296513730701142001789355832909692110770284314020", + "607514426292577541090875246119436062052095772731827932157937129625141200848", + "46947146531784376209506246218852897611270905039780208958166066630425464018764", + "29258328625331693259224429120060181225532328778912000947935894453760901718233", + "34806313690274376458919670046108712124191559739357240275203701736431279154836", + "49986497913829262890440918091878961206525258604682890252857042950186333524164", + "39766543272531901416883469971291804207921139983829161911728567268740086385925", + "28091556500797434844528251798008397338594560241576666281998508494117743632138", + "23186737733877849913867741510649126264795492742900392628513893287994542825970", + "34307992155923243755136414840228127616280400005454568026611511989115216434490", + "28858240001261724480951946947709289948516365042168103626249943382483982603698", + "26718087421771065451980370117273164796818110337538145204977944861676442564142", + "11529007572354715997090009788499840321290160673228219695760274729008449217215", + "41818833610932056936257803996266601751120757390880177557219535829866128207497", + "11385931473640684401191236671377446228404497395789711684485909786295113379545", + "3046800734932809545251838586276556144556529945356443827748066188654982990819", + "21820866072902063659619039862390737896401848841413092387059291236176810030945", + "9260373451107750346918243179436845170737541806050625102526388075400013595057", + "50775870939862966414920375734388234221123592190948008489272156309651161088306", + "4749283609298891591756335047709117680971831257474779593848723947571957055989", + "7647335697008950350627451511980756910055899762665817491022221696834251051920", + "2544111829846209186666069772391404129589012716874935119896933198963815648470", + "4520524685766655716699001700924069236544665912498577185762497602437396574841", + "1489087313246746088548766265260176305578771974536948044498960354197105278897", + "49831426425372073590933151694013835620236449632038583725522006346268674211531", + "51829392696050679566277970049631175039430194572673773669460354610739430401645", + "22551753641170882458960054453729563667781821500594040339709737170503943293626", + "39875557100092776629801096431288228576369388718225980954102178240724866217134", + "27970300607167820402805648310763962720898738973942893119539310971184862035336", + "41961657773168629321045378298282773962430366222091440456655054209779301625513", + "15915927317605719955661372990692298243561855956238484819440300707062057130556", + "35081619576050445142121848342611865762555562695095734339145610480945840101020", + "27515417060815902459482553774040523829140545535853554007576394897375129107204", + "14971534453188424557783713771170815284718965632221559087315072218387255946773", + "32435382617980329961153843735379680389573276052103623237999975437161009088039", + "24081270123230281577299198511964134312484399302645197161531505252398293353482", + "36859364219134901873224235350286140497533981067115635481343031575103887189247", + "37685102373855613637277744523048040519209837448060790261321544729687705913611", + "8900710716968981104337659420301079323493929766528467773156234474349897676691", + "35163996502606394990930809092695311943564966788342266163746380371265947848936", + "25594106866457842390567220838919088968413507620827657476270673373210269648089", + "16375819521788226688684479037552614967016923578481011808934068116109215094622", + "41082095458382380055697971536536552864043155820507690887396239645790189639770", + "17040880062943650993756806837403103400522234323682130546066472543010527407949", + "16943480340246737691333212370674242197546296096764263949722785705430510279949", + "42723289032946758576739476241127107343790515137310389852872076202767930968922", + "41626342084680958232499623710152469842550047615888748141436044690870491378515", + "18929616358992919578953291121642564773136411726783841050680472233257448574541", + "11607858373876095938825348714340573491717184787981972269285132700310179306348", + "39099827772554846660452062548146063529888882995568674987535760694528234279097", + "35182794054648881043084793082591442639875943457417259729642732273618534765821", + "49700117715116691131491066606484243115374760425545685116633000976251898932742", + "45649948614393006349760903741801858405837234393661017814017081897565347946500", + "6873065548217483766438564807687724126991289146566911730828743455441747920853", + "43590314969752072547523831308613365600413652237988521319820151613024558449040", + "33177056274313996906268553318572773921345773735325945467758373664595405154812", + "45317344947823175743596883695049935268899321655775019531563574476884509669570", + "30099860084161055871573140725229111976496382954304194977341671015630743977114", + "22965624017498991332150649848367234689104556734442560598447470696236080100072", + "8341934048488732893238907749423888290972217250207224284943618060128100053118", + "28596129181161932920074998611591226396029216695232512851489436404991801744788", + "28180010922974985296871523413253362571579198315281244402799505586659125525598", + "43416037881910327292340841234854695526061453124069602341299982031620449917553", + "142651827142088011726795273680543595913842257039544161453729970603311878117", + "36439867830034330036264626692147515508059570404842463171828404368425290218661", + "14961134067431610039125780561713025836392484878585180040293433127524043987638", + "682376994187832549364895526422706043601725906702546344926459820898191810783", + "38317360690276628346364846415195763526433396143162835927741960265698793677530", + "34682488848092588069140607800609006466408394564018156382734818328492566998908", + "19609944132952033632651599437769929658506317910589022659413291230504613974237", + "14748561156412281284398160749605181174091807073522981418657410126477453665538", + "19329559201063048777619876416119758135546155751885943820635827738240479681632", + "6436260198837546375675605669888798105866010765714692171433926957397923003435", + "20802187185319477237667485678983729369078741509925637525284577250407711222574", + "7858122122831615910897064638870005340201720619640541346566778577938946281267", + "44834321195589934161494649415727792859599852025261753781877551400777678439163", + "32352311925569539666809361117203051438203598573416561652675871329827875011282", + "43508617397885347801885243798430386795013088918602555563258433310322947304587", + "10415694235159982976984229038010429999769978016974584333557887043103891460048", + "5978453131393549553634466138337688586272255061898920058118100646632355441836", + "29530236174532552135323467248613198536289765097404767562207315521821435363572", + "26462557209003402865404636273179319772252061255481675708062174728574857813430", + "2345373360113107965111506429577235802508050937322615888439068529404320575156", + "20847365024211512283688522832639387785539093689179262436985959207287879848892", + "3249072728083366810208388575844459458449706193979654170990364206310559766622", + "20795433501443590332152602764354483365500760852326704742421700979025782779179", + "29115999028157870628111689214578910759386210743994086820032199854490817921592", + "12695492055328164399944436927868513757651046445714684231140388197628188014074", + "24361364354004896259434935032004492034665400053713876975012793619708091992905", + "7784882525849889984038065976639661689748351515314556504743886456146574755616", + "662539596710935720549068336930934346687370201829538847271855151676512092151", + "19784938307617873904521952140907640491075564274762895345670919441525063416470", + "47345663033762055949623189794188778420225726754274304700948157724108255200574", + "29482350774506460834911775434289284636076790873529229986358190562715553147296", + "7355713467418524104551097122274915015585762546353840079921844566090937499189", + "8673129290913470474150926554000534596184420371100078985496163687555927065286" + ] \ No newline at end of file diff --git a/provers/groth16/circom-adapter/test_files/vitalik_example/test.r1cs.json b/provers/groth16/circom-adapter/test_files/vitalik_example/test.r1cs.json new file mode 100644 index 0000000000..c529cd2425 --- /dev/null +++ b/provers/groth16/circom-adapter/test_files/vitalik_example/test.r1cs.json @@ -0,0 +1,47 @@ +{ + "n8": 32, + "prime": "52435875175126190479447740508185965837690552500527637822603658699938581184513", + "nVars": 4, + "nOutputs": 1, + "nPubInputs": 0, + "nPrvInputs": 1, + "nLabels": 6, + "nConstraints": 2, + "useCustomGates": false, + "constraints": [ + [ + { + "2": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "2": "1" + }, + { + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + } + ], + [ + { + "3": "52435875175126190479447740508185965837690552500527637822603658699938581184512" + }, + { + "2": "1" + }, + { + "0": "5", + "1": "52435875175126190479447740508185965837690552500527637822603658699938581184512", + "2": "1" + } + ] + ], + "map": [ + 0, + 1, + 2, + 3 + ], + "customGates": [ + ], + "customGatesUses": [ + ] +} \ No newline at end of file diff --git a/provers/groth16/circom-adapter/test_files/vitalik_example/witness.json b/provers/groth16/circom-adapter/test_files/vitalik_example/witness.json new file mode 100644 index 0000000000..14597dff6b --- /dev/null +++ b/provers/groth16/circom-adapter/test_files/vitalik_example/witness.json @@ -0,0 +1,6 @@ +[ + "1", + "35", + "3", + "9" +] \ No newline at end of file diff --git a/provers/groth16/src/qap.rs b/provers/groth16/src/qap.rs index 94a4c6f17d..43f4d543a4 100644 --- a/provers/groth16/src/qap.rs +++ b/provers/groth16/src/qap.rs @@ -93,6 +93,31 @@ impl QuadraticArithmeticProgram { num_of_public_inputs: r1cs.number_of_inputs, } } + + pub fn from_variable_matrices( + num_of_public_inputs: usize, + l: &[Vec], + r: &[Vec], + o: &[Vec], + ) -> QuadraticArithmeticProgram { + let num_of_vars = l.len(); + assert!(num_of_vars > 0); + assert_eq!(num_of_vars, r.len()); + assert_eq!(num_of_vars, o.len()); + assert!(num_of_public_inputs <= num_of_vars); + + let num_of_gates = l[0].len(); + let next_power_of_two = num_of_gates.next_power_of_two(); + let pad_zeroes = next_power_of_two - num_of_gates; + + QuadraticArithmeticProgram { + num_of_public_inputs, + num_of_gates: next_power_of_two, + l: build_variable_polynomials(&apply_padding(l, pad_zeroes)), + r: build_variable_polynomials(&apply_padding(r, pad_zeroes)), + o: build_variable_polynomials(&apply_padding(o, pad_zeroes)), + } + } } #[inline] @@ -115,3 +140,23 @@ fn get_variable_lro_polynomials_from_r1cs( [current_var_l, current_var_r, current_var_o] .map(|e| Polynomial::interpolate_fft::(&e).unwrap()) } + +#[inline] +fn build_variable_polynomials(from_matrix: &[Vec]) -> Vec> { + from_matrix + .iter() + .map(|row| Polynomial::interpolate_fft::(row).unwrap()) + .collect() +} + +#[inline] +fn apply_padding(columns: &[Vec], pad_zeroes: usize) -> Vec> { + columns + .iter() + .map(|column| { + let mut new_column = column.clone(); + new_column.extend(vec![FrElement::zero(); pad_zeroes]); + new_column + }) + .collect() +} diff --git a/provers/groth16/tests/test_circuits/mod.rs b/provers/groth16/tests/test_circuits/mod.rs index bbaf4f3f45..faaf450eba 100644 --- a/provers/groth16/tests/test_circuits/mod.rs +++ b/provers/groth16/tests/test_circuits/mod.rs @@ -1,7 +1,4 @@ -use lambdaworks_groth16::{common::*, QuadraticArithmeticProgram}; - -mod utils; -use utils::*; +use lambdaworks_groth16::{common::*, QuadraticArithmeticProgram as QAP}; /* Represents x^3 + x + 5 = 35, based on https://vitalik.ca/general/2016/12/10/qap.html @@ -11,7 +8,7 @@ Represents x^3 + x + 5 = 35, based on https://vitalik.ca/general/2016/12/10/qap. (sym_2 + 5) * 1 = ~out */ #[cfg(test)] -pub fn vitalik_qap() -> QuadraticArithmeticProgram { +pub fn vitalik_qap() -> QAP { let num_of_public_inputs = 1; let [l, r, o] = [ [ @@ -40,7 +37,7 @@ pub fn vitalik_qap() -> QuadraticArithmeticProgram { ], ] .map(|matrix| matrix.map(|row| row.map(FrElement::from_hex_unchecked).to_vec())); - qap_from_variable_matrices(num_of_public_inputs, &l, &r, &o) + QAP::from_variable_matrices(num_of_public_inputs, &l, &r, &o) } /* @@ -56,7 +53,7 @@ Represents x^2 = 25 or y^2 = 9 ~out = sym_3 * sym_4 -> needs to be zero */ #[cfg(test)] -pub fn test_qap_2() -> QuadraticArithmeticProgram { +pub fn test_qap_2() -> QAP { let num_of_public_inputs = 2; let [l, r, o] = [ [ @@ -102,5 +99,5 @@ pub fn test_qap_2() -> QuadraticArithmeticProgram { .to_vec() }) }); - qap_from_variable_matrices(num_of_public_inputs, &l, &r, &o) + QAP::from_variable_matrices(num_of_public_inputs, &l, &r, &o) } diff --git a/provers/groth16/tests/test_circuits/utils.rs b/provers/groth16/tests/test_circuits/utils.rs deleted file mode 100644 index e618eccf4e..0000000000 --- a/provers/groth16/tests/test_circuits/utils.rs +++ /dev/null @@ -1,48 +0,0 @@ -use lambdaworks_groth16::{common::*, QuadraticArithmeticProgram}; -use lambdaworks_math::polynomial::Polynomial; - -#[cfg(test)] -pub fn qap_from_variable_matrices( - num_of_public_inputs: usize, - l: &[Vec], - r: &[Vec], - o: &[Vec], -) -> QuadraticArithmeticProgram { - let num_of_total_inputs = l.len(); - assert_eq!(num_of_total_inputs, r.len()); - assert_eq!(num_of_total_inputs, o.len()); - assert!(num_of_total_inputs > 0); - assert!(num_of_public_inputs <= num_of_total_inputs); - - let num_of_gates = l[0].len(); - let next_power_of_two = num_of_gates.next_power_of_two(); - let pad_zeroes = next_power_of_two - num_of_gates; - - QuadraticArithmeticProgram { - num_of_public_inputs, - num_of_gates: next_power_of_two, - l: build_variable_polynomials(&apply_padding(l, pad_zeroes)), - r: build_variable_polynomials(&apply_padding(r, pad_zeroes)), - o: build_variable_polynomials(&apply_padding(o, pad_zeroes)), - } -} - -#[cfg(test)] -pub fn build_variable_polynomials(from_matrix: &[Vec]) -> Vec> { - from_matrix - .iter() - .map(|row| Polynomial::interpolate_fft::(row).unwrap()) - .collect() -} - -#[cfg(test)] -pub fn apply_padding(columns: &[Vec], pad_zeroes: usize) -> Vec> { - columns - .iter() - .map(|column| { - let mut new_column = column.clone(); - new_column.extend(vec![FrElement::zero(); pad_zeroes]); - new_column - }) - .collect() -} From fed12d674418e4f09bc843b71bc90008a85b1aed Mon Sep 17 00:00:00 2001 From: irfan Date: Wed, 31 Jan 2024 00:05:04 +0300 Subject: [PATCH 6/6] Monolith hash over mersenne31 (#682) * pull from pat * monolith over m31 * Vec -> &[u32] * small refactor * fix * can't run * ready for review * do a better job at porting plonky3 * clippy * use alloc::vec::Vec; * fix clippy --------- Co-authored-by: Mauro Toscano <12560266+MauroToscano@users.noreply.github.com> Co-authored-by: Diego K <43053772+diegokingston@users.noreply.github.com> --- crypto/src/hash/mod.rs | 1 + crypto/src/hash/monolith/mod.rs | 224 ++++++++++++++++++++++++++++++ crypto/src/hash/monolith/utils.rs | 59 ++++++++ fuzz/no_gpu_fuzz/Cargo.toml | 1 - 4 files changed, 284 insertions(+), 1 deletion(-) create mode 100644 crypto/src/hash/monolith/mod.rs create mode 100644 crypto/src/hash/monolith/utils.rs diff --git a/crypto/src/hash/mod.rs b/crypto/src/hash/mod.rs index c11e1ab166..6309031126 100644 --- a/crypto/src/hash/mod.rs +++ b/crypto/src/hash/mod.rs @@ -1,4 +1,5 @@ pub mod hash_to_field; +pub mod monolith; pub mod pedersen; pub mod poseidon; pub mod sha3; diff --git a/crypto/src/hash/monolith/mod.rs b/crypto/src/hash/monolith/mod.rs new file mode 100644 index 0000000000..240d5418d2 --- /dev/null +++ b/crypto/src/hash/monolith/mod.rs @@ -0,0 +1,224 @@ +use alloc::vec::Vec; +use lambdaworks_math::field::{ + fields::mersenne31::field::MERSENNE_31_PRIME_FIELD_ORDER, traits::IsField, +}; +use sha3::{ + digest::{ExtendableOutput, Update}, + Shake128, Shake128Reader, +}; + +mod utils; +use utils::*; + +// Ported from https://github.com/Plonky3/Plonky3/blob/main/monolith + +pub const NUM_BARS: usize = 8; +const MATRIX_CIRC_MDS_16_MERSENNE31_MONOLITH: [u32; 16] = [ + 61402, 17845, 26798, 59689, 12021, 40901, 41351, 27521, 56951, 12034, 53865, 43244, 7454, + 33823, 28750, 1108, +]; + +pub struct MonolithMersenne31 { + round_constants: Vec>, + lookup1: Vec, + lookup2: Vec, +} + +impl Default + for MonolithMersenne31 +{ + fn default() -> Self { + Self::new() + } +} + +impl MonolithMersenne31 { + pub fn new() -> Self { + assert!(WIDTH >= 8); + assert!(WIDTH <= 24); + assert!(WIDTH % 4 == 0); + Self { + round_constants: Self::instantiate_round_constants(), + lookup1: Self::instantiate_lookup1(), + lookup2: Self::instantiate_lookup2(), + } + } + + fn instantiate_round_constants() -> Vec> { + let mut shake = Shake128::default(); + shake.update("Monolith".as_bytes()); + shake.update(&[WIDTH as u8, (NUM_FULL_ROUNDS + 1) as u8]); + shake.update(&MERSENNE_31_PRIME_FIELD_ORDER.to_le_bytes()); + shake.update(&[8, 8, 8, 7]); + let mut shake_finalized = shake.finalize_xof(); + random_matrix(&mut shake_finalized, NUM_FULL_ROUNDS, WIDTH) + } + + fn instantiate_lookup1() -> Vec { + (0..=u16::MAX) + .map(|i| { + let hi = (i >> 8) as u8; + let lo = i as u8; + ((Self::s_box(hi) as u16) << 8) | Self::s_box(lo) as u16 + }) + .collect() + } + + fn instantiate_lookup2() -> Vec { + (0..(1 << 15)) + .map(|i| { + let hi = (i >> 8) as u8; + let lo: u8 = i as u8; + ((Self::final_s_box(hi) as u16) << 8) | Self::s_box(lo) as u16 + }) + .collect() + } + + fn s_box(y: u8) -> u8 { + (y ^ !y.rotate_left(1) & y.rotate_left(2) & y.rotate_left(3)).rotate_left(1) + } + + fn final_s_box(y: u8) -> u8 { + debug_assert_eq!(y >> 7, 0); + + let y_rot_1 = (y >> 6) | (y << 1); + let y_rot_2 = (y >> 5) | (y << 2); + + let tmp = (y ^ !y_rot_1 & y_rot_2) & 0x7F; + ((tmp >> 6) | (tmp << 1)) & 0x7F + } + + pub fn permutation(&self, state: &mut Vec) { + self.concrete(state); + for round in 0..NUM_FULL_ROUNDS { + self.bars(state); + Self::bricks(state); + self.concrete(state); + Self::add_round_constants(state, &self.round_constants[round]); + } + self.bars(state); + Self::bricks(state); + self.concrete(state); + } + + // MDS matrix + fn concrete(&self, state: &mut Vec) { + *state = if WIDTH == 16 { + Self::apply_circulant(&mut MATRIX_CIRC_MDS_16_MERSENNE31_MONOLITH.clone(), state) + } else { + let mut shake = Shake128::default(); + shake.update("Monolith".as_bytes()); + shake.update(&[WIDTH as u8, (NUM_FULL_ROUNDS + 1) as u8]); + shake.update(&MERSENNE_31_PRIME_FIELD_ORDER.to_le_bytes()); + shake.update(&[16, 15]); + shake.update("MDS".as_bytes()); + let mut shake_finalized = shake.finalize_xof(); + Self::apply_cauchy_mds_matrix(&mut shake_finalized, state) + }; + } + + // S-box lookups + fn bars(&self, state: &mut [u32]) { + for state in state.iter_mut().take(NUM_BARS) { + *state = (self.lookup2[(*state >> 16) as u16 as usize] as u32) << 16 + | self.lookup1[*state as u16 as usize] as u32; + } + } + + // (x_{n+1})² = (x_n)² + x_{n+1} + fn bricks(state: &mut [u32]) { + for i in (0..state.len() - 1).rev() { + state[i + 1] = F::add(&state[i + 1], &F::square(&state[i])); + } + } + + fn add_round_constants(state: &mut [u32], round_constants: &[u32]) { + for (x, rc) in state.iter_mut().zip(round_constants) { + *x = F::add(x, rc); + } + } + + // O(n²) + fn apply_circulant(circ_matrix: &mut [u32], input: &[u32]) -> Vec { + let mut output = vec![F::zero(); WIDTH]; + for out_i in output.iter_mut().take(WIDTH - 1) { + *out_i = dot_product(circ_matrix, input); + circ_matrix.rotate_right(1); + } + output[WIDTH - 1] = dot_product(circ_matrix, input); + output + } + + fn apply_cauchy_mds_matrix(shake: &mut Shake128Reader, to_multiply: &[u32]) -> Vec { + let mut output = vec![F::zero(); WIDTH]; + + let bits: u32 = u64::BITS + - (MERSENNE_31_PRIME_FIELD_ORDER as u64) + .saturating_sub(1) + .leading_zeros(); + + let x_mask = (1 << (bits - 9)) - 1; + let y_mask = ((1 << bits) - 1) >> 2; + + let y = get_random_y_i(shake, WIDTH, x_mask, y_mask); + let mut x = y.clone(); + x.iter_mut().for_each(|x_i| *x_i &= x_mask); + + for (i, x_i) in x.iter().enumerate() { + for (j, yj) in y.iter().enumerate() { + output[i] = F::add(&output[i], &F::div(&to_multiply[j], &F::add(x_i, yj))); + } + } + + output + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn get_test_input(width: usize) -> Vec { + (0..width).map(|i| F::from_base_type(i as u32)).collect() + } + + #[test] + fn from_plonky3_concrete_width_16() { + let mut input = get_test_input(16); + MonolithMersenne31::<16, 5>::new().concrete(&mut input); + assert_eq!( + input, + [ + 3470365, 3977394, 4042151, 4025740, 4431233, 4264086, 3927003, 4259216, 3872757, + 3957178, 3820319, 3690660, 4023081, 3592814, 3688803, 3928040 + ] + ); + } + + #[test] + fn from_plonky3_concrete_width_12() { + let mut input = get_test_input(12); + MonolithMersenne31::<12, 5>::new().concrete(&mut input); + assert_eq!( + input, + [ + 365726249, 1885122147, 379836542, 860204337, 889139350, 1052715727, 151617411, + 700047874, 925910152, 339398001, 721459023, 464532407 + ] + ); + } + + #[test] + fn from_plonky3_width_16() { + let mut input = get_test_input(16); + MonolithMersenne31::<16, 5>::new().permutation(&mut input); + assert_eq!( + input, + [ + 609156607, 290107110, 1900746598, 1734707571, 2050994835, 1648553244, 1307647296, + 1941164548, 1707113065, 1477714255, 1170160793, 93800695, 769879348, 375548503, + 1989726444, 1349325635 + ] + ); + } +} diff --git a/crypto/src/hash/monolith/utils.rs b/crypto/src/hash/monolith/utils.rs new file mode 100644 index 0000000000..378200a40e --- /dev/null +++ b/crypto/src/hash/monolith/utils.rs @@ -0,0 +1,59 @@ +use alloc::vec::Vec; +use lambdaworks_math::field::{ + fields::mersenne31::field::{Mersenne31Field, MERSENNE_31_PRIME_FIELD_ORDER}, + traits::IsField, +}; +use sha3::{digest::XofReader, Shake128Reader}; + +// Ported from https://github.com/Plonky3/Plonky3/blob/main/monolith + +pub type F = Mersenne31Field; + +pub fn random_matrix(shake: &mut Shake128Reader, n: usize, m: usize) -> Vec> { + (0..n) + .map(|_| (0..m).map(|_| random_field_element(shake)).collect()) + .collect() +} + +fn random_field_element(shake: &mut Shake128Reader) -> u32 { + let mut val = shake_random_u32(shake); + while val >= MERSENNE_31_PRIME_FIELD_ORDER { + val = shake_random_u32(shake); + } + F::from_base_type(val) +} + +pub fn dot_product(u: &[u32], v: &[u32]) -> u32 { + u.iter() + .zip(v) + .map(|(x, y)| F::mul(x, y)) + .reduce(|a, b| F::add(&a, &b)) + .unwrap() +} + +pub fn get_random_y_i( + shake: &mut Shake128Reader, + width: usize, + x_mask: u32, + y_mask: u32, +) -> Vec { + let mut res = vec![0; width]; + + for i in 0..width { + let mut y_i = shake_random_u32(shake) & y_mask; + let mut x_i = y_i & x_mask; + while res.iter().take(i).any(|r| r & x_mask == x_i) { + y_i = shake_random_u32(shake) & y_mask; + x_i = y_i & x_mask; + } + res[i] = y_i; + } + + res +} + +fn shake_random_u32(shake: &mut Shake128Reader) -> u32 { + let mut rand = [0u8; 4]; + shake.read(&mut rand); + u32::from_le_bytes(rand) +} diff --git a/fuzz/no_gpu_fuzz/Cargo.toml b/fuzz/no_gpu_fuzz/Cargo.toml index 179dfdfc99..40f476865b 100644 --- a/fuzz/no_gpu_fuzz/Cargo.toml +++ b/fuzz/no_gpu_fuzz/Cargo.toml @@ -16,7 +16,6 @@ num-traits = "0.2" ibig = "0.3.6" p3-goldilocks = { git = "https://github.com/Plonky3/Plonky3", rev = "41cd843" } p3-mersenne-31 = { git = "https://github.com/Plonky3/Plonky3", rev = "41cd843" } -p3-field = { git = "https://github.com/Plonky3/Plonky3", rev = "41cd843" } [[bin]] name = "curve_bn254"