From 58ab96953d5baee8d942b4ac69c196b77ca2b827 Mon Sep 17 00:00:00 2001 From: Kevin Jue Date: Sun, 19 May 2024 17:06:12 -0700 Subject: [PATCH 01/42] feat: exit code (#750) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: John Guibas Co-authored-by: Tamir Hemo Co-authored-by: Ubuntu Co-authored-by: Tarik Moon Co-authored-by: Matthias Görgens Co-authored-by: Eugene Rabinovich Co-authored-by: Chris Tian --- core/src/cpu/air/ecall.rs | 8 +++++- core/src/cpu/air/mod.rs | 2 +- recursion/circuit/src/stark.rs | 13 ++++++++- recursion/core/src/air/public_values.rs | 9 ++++--- recursion/core/src/cpu/air/mod.rs | 10 ++++++- recursion/core/src/cpu/air/system.rs | 35 ++++++++++++++++++------- recursion/core/src/cpu/columns/mod.rs | 1 + recursion/core/src/runtime/mod.rs | 21 ++++++++++++--- recursion/core/src/runtime/record.rs | 20 +++++++------- recursion/program/src/machine/core.rs | 1 - recursion/program/src/machine/utils.rs | 31 +++++++++++----------- 11 files changed, 105 insertions(+), 46 deletions(-) diff --git a/core/src/cpu/air/ecall.rs b/core/src/cpu/air/ecall.rs index 3c1f166111..32c2d8a47f 100644 --- a/core/src/cpu/air/ecall.rs +++ b/core/src/cpu/air/ecall.rs @@ -1,7 +1,7 @@ use p3_air::AirBuilder; use p3_field::AbstractField; -use crate::air::{BaseAirBuilder, WordAirBuilder}; +use crate::air::{BaseAirBuilder, PublicValues, WordAirBuilder}; use crate::cpu::air::{Word, POSEIDON_NUM_WORDS, PV_DIGEST_NUM_WORDS}; use crate::cpu::columns::{CpuCols, OpcodeSelectorCols}; use crate::memory::MemoryCols; @@ -171,6 +171,7 @@ impl CpuChip { builder: &mut AB, local: &CpuCols, next: &CpuCols, + public_values: &PublicValues, AB::Expr>, ) { let is_halt = self.get_is_halt_syscall(builder, local); @@ -181,6 +182,11 @@ impl CpuChip { .assert_zero(next.is_real); builder.when(is_halt.clone()).assert_zero(local.next_pc); + + builder.when(is_halt.clone()).assert_eq( + local.op_b_access.value().reduce::(), + public_values.exit_code.clone(), + ); } /// Returns a boolean expression indicating whether the instruction is a HALT instruction. diff --git a/core/src/cpu/air/mod.rs b/core/src/cpu/air/mod.rs index f2c77840ee..75742f8616 100644 --- a/core/src/cpu/air/mod.rs +++ b/core/src/cpu/air/mod.rs @@ -95,7 +95,7 @@ where ); // HALT ecall and UNIMPL instruction. - self.eval_halt_unimpl(builder, local, next); + self.eval_halt_unimpl(builder, local, next, &public_values); // Check that the shard and clk is updated correctly. self.eval_shard_clk(builder, local, next); diff --git a/recursion/circuit/src/stark.rs b/recursion/circuit/src/stark.rs index e7c5b530ba..3d4c31d1a5 100644 --- a/recursion/circuit/src/stark.rs +++ b/recursion/circuit/src/stark.rs @@ -376,7 +376,7 @@ pub(crate) mod tests { "".to_string(), )]; instructions.resize( - 32, + 31, Instruction::new( Opcode::ADD, F::from_canonical_u32(3), @@ -389,6 +389,17 @@ pub(crate) mod tests { "".to_string(), ), ); + instructions.push(Instruction::new( + Opcode::HALT, + F::zero(), + zero, + zero, + F::zero(), + F::zero(), + true, + true, + "".to_string(), + )); RecursionProgram:: { instructions, traces: vec![None], diff --git a/recursion/core/src/air/public_values.rs b/recursion/core/src/air/public_values.rs index 97bcf0b940..5bbf7c10eb 100644 --- a/recursion/core/src/air/public_values.rs +++ b/recursion/core/src/air/public_values.rs @@ -77,9 +77,6 @@ pub struct RecursionPublicValues { /// The expected start pc for the next shard. pub next_pc: T, - /// The exit code of the program. - pub exit_code: T, - /// First shard being proven. pub start_shard: T, @@ -113,6 +110,10 @@ pub struct RecursionPublicValues { /// Whether the proof completely proves the program execution. pub is_complete: T, - /// The digest of all the public values elements. + /// The digest of all the previous public values elements. pub digest: [T; DIGEST_SIZE], + + /// The exit code of the program. Note that this is not part of the public values digest, since + /// it's value will be individually constrained. + pub exit_code: T, } diff --git a/recursion/core/src/cpu/air/mod.rs b/recursion/core/src/cpu/air/mod.rs index 132c7e03cb..10edc7a477 100644 --- a/recursion/core/src/cpu/air/mod.rs +++ b/recursion/core/src/cpu/air/mod.rs @@ -87,7 +87,7 @@ where self.eval_clk(builder, local, next); // Constrain the system instructions (TRAP, HALT). - self.eval_system_instructions(builder, local, next); + self.eval_system_instructions(builder, local, next, public_values); // Constrain the is_real_flag. self.eval_is_real(builder, local, next); @@ -192,4 +192,12 @@ impl CpuChip { { local.selectors.is_commit.into() } + + /// Expr to check for system instructions. + pub fn is_system_instruction(&self, local: &CpuCols) -> AB::Expr + where + AB: SP1RecursionAirBuilder, + { + local.selectors.is_trap + local.selectors.is_halt + } } diff --git a/recursion/core/src/cpu/air/system.rs b/recursion/core/src/cpu/air/system.rs index 39be8a5fd8..f7809ffdec 100644 --- a/recursion/core/src/cpu/air/system.rs +++ b/recursion/core/src/cpu/air/system.rs @@ -3,32 +3,49 @@ use p3_field::Field; use sp1_core::air::BaseAirBuilder; use crate::{ - air::SP1RecursionAirBuilder, + air::{RecursionPublicValues, SP1RecursionAirBuilder}, cpu::{CpuChip, CpuCols}, }; impl CpuChip { /// Eval the system instructions (TRAP, HALT). - /// - /// This method will contrain the following: - /// 1) Ensure that none of the instructions are TRAP. - /// 2) Ensure that the last real instruction is a HALT. pub fn eval_system_instructions( &self, builder: &mut AB, local: &CpuCols, next: &CpuCols, + public_values: &RecursionPublicValues, ) where - AB: SP1RecursionAirBuilder, + AB: SP1RecursionAirBuilder, { + let is_system_instruction = self.is_system_instruction::(local); + + // Verify that the last real row is either TRAP or HALT. + builder + .when_transition() + .when(local.is_real) + .when_not(next.is_real) + .assert_one(is_system_instruction.clone()); + builder + .when_last_row() .when(local.is_real) - .assert_zero(local.selectors.is_trap); + .assert_one(is_system_instruction.clone()); + // Verify that all other real rows are not TRAP or HALT. builder .when_transition() .when(local.is_real) - .when_not(next.is_real) - .assert_one(local.selectors.is_halt); + .when(next.is_real) + .assert_zero(is_system_instruction); + + // Verify the correct public value exit code. + builder + .when(local.selectors.is_trap) + .assert_one(public_values.exit_code.clone()); + + builder + .when(local.selectors.is_halt) + .assert_zero(public_values.exit_code.clone()); } } diff --git a/recursion/core/src/cpu/columns/mod.rs b/recursion/core/src/cpu/columns/mod.rs index c7eae3cbea..330a1e98e0 100644 --- a/recursion/core/src/cpu/columns/mod.rs +++ b/recursion/core/src/cpu/columns/mod.rs @@ -14,6 +14,7 @@ mod public_values; pub use instruction::*; pub use opcode::*; +pub use public_values::*; use self::opcode_specific::OpcodeSpecificCols; diff --git a/recursion/core/src/runtime/mod.rs b/recursion/core/src/runtime/mod.rs index 1fd9ca6a67..31703cdf42 100644 --- a/recursion/core/src/runtime/mod.rs +++ b/recursion/core/src/runtime/mod.rs @@ -18,7 +18,7 @@ use p3_symmetric::Permutation; pub use program::*; pub use record::*; -use crate::air::Block; +use crate::air::{Block, RECURSION_PUBLIC_VALUES_COL_MAP, RECURSIVE_PROOF_NUM_PV_ELTS}; use crate::cpu::CpuEvent; use crate::fri_fold::FriFoldEvent; use crate::memory::MemoryRecord; @@ -567,6 +567,12 @@ where (a, b, c) = (a_val, b_val, c_val); } Opcode::TRAP => { + self.record + .public_values + .resize(RECURSIVE_PROOF_NUM_PV_ELTS, F::zero()); + self.record.public_values[RECURSION_PUBLIC_VALUES_COL_MAP.exit_code] = F::one(); + + let (a_val, b_val, c_val) = self.all_rr(&instruction); let trap_pc = self.pc.as_canonical_u32() as usize; let trace = self.program.traces[trap_pc].clone(); if let Some(mut trace) = trace { @@ -586,9 +592,15 @@ where } eprintln!("TRAP encountered. No backtrace available"); } - exit(1); + (a, b, c) = (a_val, b_val, c_val); } Opcode::HALT => { + self.record + .public_values + .resize(RECURSIVE_PROOF_NUM_PV_ELTS, F::zero()); + self.record.public_values[RECURSION_PUBLIC_VALUES_COL_MAP.exit_code] = + F::zero(); + let (a_val, b_val, c_val) = self.all_rr(&instruction); (a, b, c) = (a_val, b_val, c_val); } @@ -823,7 +835,10 @@ where self.timestamp += 1; self.access = CpuRecord::default(); - if self.timestamp >= early_exit_ts || instruction.opcode == Opcode::HALT { + if self.timestamp >= early_exit_ts + || instruction.opcode == Opcode::HALT + || instruction.opcode == Opcode::TRAP + { break; } } diff --git a/recursion/core/src/runtime/record.rs b/recursion/core/src/runtime/record.rs index 9e6d31da81..80f6d7b321 100644 --- a/recursion/core/src/runtime/record.rs +++ b/recursion/core/src/runtime/record.rs @@ -1,3 +1,4 @@ +use std::array; use std::collections::BTreeMap; use std::sync::Arc; @@ -82,15 +83,14 @@ impl MachineRecord for ExecutionRecord { } fn public_values(&self) -> Vec { - let mut ret = self - .public_values - .iter() - .map(|x| T::from_canonical_u32(x.as_canonical_u32())) - .collect::>(); - - // Pad the public values to the correct number of public values, in case not all are used. - ret.resize(PROOF_MAX_NUM_PVS, T::zero()); - - ret + let ret: [T; PROOF_MAX_NUM_PVS] = array::from_fn(|i| { + if i < self.public_values.len() { + T::from_canonical_u32(self.public_values[i].as_canonical_u32()) + } else { + T::zero() + } + }); + + ret.to_vec() } } diff --git a/recursion/program/src/machine/core.rs b/recursion/program/src/machine/core.rs index 65b6b3e8dc..916a25a2ac 100644 --- a/recursion/program/src/machine/core.rs +++ b/recursion/program/src/machine/core.rs @@ -305,7 +305,6 @@ where recursion_public_values.cumulative_sum = cumulative_sum_arrray; recursion_public_values.start_reconstruct_deferred_digest = start_deferred_digest; recursion_public_values.end_reconstruct_deferred_digest = end_deferred_digest; - recursion_public_values.exit_code = zero; recursion_public_values.is_complete = is_complete_felt; // If the proof represents a complete proof, make completeness assertions. diff --git a/recursion/program/src/machine/utils.rs b/recursion/program/src/machine/utils.rs index f3d6d408cb..59540136b3 100644 --- a/recursion/program/src/machine/utils.rs +++ b/recursion/program/src/machine/utils.rs @@ -10,7 +10,7 @@ use sp1_core::{ }; use sp1_recursion_compiler::ir::{Array, Builder, Config, Felt, Var}; use sp1_recursion_core::{ - air::{RecursionPublicValues, RECURSIVE_PROOF_NUM_PV_ELTS}, + air::{RecursionPublicValues, NUM_PV_ELMS_TO_HASH, RECURSIVE_PROOF_NUM_PV_ELTS}, runtime::DIGEST_SIZE, }; @@ -18,7 +18,7 @@ use crate::{ challenger::DuplexChallengerVariable, fri::TwoAdicMultiplicativeCosetVariable, types::VerifyingKeyVariable, - utils::{assert_challenger_eq_pv, get_preprocessed_data}, + utils::{assert_challenger_eq_pv, felt2var, get_preprocessed_data}, }; /// Assertions on the public values describing a complete recursive proof state. @@ -127,9 +127,8 @@ pub(crate) fn calculate_public_values_digest( public_values: &RecursionPublicValues>, ) -> Array> { let pv_elements: [Felt<_>; RECURSIVE_PROOF_NUM_PV_ELTS] = unsafe { transmute(*public_values) }; - const NUM_ELMS_TO_HASH: usize = RECURSIVE_PROOF_NUM_PV_ELTS - DIGEST_SIZE; - let mut poseidon_inputs = builder.array(NUM_ELMS_TO_HASH); - for (i, elm) in pv_elements[0..NUM_ELMS_TO_HASH].iter().enumerate() { + let mut poseidon_inputs = builder.array(NUM_PV_ELMS_TO_HASH); + for (i, elm) in pv_elements[0..NUM_PV_ELMS_TO_HASH].iter().enumerate() { builder.set(&mut poseidon_inputs, i, *elm); } builder.poseidon2_hash(&poseidon_inputs) @@ -140,14 +139,17 @@ pub(crate) fn verify_public_values_hash( builder: &mut Builder, public_values: &RecursionPublicValues>, ) { - // Check that the public values digest is correct. - let calculated_digest = calculate_public_values_digest(builder, public_values); - - let expected_digest = public_values.digest; - for (i, expected_elm) in expected_digest.iter().enumerate() { - let calculated_elm = builder.get(&calculated_digest, i); - builder.assert_felt_eq(*expected_elm, calculated_elm); - } + let var_exit_code = felt2var(builder, public_values.exit_code); + // Check that the public values digest is correct if the exit_code is 0. + builder.if_eq(var_exit_code, C::N::zero()).then(|builder| { + let calculated_digest = calculate_public_values_digest(builder, public_values); + + let expected_digest = public_values.digest; + for (i, expected_elm) in expected_digest.iter().enumerate() { + let calculated_elm = builder.get(&calculated_digest, i); + builder.assert_felt_eq(*expected_elm, calculated_elm); + } + }); } /// Register and commits the recursion public values. @@ -156,8 +158,7 @@ pub fn commit_public_values( public_values: &RecursionPublicValues>, ) { let pv_elements: [Felt<_>; RECURSIVE_PROOF_NUM_PV_ELTS] = unsafe { transmute(*public_values) }; - const NUM_ELMS_TO_HASH: usize = RECURSIVE_PROOF_NUM_PV_ELTS - DIGEST_SIZE; - let pv_elms_no_digest = &pv_elements[0..NUM_ELMS_TO_HASH]; + let pv_elms_no_digest = &pv_elements[0..NUM_PV_ELMS_TO_HASH]; for value in pv_elms_no_digest.iter() { builder.register_public_value(*value); From cecb49921bdc9535b42c0e1ee200bf7d6b4649a7 Mon Sep 17 00:00:00 2001 From: Chris T Date: Mon, 20 May 2024 16:57:58 -0700 Subject: [PATCH 02/42] chore: pk/vk serde/clone (#770) --- Cargo.lock | 44 ++++++++++----------- core/src/stark/machine.rs | 50 +++++++++++++++++++++++- examples/Cargo.lock | 47 +++++++++++----------- examples/fibonacci/script/bin/execute.rs | 2 +- 4 files changed, 96 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 55de795a21..6e10c5bfee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -836,7 +836,7 @@ dependencies = [ "bitflags 2.5.0", "cexpr", "clang-sys", - "itertools 0.12.1", + "itertools 0.10.5", "lazy_static", "lazycell", "log", @@ -2936,7 +2936,7 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "p3-air" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "p3-field", "p3-matrix", @@ -2945,7 +2945,7 @@ dependencies = [ [[package]] name = "p3-baby-bear" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "num-bigint 0.4.5", "p3-field", @@ -2959,7 +2959,7 @@ dependencies = [ [[package]] name = "p3-blake3" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "blake3", "p3-symmetric", @@ -2968,7 +2968,7 @@ dependencies = [ [[package]] name = "p3-bn254-fr" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "ff 0.13.0", "num-bigint 0.4.5", @@ -2982,7 +2982,7 @@ dependencies = [ [[package]] name = "p3-challenger" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "p3-field", "p3-maybe-rayon", @@ -2994,7 +2994,7 @@ dependencies = [ [[package]] name = "p3-commit" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "itertools 0.12.1", "p3-challenger", @@ -3007,7 +3007,7 @@ dependencies = [ [[package]] name = "p3-dft" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "p3-field", "p3-matrix", @@ -3019,7 +3019,7 @@ dependencies = [ [[package]] name = "p3-field" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "itertools 0.12.1", "num-bigint 0.4.5", @@ -3032,7 +3032,7 @@ dependencies = [ [[package]] name = "p3-fri" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "itertools 0.12.1", "p3-challenger", @@ -3050,7 +3050,7 @@ dependencies = [ [[package]] name = "p3-interpolation" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "p3-field", "p3-matrix", @@ -3060,7 +3060,7 @@ dependencies = [ [[package]] name = "p3-keccak" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "p3-symmetric", "tiny-keccak", @@ -3069,7 +3069,7 @@ dependencies = [ [[package]] name = "p3-keccak-air" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "p3-air", "p3-field", @@ -3082,7 +3082,7 @@ dependencies = [ [[package]] name = "p3-matrix" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "itertools 0.12.1", "p3-field", @@ -3096,7 +3096,7 @@ dependencies = [ [[package]] name = "p3-maybe-rayon" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "rayon", ] @@ -3104,7 +3104,7 @@ dependencies = [ [[package]] name = "p3-mds" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "itertools 0.12.1", "p3-dft", @@ -3118,7 +3118,7 @@ dependencies = [ [[package]] name = "p3-merkle-tree" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "itertools 0.12.1", "p3-commit", @@ -3134,7 +3134,7 @@ dependencies = [ [[package]] name = "p3-poseidon2" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "gcd", "p3-field", @@ -3146,7 +3146,7 @@ dependencies = [ [[package]] name = "p3-symmetric" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "itertools 0.12.1", "p3-field", @@ -3156,7 +3156,7 @@ dependencies = [ [[package]] name = "p3-uni-stark" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "itertools 0.12.1", "p3-air", @@ -3174,7 +3174,7 @@ dependencies = [ [[package]] name = "p3-util" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "serde", ] @@ -3500,7 +3500,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9554e3ab233f0a932403704f1a1d08c30d5ccd931adfdfa1e8b5a19b52c1d55a" dependencies = [ "anyhow", - "itertools 0.12.1", + "itertools 0.10.5", "proc-macro2", "quote", "syn 2.0.61", diff --git a/core/src/stark/machine.rs b/core/src/stark/machine.rs index 948ceca9ab..8616915586 100644 --- a/core/src/stark/machine.rs +++ b/core/src/stark/machine.rs @@ -10,6 +10,7 @@ use p3_matrix::dense::RowMajorMatrix; use p3_matrix::Dimensions; use p3_matrix::Matrix; use p3_maybe_rayon::prelude::*; +use serde::de::DeserializeOwned; use serde::Deserialize; use serde::Serialize; use std::cmp::Reverse; @@ -63,6 +64,9 @@ impl StarkMachine { } } +#[derive(Clone, Serialize, Deserialize)] +#[serde(bound(serialize = "PcsProverData: Serialize"))] +#[serde(bound(deserialize = "PcsProverData: DeserializeOwned"))] pub struct StarkProvingKey { pub commit: Com, pub pc_start: Val, @@ -79,11 +83,11 @@ impl StarkProvingKey { } #[derive(Clone, Serialize, Deserialize)] -#[serde(bound = "SC: StarkGenericConfig")] +#[serde(bound(serialize = "Dom: Serialize"))] +#[serde(bound(deserialize = "Dom: DeserializeOwned"))] pub struct StarkVerifyingKey { pub commit: Com, pub pc_start: Val, - #[serde(skip)] pub chip_information: Vec<(String, Dom, Dimensions)>, pub chip_ordering: HashMap, } @@ -517,6 +521,9 @@ pub mod tests { use crate::runtime::Instruction; use crate::runtime::Opcode; use crate::runtime::Program; + use crate::stark::RiscvAir; + use crate::stark::StarkProvingKey; + use crate::stark::StarkVerifyingKey; use crate::utils; use crate::utils::prove; use crate::utils::run_test; @@ -684,4 +691,43 @@ pub mod tests { let program = ssz_withdrawals_program(); run_test(program).unwrap(); } + + #[test] + fn test_key_serde() { + let program = ssz_withdrawals_program(); + let config = BabyBearPoseidon2::new(); + let machine = RiscvAir::machine(config); + let (pk, vk) = machine.setup(&program); + + let serialized_pk = bincode::serialize(&pk).unwrap(); + let deserialized_pk: StarkProvingKey = + bincode::deserialize(&serialized_pk).unwrap(); + assert_eq!(pk.commit, deserialized_pk.commit); + assert_eq!(pk.pc_start, deserialized_pk.pc_start); + assert_eq!(pk.traces, deserialized_pk.traces); + assert_eq!(pk.data.root(), deserialized_pk.data.root()); + assert_eq!(pk.chip_ordering, deserialized_pk.chip_ordering); + + let serialized_vk = bincode::serialize(&vk).unwrap(); + let deserialized_vk: StarkVerifyingKey = + bincode::deserialize(&serialized_vk).unwrap(); + assert_eq!(vk.commit, deserialized_vk.commit); + assert_eq!(vk.pc_start, deserialized_vk.pc_start); + assert_eq!( + vk.chip_information.len(), + deserialized_vk.chip_information.len() + ); + for (a, b) in vk + .chip_information + .iter() + .zip(deserialized_vk.chip_information.iter()) + { + assert_eq!(a.0, b.0); + assert_eq!(a.1.log_n, b.1.log_n); + assert_eq!(a.1.shift, b.1.shift); + assert_eq!(a.2.height, b.2.height); + assert_eq!(a.2.width, b.2.width); + } + assert_eq!(vk.chip_ordering, deserialized_vk.chip_ordering); + } } diff --git a/examples/Cargo.lock b/examples/Cargo.lock index ce377df651..c6684b3326 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -827,7 +827,7 @@ dependencies = [ "bitflags 2.5.0", "cexpr", "clang-sys", - "itertools 0.12.1", + "itertools 0.10.5", "lazy_static", "lazycell", "log", @@ -2930,7 +2930,7 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "p3-air" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "p3-field", "p3-matrix", @@ -2939,7 +2939,7 @@ dependencies = [ [[package]] name = "p3-baby-bear" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "num-bigint 0.4.5", "p3-field", @@ -2953,7 +2953,7 @@ dependencies = [ [[package]] name = "p3-blake3" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "blake3", "p3-symmetric", @@ -2962,7 +2962,7 @@ dependencies = [ [[package]] name = "p3-bn254-fr" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "ff 0.13.0", "num-bigint 0.4.5", @@ -2976,7 +2976,7 @@ dependencies = [ [[package]] name = "p3-challenger" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "p3-field", "p3-maybe-rayon", @@ -2988,7 +2988,7 @@ dependencies = [ [[package]] name = "p3-commit" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "itertools 0.12.1", "p3-challenger", @@ -3001,7 +3001,7 @@ dependencies = [ [[package]] name = "p3-dft" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "p3-field", "p3-matrix", @@ -3013,7 +3013,7 @@ dependencies = [ [[package]] name = "p3-field" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "itertools 0.12.1", "num-bigint 0.4.5", @@ -3026,7 +3026,7 @@ dependencies = [ [[package]] name = "p3-fri" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "itertools 0.12.1", "p3-challenger", @@ -3044,7 +3044,7 @@ dependencies = [ [[package]] name = "p3-interpolation" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "p3-field", "p3-matrix", @@ -3054,7 +3054,7 @@ dependencies = [ [[package]] name = "p3-keccak" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "p3-symmetric", "tiny-keccak", @@ -3063,7 +3063,7 @@ dependencies = [ [[package]] name = "p3-keccak-air" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "p3-air", "p3-field", @@ -3076,7 +3076,7 @@ dependencies = [ [[package]] name = "p3-matrix" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "itertools 0.12.1", "p3-field", @@ -3090,7 +3090,7 @@ dependencies = [ [[package]] name = "p3-maybe-rayon" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "rayon", ] @@ -3098,7 +3098,7 @@ dependencies = [ [[package]] name = "p3-mds" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "itertools 0.12.1", "p3-dft", @@ -3112,7 +3112,7 @@ dependencies = [ [[package]] name = "p3-merkle-tree" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "itertools 0.12.1", "p3-commit", @@ -3128,7 +3128,7 @@ dependencies = [ [[package]] name = "p3-poseidon2" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "gcd", "p3-field", @@ -3140,7 +3140,7 @@ dependencies = [ [[package]] name = "p3-symmetric" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "itertools 0.12.1", "p3-field", @@ -3150,7 +3150,7 @@ dependencies = [ [[package]] name = "p3-uni-stark" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "itertools 0.12.1", "p3-air", @@ -3168,7 +3168,7 @@ dependencies = [ [[package]] name = "p3-util" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" dependencies = [ "serde", ] @@ -3497,7 +3497,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9554e3ab233f0a932403704f1a1d08c30d5ccd931adfdfa1e8b5a19b52c1d55a" dependencies = [ "anyhow", - "itertools 0.12.1", + "itertools 0.10.5", "proc-macro2", "quote", "syn 2.0.61", @@ -4491,6 +4491,7 @@ dependencies = [ "hex", "indicatif", "itertools 0.12.1", + "num-bigint 0.4.5", "p3-baby-bear", "p3-bn254-fr", "p3-challenger", @@ -4615,6 +4616,7 @@ dependencies = [ "cc", "crossbeam", "log", + "num-bigint 0.4.5", "p3-baby-bear", "p3-field", "rand", @@ -4668,6 +4670,7 @@ dependencies = [ "hex", "indicatif", "log", + "num-bigint 0.4.5", "p3-commit", "p3-field", "p3-matrix", diff --git a/examples/fibonacci/script/bin/execute.rs b/examples/fibonacci/script/bin/execute.rs index e01d5667e6..be8776b414 100644 --- a/examples/fibonacci/script/bin/execute.rs +++ b/examples/fibonacci/script/bin/execute.rs @@ -15,7 +15,7 @@ fn main() { // Only execute the program and get a `SP1PublicValues` object. let client = ProverClient::new(); - let mut public_values = client.execute(&ELF, stdin).unwrap(); + let mut public_values = client.execute(ELF, stdin).unwrap(); println!("generated proof"); From df9a3466790530b15a507140d5cb2ffb7b159381 Mon Sep 17 00:00:00 2001 From: Chris T Date: Mon, 20 May 2024 17:11:10 -0700 Subject: [PATCH 03/42] chore: SP1ProvingKey serde (#772) --- prover/src/types.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/prover/src/types.rs b/prover/src/types.rs index e3aa597bd9..198dc62660 100644 --- a/prover/src/types.rs +++ b/prover/src/types.rs @@ -23,6 +23,7 @@ use crate::{utils::babybear_bytes_to_bn254, words_to_bytes}; use crate::{utils::babybears_to_bn254, CoreSC, InnerSC}; /// The information necessary to generate a proof for a given RISC-V program. +#[derive(Clone, Serialize, Deserialize)] pub struct SP1ProvingKey { pub pk: StarkProvingKey, pub elf: Vec, From 82b515f87eee0bca11fec14542fcb6d694f54ccb Mon Sep 17 00:00:00 2001 From: Kevin Jue Date: Tue, 21 May 2024 18:38:57 -0700 Subject: [PATCH 04/42] chore(recursion): convert ext2felt to hint (#771) --- recursion/compiler/src/asm/compiler.rs | 4 ++-- recursion/compiler/src/asm/instruction.rs | 10 ++++++---- recursion/compiler/src/ir/instructions.rs | 2 +- recursion/compiler/src/ir/utils.rs | 14 +++++++++++++- recursion/core/src/cpu/air/mod.rs | 2 ++ recursion/core/src/cpu/columns/opcode.rs | 21 ++++++++++++++------- recursion/core/src/runtime/mod.rs | 3 +-- recursion/core/src/runtime/opcode.rs | 2 +- recursion/core/src/stark/mod.rs | 2 +- 9 files changed, 41 insertions(+), 19 deletions(-) diff --git a/recursion/compiler/src/asm/compiler.rs b/recursion/compiler/src/asm/compiler.rs index da94fd9d92..d8376861fa 100644 --- a/recursion/compiler/src/asm/compiler.rs +++ b/recursion/compiler/src/asm/compiler.rs @@ -485,9 +485,9 @@ impl + TwoAdicField> AsmCo DslIr::PrintF(dst) => self.push(AsmInstruction::PrintF(dst.fp()), trace), DslIr::PrintV(dst) => self.push(AsmInstruction::PrintV(dst.fp()), trace), DslIr::PrintE(dst) => self.push(AsmInstruction::PrintE(dst.fp()), trace), - DslIr::Ext2Felt(dst, src) => match (dst, src) { + DslIr::HintExt2Felt(dst, src) => match (dst, src) { (Array::Dyn(dst, _), src) => { - self.push(AsmInstruction::Ext2Felt(dst.fp(), src.fp()), trace) + self.push(AsmInstruction::HintExt2Felt(dst.fp(), src.fp()), trace) } _ => unimplemented!(), }, diff --git a/recursion/compiler/src/asm/instruction.rs b/recursion/compiler/src/asm/instruction.rs index c7083c81c9..c83b0cf785 100644 --- a/recursion/compiler/src/asm/instruction.rs +++ b/recursion/compiler/src/asm/instruction.rs @@ -160,7 +160,7 @@ pub enum AsmInstruction { PrintE(i32), /// Convert an extension element to field elements. - Ext2Felt(i32, i32), + HintExt2Felt(i32, i32), /// Hint the lenght of the next vector of blocks. HintLen(i32), @@ -786,8 +786,8 @@ impl> AsmInstruction { false, name, ), - AsmInstruction::Ext2Felt(dst, src) => Instruction::new( - Opcode::Ext2Felt, + AsmInstruction::HintExt2Felt(dst, src) => Instruction::new( + Opcode::HintExt2Felt, i32_f(dst), i32_f_arr(src), f_u32(F::zero()), @@ -1113,7 +1113,9 @@ impl> AsmInstruction { AsmInstruction::PrintE(dst) => { write!(f, "print_e ({})fp", dst) } - AsmInstruction::Ext2Felt(dst, src) => write!(f, "ext2felt ({})fp, {})fp", dst, src), + AsmInstruction::HintExt2Felt(dst, src) => { + write!(f, "hintExt2felt ({})fp, {})fp", dst, src) + } AsmInstruction::HintLen(dst) => write!(f, "hint_len ({})fp", dst), AsmInstruction::Hint(dst) => write!(f, "hint ({})fp", dst), AsmInstruction::FriFold(m, input_ptr) => { diff --git a/recursion/compiler/src/ir/instructions.rs b/recursion/compiler/src/ir/instructions.rs index ee717b1f13..b3986f05d9 100644 --- a/recursion/compiler/src/ir/instructions.rs +++ b/recursion/compiler/src/ir/instructions.rs @@ -146,7 +146,7 @@ pub enum DslIr { TwoAdicGenerator(Felt, Usize), ExpUsizeV(Var, Var, Usize), ExpUsizeF(Felt, Felt, Usize), - Ext2Felt(Array>, Ext), + HintExt2Felt(Array>, Ext), HintLen(Var), HintVars(Array>), HintFelts(Array>), diff --git a/recursion/compiler/src/ir/utils.rs b/recursion/compiler/src/ir/utils.rs index 56e8f38805..bea55c21b4 100644 --- a/recursion/compiler/src/ir/utils.rs +++ b/recursion/compiler/src/ir/utils.rs @@ -202,7 +202,19 @@ impl Builder { /// Converts an ext to a slice of felts. pub fn ext2felt(&mut self, value: Ext) -> Array> { let result = self.dyn_array(4); - self.operations.push(DslIr::Ext2Felt(result.clone(), value)); + self.operations + .push(DslIr::HintExt2Felt(result.clone(), value)); + + // Verify that the decomposed extension element is correct. + let mut reconstructed_ext: Ext = self.constant(C::EF::zero()); + for i in 0..4 { + let felt = self.get(&result, i); + let monomial: Ext = self.constant(C::EF::monomial(i)); + reconstructed_ext = self.eval(reconstructed_ext + monomial * felt); + } + + self.assert_ext_eq(reconstructed_ext, value); + result } diff --git a/recursion/core/src/cpu/air/mod.rs b/recursion/core/src/cpu/air/mod.rs index 10edc7a477..28aa41c254 100644 --- a/recursion/core/src/cpu/air/mod.rs +++ b/recursion/core/src/cpu/air/mod.rs @@ -183,6 +183,8 @@ impl CpuChip { + local.selectors.is_fri_fold + local.selectors.is_poseidon + local.selectors.is_store + + local.selectors.is_noop + + local.selectors.is_ext_to_felt } /// Expr to check for instructions that are commit instructions. diff --git a/recursion/core/src/cpu/columns/opcode.rs b/recursion/core/src/cpu/columns/opcode.rs index fcea11ce71..c53898e6a3 100644 --- a/recursion/core/src/cpu/columns/opcode.rs +++ b/recursion/core/src/cpu/columns/opcode.rs @@ -40,6 +40,7 @@ pub struct OpcodeSelectorCols { pub is_poseidon: T, pub is_fri_fold: T, pub is_commit: T, + pub is_ext_to_felt: T, } impl OpcodeSelectorCols { @@ -65,14 +66,19 @@ impl OpcodeSelectorCols { Opcode::HALT => self.is_halt = F::one(), Opcode::FRIFold => self.is_fri_fold = F::one(), Opcode::Poseidon2Compress => self.is_poseidon = F::one(), - // TODO: Double-check that `is_noop` is constrained properly in the CPU air. - Opcode::Ext2Felt => self.is_noop = F::one(), - Opcode::HintBits => self.is_noop = F::one(), - Opcode::PrintF => self.is_noop = F::one(), - Opcode::PrintE => self.is_noop = F::one(), Opcode::Commit => self.is_commit = F::one(), - Opcode::RegisterPublicValue => self.is_noop = F::one(), - _ => {} + Opcode::HintExt2Felt => self.is_ext_to_felt = F::one(), + + Opcode::Hint + | Opcode::HintBits + | Opcode::PrintF + | Opcode::PrintE + | Opcode::RegisterPublicValue + | Opcode::CycleTracker => { + self.is_noop = F::one(); + } + + Opcode::HintLen | Opcode::LessThanF => {} } if matches!( @@ -109,6 +115,7 @@ impl IntoIterator for &OpcodeSelectorCols { self.is_poseidon, self.is_fri_fold, self.is_commit, + self.is_ext_to_felt, ] .into_iter() } diff --git a/recursion/core/src/runtime/mod.rs b/recursion/core/src/runtime/mod.rs index 31703cdf42..fb2ab85479 100644 --- a/recursion/core/src/runtime/mod.rs +++ b/recursion/core/src/runtime/mod.rs @@ -604,10 +604,9 @@ where let (a_val, b_val, c_val) = self.all_rr(&instruction); (a, b, c) = (a_val, b_val, c_val); } - Opcode::Ext2Felt => { + Opcode::HintExt2Felt => { let (a_val, b_val, c_val) = self.all_rr(&instruction); let dst = a_val[0].as_canonical_u32() as usize; - // TODO: this should be a hint and perhaps the compiler needs to change to make it a hint? self.mw_uninitialized(dst, Block::from(b_val[0])); self.mw_uninitialized(dst + 1, Block::from(b_val[1])); self.mw_uninitialized(dst + 2, Block::from(b_val[2])); diff --git a/recursion/core/src/runtime/opcode.rs b/recursion/core/src/runtime/opcode.rs index fb471e443d..8c373ca201 100644 --- a/recursion/core/src/runtime/opcode.rs +++ b/recursion/core/src/runtime/opcode.rs @@ -40,7 +40,7 @@ pub enum Opcode { PrintF = 33, PrintE = 34, - Ext2Felt = 35, + HintExt2Felt = 35, FRIFold = 36, HintLen = 37, diff --git a/recursion/core/src/stark/mod.rs b/recursion/core/src/stark/mod.rs index 2e97eec030..7981c77ed8 100644 --- a/recursion/core/src/stark/mod.rs +++ b/recursion/core/src/stark/mod.rs @@ -77,7 +77,7 @@ impl, const DEGREE: usize> RecursionAi pub fn get_wrap_all() -> Vec { once(RecursionAir::Program(ProgramChip)) .chain(once(RecursionAir::Cpu(CpuChip { - fixed_log2_rows: Some(20), + fixed_log2_rows: Some(21), _phantom: PhantomData, }))) .chain(once(RecursionAir::MemoryGlobal(MemoryGlobalChip { From ce200895a481628a93d6b588779cfe47b45b3314 Mon Sep 17 00:00:00 2001 From: Kevin Jue Date: Tue, 21 May 2024 19:01:23 -0700 Subject: [PATCH 05/42] chore(recursion): heap ptr checks (#775) --- recursion/compiler/src/asm/compiler.rs | 8 ++--- recursion/compiler/src/asm/instruction.rs | 3 +- recursion/compiler/src/lib.rs | 1 - recursion/compiler/src/util.rs | 11 ------- recursion/core/src/cpu/air/heap.rs | 29 ++++++++++++++++ recursion/core/src/cpu/air/mod.rs | 4 +++ recursion/core/src/cpu/columns/heap_expand.rs | 8 +++++ recursion/core/src/cpu/columns/mod.rs | 1 + recursion/core/src/cpu/columns/opcode.rs | 16 +++++++-- .../core/src/cpu/columns/opcode_specific.rs | 10 ++++++ recursion/core/src/cpu/trace.rs | 15 ++++++++- recursion/core/src/runtime/mod.rs | 16 +++++++++ recursion/core/src/runtime/utils.rs | 33 +++++++++++++++++++ 13 files changed, 132 insertions(+), 23 deletions(-) delete mode 100644 recursion/compiler/src/util.rs create mode 100644 recursion/core/src/cpu/air/heap.rs create mode 100644 recursion/core/src/cpu/columns/heap_expand.rs create mode 100644 recursion/core/src/runtime/utils.rs diff --git a/recursion/compiler/src/asm/compiler.rs b/recursion/compiler/src/asm/compiler.rs index d8376861fa..a84775f4fa 100644 --- a/recursion/compiler/src/asm/compiler.rs +++ b/recursion/compiler/src/asm/compiler.rs @@ -1,13 +1,14 @@ use alloc::collections::BTreeMap; use alloc::vec; use backtrace::Backtrace; +use sp1_recursion_core::runtime::HEAP_PTR; +use sp1_recursion_core::runtime::HEAP_START_ADDRESS; use std::collections::BTreeSet; use p3_field::ExtensionField; use p3_field::PrimeField32; use p3_field::TwoAdicField; use sp1_recursion_core::runtime::RecursionProgram; -use sp1_recursion_core::runtime::STACK_SIZE; use super::config::AsmConfig; use super::IndexTriple; @@ -25,9 +26,6 @@ pub(crate) const ZERO: i32 = 0; /// The offset which the stack starts. pub(crate) const STACK_START_OFFSET: i32 = 16; -/// The heap pointer address. -pub(crate) const HEAP_PTR: i32 = -4; - /// The address of A0. pub(crate) const A0: i32 = -8; @@ -96,7 +94,7 @@ impl + TwoAdicField> AsmCo pub fn build(&mut self, operations: TracedVec>>) { // Set the heap pointer value according to stack size. if self.block_label().is_zero() { - let stack_size = F::from_canonical_usize(STACK_SIZE + 4); + let stack_size = F::from_canonical_usize(HEAP_START_ADDRESS); self.push(AsmInstruction::AddFI(HEAP_PTR, ZERO, stack_size), None); } diff --git a/recursion/compiler/src/asm/instruction.rs b/recursion/compiler/src/asm/instruction.rs index c83b0cf785..0d965e6fee 100644 --- a/recursion/compiler/src/asm/instruction.rs +++ b/recursion/compiler/src/asm/instruction.rs @@ -4,10 +4,9 @@ use core::fmt; use p3_field::{ExtensionField, PrimeField32}; use sp1_recursion_core::cpu::Instruction; -use sp1_recursion_core::runtime::{Opcode, PERMUTATION_WIDTH}; +use sp1_recursion_core::runtime::{canonical_i32_to_field, Opcode, PERMUTATION_WIDTH}; use super::A0; -use crate::util::canonical_i32_to_field; #[derive(Debug, Clone)] pub enum AsmInstruction { diff --git a/recursion/compiler/src/lib.rs b/recursion/compiler/src/lib.rs index a8d26dacdf..210d4b22a6 100644 --- a/recursion/compiler/src/lib.rs +++ b/recursion/compiler/src/lib.rs @@ -7,7 +7,6 @@ pub mod asm; pub mod config; pub mod constraints; pub mod ir; -pub mod util; pub mod prelude { pub use crate::asm::AsmCompiler; diff --git a/recursion/compiler/src/util.rs b/recursion/compiler/src/util.rs deleted file mode 100644 index c0e746b611..0000000000 --- a/recursion/compiler/src/util.rs +++ /dev/null @@ -1,11 +0,0 @@ -use p3_field::PrimeField32; - -pub fn canonical_i32_to_field(x: i32) -> F { - let modulus = F::ORDER_U32; - assert!(x < modulus as i32 && x >= -(modulus as i32)); - if x < 0 { - -F::from_canonical_u32((-x) as u32) - } else { - F::from_canonical_u32(x as u32) - } -} diff --git a/recursion/core/src/cpu/air/heap.rs b/recursion/core/src/cpu/air/heap.rs new file mode 100644 index 0000000000..4ec656a89e --- /dev/null +++ b/recursion/core/src/cpu/air/heap.rs @@ -0,0 +1,29 @@ +use p3_field::{AbstractField, Field}; + +use crate::{ + air::SP1RecursionAirBuilder, + cpu::{CpuChip, CpuCols}, + memory::MemoryCols, + runtime::HEAP_START_ADDRESS, +}; + +impl CpuChip { + /// Eval the heap ptr. + ///s + /// This function will ensure that the heap size never goes above 2^28. + pub fn eval_heap_ptr(&self, builder: &mut AB, local: &CpuCols) + where + AB: SP1RecursionAirBuilder, + { + let heap_columns = local.opcode_specific.heap_expand(); + + let heap_size = local.a.value()[0] - AB::Expr::from_canonical_usize(HEAP_START_ADDRESS); + + builder.eval_range_check_28bits( + heap_size, + heap_columns.diff_16bit_limb, + heap_columns.diff_12bit_limb, + local.selectors.is_heap_expand, + ); + } +} diff --git a/recursion/core/src/cpu/air/mod.rs b/recursion/core/src/cpu/air/mod.rs index 28aa41c254..a817ea2886 100644 --- a/recursion/core/src/cpu/air/mod.rs +++ b/recursion/core/src/cpu/air/mod.rs @@ -1,5 +1,6 @@ mod alu; mod branch; +mod heap; mod jump; mod memory; mod operands; @@ -89,6 +90,9 @@ where // Constrain the system instructions (TRAP, HALT). self.eval_system_instructions(builder, local, next, public_values); + // Verify the heap size. + self.eval_heap_ptr(builder, local); + // Constrain the is_real_flag. self.eval_is_real(builder, local, next); } diff --git a/recursion/core/src/cpu/columns/heap_expand.rs b/recursion/core/src/cpu/columns/heap_expand.rs new file mode 100644 index 0000000000..fcdaa882d9 --- /dev/null +++ b/recursion/core/src/cpu/columns/heap_expand.rs @@ -0,0 +1,8 @@ +use sp1_derive::AlignedBorrow; + +#[derive(AlignedBorrow, Default, Debug, Clone, Copy)] +#[repr(C)] +pub struct HeapExpandCols { + pub diff_16bit_limb: T, + pub diff_12bit_limb: T, +} diff --git a/recursion/core/src/cpu/columns/mod.rs b/recursion/core/src/cpu/columns/mod.rs index 330a1e98e0..c5b863a202 100644 --- a/recursion/core/src/cpu/columns/mod.rs +++ b/recursion/core/src/cpu/columns/mod.rs @@ -6,6 +6,7 @@ use sp1_core::utils::indices_arr; use sp1_derive::AlignedBorrow; mod branch; +mod heap_expand; mod instruction; mod memory; mod opcode; diff --git a/recursion/core/src/cpu/columns/opcode.rs b/recursion/core/src/cpu/columns/opcode.rs index c53898e6a3..6fb0026948 100644 --- a/recursion/core/src/cpu/columns/opcode.rs +++ b/recursion/core/src/cpu/columns/opcode.rs @@ -1,7 +1,10 @@ -use p3_field::Field; +use p3_field::PrimeField32; use sp1_derive::AlignedBorrow; -use crate::{cpu::Instruction, runtime::Opcode}; +use crate::{ + cpu::Instruction, + runtime::{instruction_is_heap_expand, Opcode}, +}; const OPCODE_COUNT: usize = core::mem::size_of::>(); @@ -41,9 +44,11 @@ pub struct OpcodeSelectorCols { pub is_fri_fold: T, pub is_commit: T, pub is_ext_to_felt: T, + + pub is_heap_expand: T, } -impl OpcodeSelectorCols { +impl OpcodeSelectorCols { /// Populates the opcode columns with the given instruction. /// /// The opcode flag should be set to 1 for the relevant opcode and 0 for the rest. We already @@ -87,6 +92,10 @@ impl OpcodeSelectorCols { ) { self.is_ext = F::one(); } + + if instruction_is_heap_expand(instruction) { + self.is_heap_expand = F::one(); + } } } @@ -116,6 +125,7 @@ impl IntoIterator for &OpcodeSelectorCols { self.is_fri_fold, self.is_commit, self.is_ext_to_felt, + self.is_heap_expand, ] .into_iter() } diff --git a/recursion/core/src/cpu/columns/opcode_specific.rs b/recursion/core/src/cpu/columns/opcode_specific.rs index 1b577cde2d..47a6d38acf 100644 --- a/recursion/core/src/cpu/columns/opcode_specific.rs +++ b/recursion/core/src/cpu/columns/opcode_specific.rs @@ -2,6 +2,7 @@ use std::fmt::{Debug, Formatter}; use std::mem::{size_of, transmute}; use super::branch::BranchCols; +use super::heap_expand::HeapExpandCols; use super::memory::MemoryCols; use super::public_values::PublicValuesCols; @@ -14,6 +15,7 @@ pub union OpcodeSpecificCols { branch: BranchCols, memory: MemoryCols, public_values: PublicValuesCols, + heap_expand: HeapExpandCols, } impl Default for OpcodeSpecificCols { @@ -56,4 +58,12 @@ impl OpcodeSpecificCols { pub fn public_values_mut(&mut self) -> &mut PublicValuesCols { unsafe { &mut self.public_values } } + + pub fn heap_expand(&self) -> &HeapExpandCols { + unsafe { &self.heap_expand } + } + + pub fn heap_expand_mut(&mut self) -> &mut HeapExpandCols { + unsafe { &mut self.heap_expand } + } } diff --git a/recursion/core/src/cpu/trace.rs b/recursion/core/src/cpu/trace.rs index 318d291943..4ee78b9e42 100644 --- a/recursion/core/src/cpu/trace.rs +++ b/recursion/core/src/cpu/trace.rs @@ -11,7 +11,10 @@ use tracing::instrument; use crate::{ air::BinomialExtensionUtils, memory::MemoryCols, - runtime::{ExecutionRecord, Opcode, RecursionProgram, D}, + runtime::{ + get_heap_size_range_check_events, instruction_is_heap_expand, ExecutionRecord, Opcode, + RecursionProgram, D, + }, }; use super::{CpuChip, CpuCols, CPU_COL_MAP, NUM_CPU_COLS}; @@ -69,6 +72,16 @@ impl> MachineAir for CpuChip { memory_cols.memory_addr = record.addr; } + // Populate the heap columns. + if instruction_is_heap_expand(&event.instruction) { + let (u16_range_check, u12_range_check) = + get_heap_size_range_check_events(cols.a.value()[0]); + + let heap_cols = cols.opcode_specific.heap_expand_mut(); + heap_cols.diff_16bit_limb = F::from_canonical_u16(u16_range_check.val); + heap_cols.diff_12bit_limb = F::from_canonical_u16(u12_range_check.val); + } + // Populate the branch columns. if matches!( event.instruction.opcode, diff --git a/recursion/core/src/runtime/mod.rs b/recursion/core/src/runtime/mod.rs index fb2ab85479..77a118326a 100644 --- a/recursion/core/src/runtime/mod.rs +++ b/recursion/core/src/runtime/mod.rs @@ -2,6 +2,7 @@ mod instruction; mod opcode; mod program; mod record; +mod utils; use std::collections::VecDeque; use std::process::exit; @@ -17,6 +18,7 @@ use p3_symmetric::CryptographicPermutation; use p3_symmetric::Permutation; pub use program::*; pub use record::*; +pub use utils::*; use crate::air::{Block, RECURSION_PUBLIC_VALUES_COL_MAP, RECURSIVE_PROOF_NUM_PV_ELTS}; use crate::cpu::CpuEvent; @@ -28,6 +30,10 @@ use crate::range_check::{RangeCheckEvent, RangeCheckOpcode}; use p3_field::{ExtensionField, PrimeField32}; use sp1_core::runtime::MemoryAccessPosition; +/// The heap pointer address. +pub const HEAP_PTR: i32 = -4; +pub const HEAP_START_ADDRESS: usize = STACK_SIZE + 4; + pub const STACK_SIZE: usize = 1 << 24; pub const MEMORY_SIZE: usize = 1 << 28; @@ -440,6 +446,16 @@ where let mut a_val = Block::default(); a_val[0] = b_val[0] + c_val[0]; self.mw_cpu(a_ptr, a_val, MemoryAccessPosition::A); + + // If the instruction is a heap expansion, we need to add a range check event to + // ensure that the heap size never goes above 2^28. + if instruction_is_heap_expand(&instruction) { + let (u16_range_check, u12_range_check) = + get_heap_size_range_check_events(a_val[0]); + self.record + .add_range_check_events(&[u16_range_check, u12_range_check]); + } + (a, b, c) = (a_val, b_val, c_val); } Opcode::LessThanF => { diff --git a/recursion/core/src/runtime/utils.rs b/recursion/core/src/runtime/utils.rs new file mode 100644 index 0000000000..b7710186d7 --- /dev/null +++ b/recursion/core/src/runtime/utils.rs @@ -0,0 +1,33 @@ +use p3_field::PrimeField32; + +use crate::range_check::{RangeCheckEvent, RangeCheckOpcode}; + +use super::{Instruction, Opcode, HEAP_PTR, HEAP_START_ADDRESS}; + +pub fn canonical_i32_to_field(x: i32) -> F { + let modulus = F::ORDER_U32; + assert!(x < modulus as i32 && x >= -(modulus as i32)); + if x < 0 { + -F::from_canonical_u32((-x) as u32) + } else { + F::from_canonical_u32(x as u32) + } +} + +pub fn get_heap_size_range_check_events( + end_heap_address: F, +) -> (RangeCheckEvent, RangeCheckEvent) { + let heap_size = + (end_heap_address - F::from_canonical_usize(HEAP_START_ADDRESS)).as_canonical_u32(); + let diff_16bit_limb = heap_size & 0xffff; + let diff_12bit_limb = (heap_size >> 16) & 0xfff; + + ( + RangeCheckEvent::new(RangeCheckOpcode::U16, diff_16bit_limb as u16), + RangeCheckEvent::new(RangeCheckOpcode::U12, diff_12bit_limb as u16), + ) +} + +pub fn instruction_is_heap_expand(instruction: &Instruction) -> bool { + instruction.opcode == Opcode::ADD && instruction.op_a == canonical_i32_to_field(HEAP_PTR) +} From b4a597f9bf4599b72365d31b65e778e7859adfd4 Mon Sep 17 00:00:00 2001 From: Ratan Kaliani Date: Tue, 21 May 2024 21:17:14 -0700 Subject: [PATCH 06/42] feat: groth16 feature flag (#782) --- .github/workflows/main.yml | 2 +- .github/workflows/pr.yml | 4 +- Cargo.lock | 272 +++++++++--------- book/getting-started/install.md | 2 +- book/verifying-proofs/solidity-and-evm.md | 5 + examples/Cargo.lock | 1 + examples/aggregation/script/Cargo.toml | 4 +- .../program/elf/riscv32im-succinct-zkvm-elf | Bin 127644 -> 127668 bytes examples/fibonacci/script/Cargo.toml | 2 +- prover/Cargo.toml | 3 + recursion/gnark-ffi/Cargo.toml | 7 + recursion/gnark-ffi/build.rs | 99 ++++--- recursion/gnark-ffi/src/ffi.rs | 116 +++++--- recursion/gnark-ffi/src/groth16.rs | 7 +- sdk/Cargo.toml | 10 +- sdk/src/provers/local.rs | 48 ++-- 16 files changed, 332 insertions(+), 250 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 489cc91052..33320d62be 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -35,7 +35,7 @@ jobs: with: command: test toolchain: nightly-2024-04-17 - args: --release -p sp1-sdk -- test_e2e_prove_groth16 --nocapture + args: --release -p sp1-sdk --features groth16 -- test_e2e_prove_groth16 --nocapture env: RUSTFLAGS: -Copt-level=3 -Cdebug-assertions -Coverflow-checks=y -Cdebuginfo=0 -C target-cpu=native RUST_BACKTRACE: 1 \ No newline at end of file diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 3056dae375..ff5a26540e 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -45,7 +45,7 @@ jobs: with: command: test toolchain: nightly-2024-04-17 - args: --release -- --nocapture + args: --release --features groth16 env: RUSTFLAGS: -Copt-level=3 -Cdebug-assertions -Coverflow-checks=y -Cdebuginfo=0 -C target-cpu=native RUST_BACKTRACE: 1 @@ -76,7 +76,7 @@ jobs: with: command: test toolchain: nightly-2024-04-17 - args: --release + args: --release --features groth16 env: RUSTFLAGS: -Copt-level=3 -Cdebug-assertions -Coverflow-checks=y -Cdebuginfo=0 -C target-cpu=native RUST_BACKTRACE: 1 diff --git a/Cargo.lock b/Cargo.lock index 6e10c5bfee..10eb4fd0b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -106,9 +106,9 @@ dependencies = [ [[package]] name = "alloy-core" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e30b83573b348305b9629a094b5331093a030514cd5713433799495cb283fea1" +checksum = "f7253846c7bf55147775fd66c334abc1dd0a41e97e6155577b3dc513c6e66ef2" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -118,9 +118,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545885d9b0b2c30fd344ae291439b4bfe59e48dd62fbc862f8503d98088967dc" +checksum = "8425a283510106b1a6ad25dd4bb648ecde7da3fd2baeb9400a85ad62f51ec90b" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -158,9 +158,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786689872ec4e7d354810ab0dffd48bb40b838c047522eb031cbd47d15634849" +checksum = "7e30946aa6173020259055a44971f5cf40a7d76c931d209caeb51b333263df4f" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -198,9 +198,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525448f6afc1b70dd0f9d0a8145631bf2f5e434678ab23ab18409ca264cae6b3" +checksum = "db8aa973e647ec336810a9356af8aea787249c9d00b1525359f3db29a68d231b" dependencies = [ "alloy-rlp", "bytes", @@ -263,7 +263,7 @@ checksum = "1a047897373be4bbb0224c1afdabca92648dc57a9c9ef6e7b0be3aff7a859c83" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -356,9 +356,23 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89c80a2cb97e7aa48611cbb63950336f9824a174cdf670527cc6465078a26ea1" +checksum = "7dbd17d67f3e89478c8a634416358e539e577899666c927bc3d2b1328ee9b6ca" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.65", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6da95adcf4760bb4b108fefa51d50096c5e5fdd29ee72fed3e86ee414f2e34" dependencies = [ "alloy-json-abi", "alloy-sol-macro-input", @@ -368,16 +382,16 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58894b58ac50979eeac6249661991ac40b9d541830d9a725f7714cc9ef08c23" +checksum = "32c8da04c1343871fb6ce5a489218f9c85323c8340a36e9106b5fc98d4dd59d5" dependencies = [ "alloy-json-abi", "const-hex", @@ -386,24 +400,24 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.61", + "syn 2.0.65", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8e71ea68e780cc203919e03f69f59e7afe92d2696fb1dcb6662f61e4031b6" +checksum = "368cae4dc052cad1d8f72eb2ae0c38027116933eeb49213c200a9e9875f208d7" dependencies = [ "winnow 0.6.8", ] [[package]] name = "alloy-sol-types" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "399287f68d1081ed8b1f4903c49687658b95b142207d7cb4ae2f4813915343ef" +checksum = "40a64d2d2395c1ac636b62419a7b17ec39031d6b2367e66e9acbf566e6055e9c" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -524,9 +538,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.83" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bdb32cbbdce2b519a9cd7df3a678443100e265d5e25ca763b7572a5104f5f3" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" dependencies = [ "backtrace", ] @@ -692,7 +706,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -703,9 +717,15 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "auto_impl" version = "1.2.0" @@ -714,7 +734,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -836,7 +856,7 @@ dependencies = [ "bitflags 2.5.0", "cexpr", "clang-sys", - "itertools 0.10.5", + "itertools 0.12.1", "lazy_static", "lazycell", "log", @@ -846,7 +866,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.61", + "syn 2.0.65", "which", ] @@ -1005,9 +1025,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" dependencies = [ "serde", ] @@ -1043,9 +1063,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.97" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" +checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" dependencies = [ "jobserver", "libc", @@ -1137,7 +1157,7 @@ dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.1", + "strsim", ] [[package]] @@ -1149,7 +1169,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -1179,9 +1199,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.11.3" +version = "1.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ba00838774b4ab0233e355d26710fbfc8327a05c017f6dc4873f876d1f79f78" +checksum = "70ff96486ccc291d36a958107caf2c0af8c78c0af7d31ae2f35ce055130de1a6" dependencies = [ "cfg-if", "cpufeatures", @@ -1235,9 +1255,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -1293,9 +1313,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ "crossbeam-utils", ] @@ -1330,9 +1350,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -1407,14 +1427,14 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] name = "darling" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" dependencies = [ "darling_core", "darling_macro", @@ -1422,27 +1442,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", - "syn 2.0.61", + "strsim", + "syn 2.0.65", ] [[package]] name = "darling_macro" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -1604,9 +1624,9 @@ dependencies = [ [[package]] name = "either" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" [[package]] name = "elf" @@ -1724,9 +1744,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38793c55593b33412e3ae40c2c9781ffaa6f438f6f8c10f24e71846fbd7ae01e" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "filetime" @@ -1854,7 +1874,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -2000,15 +2020,15 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", "http 1.1.0", "indexmap 2.2.6", "slab", @@ -2218,7 +2238,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.4", + "h2 0.4.5", "http 1.1.0", "http-body 1.0.0", "httparse", @@ -2393,9 +2413,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] @@ -2504,9 +2524,9 @@ dependencies = [ [[package]] name = "keccak-asm" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb8515fff80ed850aea4a1595f2e519c003e2a00a82fe168ebf5269196caf444" +checksum = "47a3633291834c4fbebf8673acbc1b04ec9d151418ff9b8e26dcd79129928758" dependencies = [ "digest 0.10.7", "sha3-asm", @@ -2529,9 +2549,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.154" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libgit2-sys" @@ -2585,9 +2605,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" @@ -2655,9 +2675,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" dependencies = [ "adler", ] @@ -2900,7 +2920,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -3307,7 +3327,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -3346,9 +3366,9 @@ checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" [[package]] name = "plotters" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3" dependencies = [ "num-traits", "plotters-backend", @@ -3359,15 +3379,15 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" +checksum = "414cec62c6634ae900ea1c56128dfe87cf63e7caece0852ec76aba307cebadb7" [[package]] name = "plotters-svg" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +checksum = "81b30686a7d9c3e010b84284bdd26a29f2138574f52f5eb6f794fc0ad924e705" dependencies = [ "plotters-backend", ] @@ -3397,7 +3417,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -3456,9 +3476,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.82" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" +checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" dependencies = [ "unicode-ident", ] @@ -3485,9 +3505,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" dependencies = [ "bytes", "prost-derive", @@ -3495,22 +3515,22 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.5" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9554e3ab233f0a932403704f1a1d08c30d5ccd931adfdfa1e8b5a19b52c1d55a" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] name = "prost-types" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" dependencies = [ "prost", ] @@ -3730,7 +3750,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.4.4", + "h2 0.4.5", "http 1.1.0", "http-body 1.0.0", "http-body-util", @@ -3928,7 +3948,7 @@ dependencies = [ "log", "ring", "rustls-pki-types", - "rustls-webpki 0.102.3", + "rustls-webpki 0.102.4", "subtle", "zeroize", ] @@ -3970,9 +3990,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.3" +version = "0.102.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" +checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" dependencies = [ "ring", "rustls-pki-types", @@ -3981,9 +4001,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "092474d1a01ea8278f69e6a358998405fae5b8b963ddaeb2b0b04a128bf1dfb0" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "rusty-fork" @@ -4142,22 +4162,22 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.201" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" +checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.201" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" +checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -4220,7 +4240,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -4245,7 +4265,7 @@ checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -4271,9 +4291,9 @@ dependencies = [ [[package]] name = "sha3-asm" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bac61da6b35ad76b195eb4771210f947734321a8d81d7738e1580d953bc7a15e" +checksum = "a9b57fd861253bff08bb1919e995f90ba8f4889de2726091c8876f3a4e823b40" dependencies = [ "cc", "cfg-if", @@ -4659,6 +4679,7 @@ version = "0.1.0" dependencies = [ "bindgen", "cc", + "cfg-if", "crossbeam", "log", "num-bigint 0.4.5", @@ -4709,6 +4730,7 @@ dependencies = [ "async-trait", "axum", "bincode", + "cfg-if", "dirs", "dotenv", "futures", @@ -4782,12 +4804,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strsim" version = "0.11.1" @@ -4810,7 +4826,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -4841,9 +4857,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.61" +version = "2.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c993ed8ccba56ae856363b1845da7266a7cb78e1d146c8a32d54b45a8b831fc9" +checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" dependencies = [ "proc-macro2", "quote", @@ -4852,14 +4868,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa0cefd02f532035d83cfec82647c6eb53140b0485220760e669f4bad489e36" +checksum = "b8db114c44cf843a8bacd37a146e37987a0b823a0e8bc4fdc610c9c72ab397a5" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -4932,22 +4948,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.60" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.60" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -5063,7 +5079,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -5124,9 +5140,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" [[package]] name = "toml_edit" @@ -5210,7 +5226,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -5459,7 +5475,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", "wasm-bindgen-shared", ] @@ -5493,7 +5509,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5824,7 +5840,7 @@ checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -5844,7 +5860,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] diff --git a/book/getting-started/install.md b/book/getting-started/install.md index 474ea8087e..abd3b34a7f 100644 --- a/book/getting-started/install.md +++ b/book/getting-started/install.md @@ -6,7 +6,7 @@ build the toolchain and CLI from source. ## Requirements - [Rust (Nightly)](https://www.rust-lang.org/tools/install) -- [Go 1.22](https://go.dev/doc/install) +- [Go >1.22.1](https://go.dev/doc/install) ## Option 1: Prebuilt Binaries (Recommended) diff --git a/book/verifying-proofs/solidity-and-evm.md b/book/verifying-proofs/solidity-and-evm.md index 0d6375c591..978248c5e4 100644 --- a/book/verifying-proofs/solidity-and-evm.md +++ b/book/verifying-proofs/solidity-and-evm.md @@ -9,6 +9,11 @@ By default, the proofs generated by SP1 are not verifiable onchain, as they are **Due to the fact that Groth16 proofs require a trusted setup, the Groth16 prover is only guaranteed to work on official releases of SP1 (i.e., `v.1.0.0-testnet`).** +To use Groth16 proving & verification locally, enable the `groth16` feature flag in the sp1-sdk and ensure that Go >1.22.1 is installed. +```toml +sp1-sdk = { features = ["groth16"] } +``` + ### Example diff --git a/examples/Cargo.lock b/examples/Cargo.lock index c6684b3326..2eecb2005b 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -4614,6 +4614,7 @@ version = "0.1.0" dependencies = [ "bindgen", "cc", + "cfg-if", "crossbeam", "log", "num-bigint 0.4.5", diff --git a/examples/aggregation/script/Cargo.toml b/examples/aggregation/script/Cargo.toml index edd7eddec0..2503e3e380 100644 --- a/examples/aggregation/script/Cargo.toml +++ b/examples/aggregation/script/Cargo.toml @@ -6,8 +6,8 @@ default-run = "sp1-aggregation-example-script" [dependencies] hex = "0.4.3" -sp1-sdk = { path = "../../../sdk" } +sp1-sdk = { path = "../../../sdk", features = ["groth16"] } tracing = "0.1.40" [build-dependencies] -sp1-helper = { path = "../../../helper" } \ No newline at end of file +sp1-helper = { path = "../../../helper" } diff --git a/examples/fibonacci/program/elf/riscv32im-succinct-zkvm-elf b/examples/fibonacci/program/elf/riscv32im-succinct-zkvm-elf index 10b446cae33f413cf491b66cbe04b8bc2b8f26c6..8d210ea746f1f06942b6801c1f789b06d3a093be 100755 GIT binary patch delta 46389 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 delta 45927 zcmbtd31C#k`G2#?h6Fh_1i~rVBoH~nyAMDON)V4CA|jr!`*xS0907vjQ8x%dKveL7 z1Bwa?mbSD-fua>Fs6n)-sMz9P>QNEVqC$(-wrKvpdHde(X0w}3+ttn6-^@4PT;F^% z^UXJp9iO#Z|5>}0ezJR2>7xEyB#vX>Tn--}#}PdAPK47dOYQFf;Nz=a8%EAN{m+7Y zPxWuD+=8+R)z9qu*3Vf>8n?1%(LD{@EpHVm%3H|MZ5;P`ebs<@K5ma4x1{lRRzogF z58C0&S@@#K7A5wByfmietTcR=KkCC5QVf;EvQ)?VNULEXvzJ z+)6lwzB(4S*(&MKn<&Zh&4 zoytg__3us>60dcB=R4Z(d`Dvf(XR1b>y^$GU8;{+OTKL~i@lttlyXI0@87I5ormT; z(Rj=n;u|xl@ry+j4PQvd_HkyXJYSKw;ftJ$z3qy;T&|SYf0SAGiYJz=;R|cMuhN6Z z0bh_k_(Gr)*3`moIk{_2S_e(P&(7EDJ;jY z+Q~b1)WPm=b4)g_%PA$?H(V9_-Beyth)!F`m6xsJG`Wu@A2}j-s5JMJWs3?)hF%Tmw5kS zdAE6-5^rUtEXwtARzt%V+mH0RFt_0Q7+J%=tN|s1g?}?-Evf#|4!x(ki6t(|BhDD8 zZ)6OZP-~1XubQ(KmpsMVXo&yv!k9=d@fO4qH*~aC_(c}E$A5vRzQ^|5(!JHg?pgVG zQ9IgQ8gq=(ZY}ypQ9JFg+xH#gSa0}dgkQrJZ2r4 zHhhrx^P+CuIJ1wptJUy|U5BE)>aIoJQMs`O-qW9n4m8Z?R#nZ}cCx88*LoU@t=%a)@+!KayvM<#`{spY5ujv`$PPK572* zyFh9!@$O;IqI{4veFtedvvd!DS2?;#VEmb)9kBBlXYfxnFksAYm3=K zuZ^dErnY73s*mESeRC?UikUuZ+#DZEICYMle!-l0`oGQL+gJN+*<8}l&l)oKCQn0u zYwg?{nTUQrx6yw(M{x@c>*Hi9ai8Cnx>4SKwW_3W)T7B_ral*if%>dKqPbuVYrl{Gjs^uF_AGqm7|4LGiN7Y6#GM)drF+bTTX?bhkr z%Gx)cA4^!aJddm7KPzQ4UvY`Bnh3rkmC#-8IjMr(QYU0^@+mc+`JzwbO7=T}^4O}^t2PyHfK~0=EdG5)#mO@q>324{A6!*7qc)p}p0Y zAakdU_RNV>=T(ohs_rWGfZ61`hI<;XuvXty;i;Zz?Y`@wo0iNg>eio=@}A;yD)P8p ztiVh5{Zwjrid$6S^hX2w1M5HZhksYY%EzsSHQmcAc5=HKp}`xfUoG#4-}8(9VKpd! zEic3G{?O(P{U??CcXIaZkq0f9m$%H?9i8CuF5T{{|Ip*{ZrgtH?srIk@3tZ@vdl$g z^Drz{GEKxCD(6<)QU{@>};jFqdyU=^zjHq_t;xSF3jE!=Cz8c1YD4OJ6o_(9e#Qdrm<& zU^@5SbIg3OT_Yrc-?8dox?f zhDC497=78j6Fd!Dtqu29vf>`R7i#oZR{jdn)A;M{BUc1Ho+VFP8}9Gr$=kMl_x)cJ z)>2znR(R@rTZdL&TUOPXwXVA!iml?jpC#5mRo7eNSM}|ZMlaT{>Q(IhteLvVu~*lV ztZl2xit9UCSo9P@)0)e@d3LK-BkSX<1`YHcU-VS`HGZL!X(wSMpMzGd;ND|$7&ZOfHCTkPp%%asb9RI%i9t9JEJ z>$TN=JLcP)opQS-xz_&GXvgE$nbnZFcPxF)PjjByd>pe=SL?uBnhPnNgd z6PtwUzhi87eVenxYPf2#JwmTKc|S(w5PO7vtMtRD>}-$Fou?4qxW}6O(3fIWo@QVf zRGl`UTdZbz{1)Ig*3ohk}fe&$EU++_$m?ms*=kV`_N)EVI40 zgXLS>&ARVlVNh!Ho|^QTS532yKOA9;6W_XF17BU#e=kbD&{;889bye&OO?H{;RyBF z)9h;Nu`&KJ^o=I(l9)tK^>8LLgT6%Tekc7XNUs7M$uYOJ7m$Qmez- z^IEpcm<$<@Mh^MbiHCbytJY4+y|T!=4BD^TgX=o6N{@eJob}_Q`JO6F8L=8AFR^0% zz`KmC-1Xzwn47r1vISLrgT34z zVqVzm!9dPo>N%!|8b7eMJz8nq^cdf(zPweEzc7;jYn9~M$H#hN47b1Y_;1L6ysOx@ zafT1Y`?0*T&{c~^**Lzy`$_Y0+;G&MKkc;{H;f6ATO%v40SaeZY<@l+?0SA7en-CL{;KfB#iJ%4+j zEibkAyjNp={7hLvV-5C@*ka^aAN}rZ>tufJ_95G`pzA-~nz*CPqfECJ?6}c$)pYCd zj`NDEV>XH$yCQ4sVmHh$*gjp6WJZn3-@Fk7C*#YRy5JFJFw*S2eHZ*_gH%+pw~ zU4QN!;sI%g=dm;CU@d+AZck%JYwEr-t8(|9o_(FHt-E`9mUguE@4nGf-Nzd6!X%H^ zXVt%Ot*4>HI`TrqXs%wy>(|{8ooO#hwPg)o;%@R*bqm zXs=T1**&kb$Kt&Yd0zg;>hscXJ+FRa9eQaTd-Qu53*=I3^2^ITc@@^tmr?u*Yw9br zJYy=YgRiK4z5Ok3?a(5&z~Jn)cVWExdES0jzecgszU!D-MzfbT`>wM>jpICx*I7Fn zD|J&kW|uiJlthdrNty*=rx)PT}wKIHW*+PsY9Y`&N* zdaBW0AXyFbArXJL#Z#SUO+HZOxvIvx^T6=p&5#d2lMiIErya`zi|88bz=3g$qR$(% zm>{iqqteq@W9@$97CQs3qq(}hXHoyyf3 z{gFxEk++!iJ$Udzk5Xf;J~-S{J>5EZ5aOF>UG{c`XLF5J_ja&Lcsi5bXRr@{+V9{9czQwWNyj9yby>F1>tLBC0&Kq`9 z-L(1BgMoR&Mu+F!TsOPcy7%K!?~yP4oN9Iapq!|d@WDB~#{SjM^?{^y$9GsP-Q4-J zW`*Ytvlf0(Syqea5s110E98E7UJT2}>GpoxAe#$3qriISgEG(l0_!_G*0#5L9nnaE zHQ~rOvcTGSAU{mKs;6~~p~dmg?{VOmrINvt3K z-0qyipl5U?S?Py*2Yl`4F0iinaA3#O8uqcC`LH-2EY^Xf%6j9&%UdaGN2jRVux}Xg zRUb*-*suFOy2$zU{zqFfF<`B~;UsJQr$7FC&mE`y9Lsk%o}KV~9ZwIQ2do!9xw_ya z&^Vyu*4cl#x8OKZvCjtU>A#F1N3E~^qIvy)_j5z7IiL2hMtxddFd0Yz#Q|&PryAK{ zZT|FXvfldP(-CB>WgOKC>Q4K)a}Yn)y6x!sWQXc)>Kck-LY82vfWIZ0+!2rIs_(t(vh3^yi{u>9(=FG)5LcczPI7K65sXsZozje;(zy@U*z@!9K!cg ze80n&{KL<6z_%y9{qP-#@4;w77Q)E ze%YH`W+`7zAvM;TFE8!8@&P|L^*%qx8ulQ*9YDoKN)5v6S6DxOIjDH_zhiygV!ZXS zrvJ6rdp)Ahw;KNXfX8>nDn1b`xZ#YS)4-z2T6jV#*b3AQXs`9ciSBXqvGwN@B_8ev z>&Fu}k{hiXzPgYswKjfrsrQv1(DGLJYpL6iAN^b*68i9DL%tO9=Cw|JHKJqa2|sY` zc%{ZNzAovq0W>`kG8-o@BA)yLYund-x^Uc^i0F-g>G*cX*ZT15{hp(ntq;E`vkrW- zqwr3y)Q(rsI=v8or?u*2QUBctWgqqg$M|!&pW_ZYafhwfPWJA33W$w|lP6;RS^@#{ z0XJDcoV>a8Qc}vD1vClI3OqMKRM;rG6Brr_RLf446uMMf5n61AK6k2|9I^g<>Y^?^ zJf++KgpJ3SJ$rbztAAUbQ*Z#vnB}|MdhOfZ1>0Ds1D&wG`c^6&=9Hl~rd(EM(GtEZ z>gk5gc48+YmWhOD-SFMbJ+}d&xwx0`WGd}^hw3HklkWz%&utegS+90h@juE2>VT}V zWPDlmuAhGg=Y|D=%kizOy=GS zOx)OqwObXwxhY{25q5e)Qxg*c_F>N&e9s_kE!|i^x_g%b)>)tYP(pTF+#47!< zoNTqKe>|t#hDl9L`G{v9KfajmxYgFeAIk^%u5M~#^3Fai^Qnl*N0>|917URtJ2T08 z^T%Eg&@X;G2Y(BjO2`&VXeuc^J*BB>1_-#(ovOw!BuhQZavo&0VI}MVajmlEfOe|2 zs;N6!YyG^b_t|x3Q&T-+k-|TgrC^l!vLA=7Pnvp@0oD&q<>az8rKJ17ZPS_;@HD8l zAk1wER_J^zOSi2FkfL++B1jr9&}=U^F}=hE=Lg7kL7@mAKzSz8m*n?43_O5w8k=ZRxgBQd+v)weq%WCFf0awh$yoY!E@W-xoy{3< z0_9qSp@r>F5Bz-=VM}SD7Zv2`P%r7;bNo-6n#Qttr!uTlaxs4D=?z}AhN<8H{kR_$J1P{?HB;9=W2aX?;rcAw=(?L-R@ZZlmu@6pJ+} zn+s%mO+KV_{R0VMVk1RH)FyggJ~@XRqC4}+Fz=z&;7wOSZt0nPl267{Zvi={o4&TG ziB*w(*z>r}b5sE-I=c!{6IpoDxE=u515&hr&M6>+p(P$IK-V3hFR;fB`sV`DyW7c! z6GAcs^gBTBqaE9mVcpI=*3`u0jD7t0e$NDwUeTVE4_vvSc|rJ&XflMkYG@=~YsERi|q9@Wf5IuDK#-^qks9BV~mPNCwZ9?>hO^LGk5%w&?_Rzw!Ncqsk zPoZyOa&Jo;OL7{~9kwJ?APdXKGN1zuoCUqwFDZ(Zk4F>>tBtX-Wr8Ici|{+?MkExnzlN?tlvl^kXW35-+MUgd#CX;qdNSP$o@5jK z1PQ7)J%{c~X{8;Y%6-16Da68)J{=zO+ota1aDLk`nwI_?4st6%bXuJvIhT2D5{Jd*0yQBPUyT!_L1Mm^IKEVIJ*0D~|j$O%hg(ncj<}OyXuaNUv zdRtfY?Mb>0k7({UPC*fSO$T%eu-kr%fa`$=IH`XHyd^3APr%P6rT27%uqDM01wNgG zCj;B|4~O5IS96tIZm&eIzlWNfPO8b`>p0Gjczf8P=IwTcyAg>*bFnvaN77q2pf^eq zl5*aSP_4jB&9K($HwCU~&R&YORs?uu65axQI0=6VY+GGeAwfT6YIFXtcII|r?RWQt;sv{9O{J2YZp+QC->oKB)v^3Lc+=XQklfv|DeC#@DFA9tHHO-eee= zL>t)Sb-I&12GP&hV=3*{2ahINjYr3NY~}}q{kAc~Lj!%VYs{riF;e%6PScq=g`j?;p(N$={(_&MxUVxC+CJObFAuzn3Z8rU8B?*p&62^jMYn-B+| z4IN6SpG^k$pM;+WLFz|-Ovfw)u7SHPv=zQy?k~Vq^trRiFS~W@iwPa1wq^vW4m_6L z)|U+KX5#1MzxnNbBI9yDa4mhVFS*qF9Ddf*f)X;g`Y3*`1eMRpt8)p*9ZJH(fqVQt z)+&rk82DfkUI~mT4y+2F$Iq3Ba#Js$DkU_e2V(owW$SmO|FdNBfzfdmEnEB z2T-M0Z9N=*a;`C!#rG+NIzb5qF2?U7;G@8zgXaRX>&Mv%JOcOtYT?rV9sJx6(^{R&u+l(xVM0bF z=sSMWrPN;od!5^b9xpc^*tZ~|QzuYwDS4}U7LxkDO$gCC;LzzrlfDAH9yrF@!+it1 zDJi~JIa{3cEF+gjtMOC+ho9SImjbm0K9YpT^@F4!sXgbRRc-@zZPculHUaNI{7@(T zTfnD*-ERCB@OTup(24KgpR-NWontu4jYmK&2%G@!4q#@x?&2hP3YgikT?TIhGn+OW zWvl>afSG;U9YE()#Qdw>X=(y6vw34}VblK7ASme*w&l>P&;N0>1~$4D2?)C<546XV!MN z#DjsE)!nVpBw%KNcjFfVGi$tyw*oWEe0L{JH88X8yIu4?FthX*IT_{-;%uwGTcBaU>;%BY*8;QC0JlXOfZ53a z;-hwxY(oG$Ch$58KLBP&25y3@=b*%Q__;l3EH>0u0@vK-=RO8K!&lUCTpx5v50)NF zhmU}VVAu?C;wR3>&<4(RaQjBQxRN_C%9G-!0uKSsv-w}?;Wi>bOk!B} zQ%pl>QCkF%feAb|>gRMMU@d-r6qXId+aiJZdf?<1ewXg7AQzIA^q&=E3aO{poI`F7 z?7s;kDT&GMxzHWJOjj_bUjf$x%MKn?k4XgB?Y4yro8!+@@I=~w0Qt?NKcd@f|Ctb9 zG89|9?-SZ_2=E!;d}PDK|7ze|(A$j*d^hmuBn&dHei0o$ko2Wv2NFKI1&Mn)i4TL= zJ-}kjaw^d?NQ_{cIXet+kFr>NhY0L<4GGcxt`-{u(Dz{UXvh+@!GXK|93e__Iom(!pd^ z;Z!7Yd-H=~9QNbJ5QyD=x^4(|(T5SsT8A~iDqx_|*AN`I48g7rUxDBn;K>eI=}b(h z%U}gS(OB(kXQ4IjO*Hb+22=($MV(L+FL%v75E-OrA6B!XrNH#!p(N_*@o)P2P|_E> zL;B@V@{6c651ZN*2_b(GnESV%rL>bq?u7LU*e)?xO+){(lggEdXGQq{n4MbcPSHAH zcM#oO&vE{hNbkfCT8ye8{eW2dV(u{n)T00&I}G0jUP}iK!zy?@y?7WI(QSVO zGP)|kasX;SgRUEfCf!Q^$p{zFo;(>=cJNGM)O;bKGm~&v87smc=uJEs7j+LpSr6QV z@V%hxgzOn!1N<>?M+ff#=6-Mn1mZ_cMEO@I+UsHn)eaQy6{q+=LTGlOy~eQgXs=N> z?nUb%KbQZQd#?n;qyj7hfqSsbO8f_4`y|=Pu;U7j^MSs^!Q+9efX{ZY z1$+Z75V0rOO$`yau>+o(**C^!WD3JYOi+}c`&l7$d zvkC_^j;s1H(KPo0j|H}ym-BEtfnBcvHfn^GkP*bQ59^M(4({XNk3jE!Sbk?Ti~{C7 zU`wgfFRn8IE5Jk@!wm6^0o!M?55ut!;dUW@GBP|10jvP*vp6Z9;Y}&{OcMS?k75-I z27^J!7<4e8*MQv`YQVdbFk?96Nk4nwL%1N~U0(;5{yt#$!)o}86#Qxm=IDDGiH_Qi zhB||6_A{nvxYNKV+-!kYufqHb%xcKu0|iL=1iK_0UxG4N8+gDW&Ausjge&VRbS)h3AbpdTF;T_65><^cr-8v>}L<) z*}&feyMp&HupihJ%tqkF^f}}bJ&B*p>BSZX{Ox@%$GL7VjMW(6CdAtX2A%`#y0ozP z^}wzJ48yMiyACi6{|(r6ePQ_Q^H3`krFX2TUAVCba6e4Q!!&#@8CHBZg7e`X!<08m z_bcG89{P)ONv}fXVc3RWOens?^u2S*l+wSU0}t)>a~n`r)9#(`)}1E0oNwn~|6vsvmVz&9 zj%m*Mq?Amj{m;h{b)Po*V1c7 zLHM4-&!hA<_VXxyo~G;YGurtA%%E`iaph__u1UW{?QF*e6A5qJdn zJ}~sKc=X+$fmZ+%2bVwxJeY(7z*Z7|5_nAc6YIvSAq)@22|V07;3^cr zRXSe-FG9Rq0RB;qy9YSODZpIdhNSo%z{`{Hcfj>7eH1m&AH$rIL~uLs1Hf*Lz6D;L zgr7$XxgRE-$DkFXC!IM7{03OiifBQ%KsNzTbh{Yw(=n)O9Bi;A)E-9@BcPX4gTpBq zd<%Rh;$68d8EvnCE+m%<7vtvwMA?mjzXzcV<#%CDL;&lpd5CvEtgI_(cr+>L|0~7; z$z1Jq82AvdD}_1L_Q)7bMno&|)AdMW@^KpqyW>w-;h=d~4*P-MXwSnWx z&MM_f5YO;9;87h)xnT}o1$-J=O-8X;{2}1W@=NWNIm6vIVzd>MaxcZ`quezpfcs%p zSe$}?lY;**1$)^V-}$igdh`5@UrF^j7-7PQt*Q* z_=OaFJOvm1q&ffdT#Wqf8c%lv9K0HMaR=-cFwna|RjmWQtf!xQ7V!*k1kUdgQ`-zb z4a_Cs-N1(m{kE}_#qR_5CB+{EeirdjrV<#zCkWV&fDR7+JMc)KA1jksJQ;_b&RoB( z2N?Z%z-vnq_(|Xme!uOA%Hk(njs@5Av7Hjb4ZvsKPQ z#xkq{-tltGJu&yh{62Ni@{F#y0{V4g0w*xv>&H2<$^g`%r*F zbo7V_njC_HXj^dZ29{U(xv5S8hfRZ|uJ&`INi6;EXTg>RK!sUr%VOhp{po4-1Ye7q&@NRrm03GQIO)u-Y4)kAAcn&^XWn$5HZD&pn$Cq z(COV*lA%5^91fUfFkl% z>AWb(yOvKRKYDzUA_pQNB_wJg0WG7&iu%&kWYR!cuB*LWQx#!>VuZu9gWSAYVan|{ z-!ijO3`Gnfq8b5FHWWTUM@=S1NYKq-Pz)MMKnduPaG;v2yeu$l_N+<;ZO_X=IV?m> zDQE~mGZf)LfYM0;O*bk9rLCm&!^!0QB2AWggXdLQ(jx&=6{;(F`pIPYo=?4o^oZ)F zpvk5g3F_!--4NPd4pD4tIVwdt6KS+X^+X{PZA(%qV7c-|NVQQT&bs zO^H_}H6#TCO1z1)C9jP4bXH0&bCIIW%T%dnCQYF<+Ds|%nMqUg7vde9wN^r0#IlmA z+>GhLnU%U^n1X6Rzl3=`C<~B-==@4v$QX-AzO_iPwMeP8NZE;uwk#4dRa#4$xiUzp zwU$zE85woj0ZEOPvGGWBVWt+uNNTMC(MzqQl%lQ0x{Z{sjiBh}24;n(m^A_XUnyv& zt_r-UX_6rF2J2c>$sVb-bHnEBnYGhrgy&TTpvVk9tU|9VDlf`IqcK(BsMm-TR6-J_ zuMi(n)Q}Myu@N1UKqMfUVWwW0=5CcG<0!U`OyVwT6FWI8JGx;C=^kxSJysT#3r?S9 z&JKkuWgZh*#4rM3OyHq_;xy8%`7@^kr%#(ctFBTFi>f4Hn$-n46w>4v1t({N>gX#)_zBC(*N$M2)O87zx=L1LJ{_pgqIW!gDJ%osU2$gJDyG zM2R7%)o+FbR>~n!H_ebF2)q{2_^1|(6u5M;P9)!2q|{oZ*jl8F$Y{$VIhiW0B{f=! zL}O&G3zS2%$f(l}u}lTb;57lUQkNB3)p%J9ODd*HyNNJ+XNtlrD`uJDDQ0-aj7lud zq==$vSR!h?8khKaVN<9KVJZj&%?K}qu%_Zw@WpHZ#u*}QeUdQ_BR*ps>X9){=0cDW zGpIuKm{CKQu$mJhj{f44BU9ppR^r4~;-psMqRmQ^lA+Q{Lba7Rt(7>vd0ezv?TzM< z$#EEkNzK;0ppdxCajmor#BD<6gsrp;CIxf$ta)`)W={`Q8sU&GXxJ-60*c5hA$ob3 z6h~Fr6eL~cHPKWRN39B+Irp~Oy4kMM6w?v$&MY^3Zn!d{iGh$Q@Ytc~A&qwx$+U1C zn+a#ntPJyNC?JJ{MmP|W!eYeHH1p<1gLN~)nEX^lR791Rf)XDPc_%tB>$aNNw^m~N z72*{=D1=NgfaPc#Vg;_Xv|=K5MjF;qB05d1+-fXl;kr;Iv;l^SB&tCaSqnS$5oy(1 zq|z5LOhXG`_o(s)<~o74n??j*IH+oZtZ9l6&2+a2tC2NbH)KtY=pi8xj)*LJ3SB>)bn%7IB^n$&ZGOkSZHN z0jfwgBc|GR;cR>J2$@Nvsd6mDH}Z+5%ur{c?ah-gzoc-Dwp1Qs+e;v|eMCv|O@Ffz zOiHJ|q_zvGq^F%x=tXmg5rx^&P$fMmVNMlAMS=k+vTvoD?Mk^EQHydqbLiuGUjSs`t zNu%gwIWB^&(=yUFvSp<4q177Ks4Zr4d~~-)Ym+K%ZrVzv4FVZ;1YL;_+3Y1~n?$nV zqr_*cOkAV!p{BIG7nHX5f|8{dqDg~YX?riIZSMu#GH})m>DnOLOx>t$?*+B(DnxCi z!=fn)PtDq6@eWhl-V18RUWm3(xoX>cL2G+2Xc>ATnnvksZSMuG?Y*F-ZCR|G(v_g? zV?k?sFKB6c0jBNrC1`su=xy%>y+toXGfusF+j~K8doSp)(k8D9nr}~4u*WgD0A>}=z5o1HW+HO)z*tPxU65SNVRwCPCWqbw__n6`(`c5EbC+U}!o{FGc$ z5jNz2AcuK5EQOVbZl)IzdhT6BX=!A+`z|td8cy9Kp^&LdB2LqVVB$zKY?@$;!T=#U@AC}S0e%p7%B`YbYqmviH2};E5m{U zyMd{MRIJ;b*)l8h#D*k0XP0>5T5mPfu%`922G_Soh%DAi<)khk58NN#sQ(EQC!%5a9J7R)TcOwc{jY zs|04um~F~qFTea!SlgJ@4n}{dov?Gnwfuos7i#Jzi|M&_qlV=VH99=tcxK6+RqLHN#X* zQx=SHr4nz9R!PsdX>l-pD!a@CK4Gxzi6DVDV24jny$*TG!~# zq`5Kz2NKPc6jcc8u-Uuzep}SjN5UZQq>QFX3X6MYzVX(_2?aY76L~Wn4u?!0y@|?W zCeYXsrWU|?vZF>@qx^|Y8XpU-k=m3>Yh_dDJxj<%KKMFGa!3usg9`Q-GeAFFLavO; zN*Jbm!=!735_(iMBtwFvC^$fZD@8yL!Ko|&3Y>e1 z@Ty~;B2I;~lg8U7l{DIdt(d+JvD!?D@r%s z&zAlsbGnHHBDxHRVk5Eihb<7n;NC=A*Tr_~EKXw5I{2(+j z0-wo%4qaKPv#REkM!w$NQRwF%QRm;l#bKG>oRhZWt&rmeE3#lWu>*WN~=ww&{GeQ zu9>psGgNOc%~%mdwbNv1d4*oFK4W%jEV~RzRlCzNlvIs%M21)`#yC@KtZ_4BtJx)P z*~3+tn?TDX6(`aE8M4tch-B}FGq$uI>-LsKo4Gcf@T~`@44E6PHLVeAo|f61{YWbe zYcorg5o@0GWf6E=Ad6GSW=yft4eLm^mL+*CV@bd+v%m>_Yf=NR;Z}x~Ahb5D5Se*c z2|{b*RS;qWsAVln)@Kq0*i|wN)D5kqQRutt$&WrbLi4y;CJRB>FG6B~e)1@J+!w*U zAs96b5r$P*N)5X5F;eb>4Il)cKSAXcBVdL?^ySB3C|7XF3-&oZq{3ti8z|*BlCeHr zlVnqd{VpKE^v|nwzy{d#%pi96GF+!cJt#)_5M8>FT;+qur7S8zJz(;skiI^6+Q2a~fZYh}24+NIQ6gK|{3)3};()^x;OJt)&Os+VN$!qjznG`RoMq4@ z0)#;44MoPKJ080a<_X)TyM1~_7SXoy5c!Ne+R8!@TC&J@t3p5AM5+hloeiDW0}-6iLS7WppogBq4c8D4ziLGd-~<)?a6yz^WxdX1#;ssb#!?YiO?jM_ zwXrXamW}APAv@Gil_@l^5C7oOZ+}LF?ic|P++1SUO>yvnlNL}IxhvIr?V9i?!U4KiDR81i5k3I>|z=?iZg=>PE@2YuJ0le_Ep#b6x^TX zMIG0wVx>&S07a15!di;VtTX6WTS$*9!q7qN3Kh>YtGOC-8YAoVJSP`6u9+7Zl$H)X z0#iKgbO3!a>*u7%2cuso2oGg;Rwd$OhpzfL8SE2rhgUUl@)y*lU_=Vg13xDNeX=gX za2E~=q8K#8n0&pzAOj|dau~uQM`S~U|GemyE^8ZPZbVxD3!?c<9`4{O&xeB{0hd$^ zTQCNMBXB>#g&#r2O<*WiN1|KQkq-PNnb;ZHEG#MT^=21V_%L1ZOL&?GgS?=Fi6&|$ z4lqS}0-=RC#DfQT7%w%mSM8VK+~9qcgCDIZzV%~ zVMP`-Tqu@JT@R>OK|s;=FVqa&l*FARJ`mC%4j3J5Tn{pEgcbq zs=)q(gu*t=8yfv+37Igyg>612PHE_wM90M`?luqmO%PieQGtFy{|a=#uZa{5;cNnz z6>z-*GofJMM8+28te5vhC3E&|6fTeHYS2a&juQXxIrJ8tsU!^x`=A6OgYHnm zVP1eL)TLIs$!>O$4%J1cY5bG(!FySmO~||Nw{VOd$}5q>DWt+OrJGR3ZrJ&z^Ni8c*!1K7sR4)p#W+= z3=J5Dl8c1d7`uSJ@eJwQ83)!ni1AheS-`so=wF{9Kk*p>EWixBdB6x^AmR)Pp%>8y zwv#+87j#SkIPg?(Os#4%UG*ZaE)1GMIu)@+3nm|!T@>6r!QBo+jK!YVPV#-w9%>jj zdSGk7YXh*-WeK}Wb#re+IzG&FO9<;W33^V3-b;$ac{chvh#RxD_^VFQzA04qBME*t?d!a@ho(w%r| z0$%KZcR1jhh=#$4o~EnzlAgs-{U~BMfGakbLNVIa04C#D)sE~Wo#>N0F`e>iB!br~ zL?VKM&e7;L5Th z=o%&p2pbMvv7pj5oi6w-sqo>lE^oraA%KfJCj6@CuYXIb1}lPw^FdYyBaGuz(Oq9? zqN*FXoGB^-PJ8ek1l-(t`(-kizIhl{2ThHbhAawLWk@h+25EQ~88if|f>2oDB{-Gf zE{_Jy?#vJd-jD#v!}O})B^Vfk*kF&FLk12(HB=+0sk&(379#vD0wGs(wn##|JWGc8 zpz{q8_sB4*z(qzD=@l$gL1iVlK?HPD$NM)zbmg<~tpGz)!7Ct`dwB$R%-p)cS6zgl zVfN8sz{1q;E;J)J8N`)ltgdCnfU>~CT*gWtLsKzTT~#Yx1p`l!7R}@6+60SedLHgN zvn?#rb8yvlmQu7{6L*=FrWiE$ccda33aY9EX@dTNnus`aNmg$NL5|HO5SmxT^01q3*>em)?(NLz>m@h;)VroBO-KGcL}#Yph_MWQ>oOOe{xHH!T9E9v!QM#1sPUs)k|G zK+Yl$UoU!Q4;H{!!i$)Z(2v-=z-yLXzZctb5qmi}9)u7giNHdZh$14HGhqEXbDKskB=utLL0MQUtguvT|a#3vUStS~h9k znGjYrMaD`7j*+-QENc$;bWZ-weEda6+oidXgGp^9S`I!AGL{TNBmgHTgP#2g`N=>5 zFP}lhLzup>{x{v7N*X3>ULiF(;aQ=F8cA2}wpk|Ia5$Teh>6KV48jVM2c;q3(MYNWiV?g6O5w4U!WI@zgwBXdLte6v+%&L-XJSU~aFy2R!DGZ1 z#hM1@BUpUcf)sblGG-C$>Fj-xDNnZKW-g23^w~;y?%dgPb#Y3+%jjLNl1WkK!Gr>Y z!iE%pvl%>VY_ZCknKKKtY>zgkclIQh%2RK0wUI$a!E0lB!5$dVba%uhZ;f|Rk(+t!Uy!BL|Bbw3DfgPQhAUR&zGZmhWroBzHD|AQ>VZbl0Kt2hge zJh!X^z4#BLY!Eg?xPt&UKul6_Q!|{g4s$uCE^H8GES7N-Ud9dIk6_oLTmL{hPten zIHYgAK|_<{a$1Q|RBg1}Q#K6?|MPw#l_ZAsC z7@p-u1Xnb4>>Y6It~%swCy6bcfnBm-V0&uFI6^!577jGsC*@dW(-vpq+vI}5I9-7S19@s#;06NjwmNNsJ#Ujsu!zNb zGlF>EBAlT`9Nc8ifz})%fheZ7q~!sQfUu2)4cCNMrNFy4htn+{UTVawiwZ{RH=Y6z=uUBYo4Htu0FVvh%Ot{#9Ngb6zZ zyi4(_4z@5YGz31VVOh$oJu=pX)pYtHGHWp0^dv|@7#9AZhIfUyZJ(y@l)Q)6Uj}q6 z>VvRY;QRt>37Bu~ZBfm8q+=9*+<3_gvyMdYHl=XTVTLmU3{7Tf)pXbyup)&^HanKe zZY^-;oGklv$KZf1RXU4VNoF`estLX!PtUZT45ZDz<)FZgRbOm z$+MbD;v=!^DSSezyGtUO$2jeAo!W(H^D;yoL$;V1qUt zArr2Ii53x9Ghm{D`yCEBV@sVdj>PbaR2&2aaYBjHVJtA7KyVoc1Z{I$GCFmj+QCfn5X30%-X;qn!ebQJNdMMMFtM8 zET!Rqk*D$4R!;0^(w9FZ7hQ>WGn*0Ig$eVL2&V(QQP^(X?8Y#snCXmLH-3a6jRSkA zN%S?Ad^j_5HD%TdKTaP=IFE*M!F@MaTvSz;1T|K&tPEnckK!$0893m)Si|f6aA^sa z8&fbfOsz6r9;GtRix5|YHYP7<8U8K5>>>(69y_QtL!y$%>N~cLo_W5cXn+Pi}W0v_DshCV@5Gz zV`erj`;?4;%^4=rh#r8W6BgAtUYq$T8H{&ihU7>PD|?)+i?Dk+^Dev|bo`I~kpgcb z4PFLLy;AQlwYa|Is-ui;+ss`%n(o$ue<$b2bjqj8`XQM=NG*iL8Z? z9hKG^2i&Y|?f!=BT0k<@BWriKb7O|?z|JBo3wJe}fkks!PcNvBa%w54M4;V|!CW1P zz(XD8@-U7HU>%U?4aZ37Ah=+#g*;9!nP(i{aOiAt3>`-y?24)Z(=zrAs!Hvhy&ei< zeHVZ~pn`L49O|=U6$rkF_xNMag0(0v#Y%Me=VY=E_q=6YiD0V=6~^Nr7onHZuRbT8 z@ge{e1u7g|f*2~gy`71|cLS;s{w&ND5hsSuq=U`4gw45xb+wFFS>osyMTKiY0M-|{ zi{VDCQ+eDRhNmBflOnQn0eBl4x}%!2v0yf&>+I#;f6pU6MWlEsJvmI6dI3L&uf??mw6om=PI%Y?ZM? zfvacYT~r4Af$*kVY#~uLrmWk_BCfhyaG)gz@s9=2FG=wroE(L)6^X#0gSU@H+>K?L zZ0$r*?eZ~WuB@JTC62EkY8viZvVQ;qZg=tH`7}w}T4Kk9n303V56^NDOwOzjX}c4c z2XG%&eJO2il-OTi2iN(zZ1fY;(vw54htdD~pUX zN!+&AN=sy$2V4tiD=b=X3E7#K(^Ug&1={5R=|abTO}a$Gcxy9!s8ty*bnt=H<6}FU zh&hYvbUCzG5~ZCcY~ykuLAKb#`xkTbOZ-|+C$pWxx)E~mHrjZ}E2 OUQW1c>Bhg2qW=fqmebV$ diff --git a/examples/fibonacci/script/Cargo.toml b/examples/fibonacci/script/Cargo.toml index 996d5d32cd..c8c19623f0 100644 --- a/examples/fibonacci/script/Cargo.toml +++ b/examples/fibonacci/script/Cargo.toml @@ -26,4 +26,4 @@ path = "bin/execute.rs" [[bin]] name = "fibonacci-script" -path = "src/main.rs" \ No newline at end of file +path = "src/main.rs" diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 9c2e8b03a2..09360aa84c 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -56,4 +56,7 @@ name = "e2e" path = "scripts/e2e.rs" [features] +default = ["groth16"] + neon = ["sp1-core/neon"] +groth16 = ["sp1-recursion-gnark-ffi/groth16"] diff --git a/recursion/gnark-ffi/Cargo.toml b/recursion/gnark-ffi/Cargo.toml index 0c2d5d6c2c..159574c25d 100644 --- a/recursion/gnark-ffi/Cargo.toml +++ b/recursion/gnark-ffi/Cargo.toml @@ -16,7 +16,14 @@ crossbeam = "0.8" subtle-encoding = "0.5.1" log = "0.4.21" num-bigint = "0.4.5" +cfg-if = "1.0" [build-dependencies] bindgen = "0.69.4" cc = "1.0" +cfg-if = "1.0" + +[features] +default = ["groth16"] + +groth16 = [] diff --git a/recursion/gnark-ffi/build.rs b/recursion/gnark-ffi/build.rs index 0d91e1b970..83cfd9a158 100644 --- a/recursion/gnark-ffi/build.rs +++ b/recursion/gnark-ffi/build.rs @@ -1,3 +1,4 @@ +use cfg_if::cfg_if; use std::env; use std::path::PathBuf; use std::process::Command; @@ -7,52 +8,56 @@ use bindgen::CargoCallbacks; /// Build the go library, generate Rust bindings for the exposed functions, and link the library. fn main() { - println!("cargo:rerun-if-changed=go"); - // Define the output directory - let out_dir = env::var("OUT_DIR").unwrap(); - let dest_path = PathBuf::from(&out_dir); - let lib_name = "sp1gnark"; - let dest = dest_path.join(format!("lib{}.a", lib_name)); - - println!("Building Go library at {}", dest.display()); - - // Run the go build command - let status = Command::new("go") - .current_dir("go") - .env("CGO_ENABLED", "1") - .args([ - "build", - "-o", - dest.to_str().unwrap(), - "-buildmode=c-archive", - ".", - ]) - .status() - .expect("Failed to build Go library"); - if !status.success() { - panic!("Go build failed"); + cfg_if! { + if #[cfg(feature = "groth16")] { + println!("cargo:rerun-if-changed=go"); + // Define the output directory + let out_dir = env::var("OUT_DIR").unwrap(); + let dest_path = PathBuf::from(&out_dir); + let lib_name = "sp1gnark"; + let dest = dest_path.join(format!("lib{}.a", lib_name)); + + println!("Building Go library at {}", dest.display()); + + // Run the go build command + let status = Command::new("go") + .current_dir("go") + .env("CGO_ENABLED", "1") + .args([ + "build", + "-o", + dest.to_str().unwrap(), + "-buildmode=c-archive", + ".", + ]) + .status() + .expect("Failed to build Go library"); + if !status.success() { + panic!("Go build failed"); + } + + // Copy go/babybear.h to OUT_DIR/babybear.h + let header_src = PathBuf::from("go/babybear.h"); + let header_dest = dest_path.join("babybear.h"); + std::fs::copy(header_src, header_dest).unwrap(); + + // Generate bindings using bindgen + let header_path = dest_path.join(format!("lib{}.h", lib_name)); + let bindings = bindgen::Builder::default() + .header(header_path.to_str().unwrap()) + .parse_callbacks(Box::new(CargoCallbacks::new())) + .generate() + .expect("Unable to generate bindings"); + + bindings + .write_to_file(dest_path.join("bindings.rs")) + .expect("Couldn't write bindings!"); + + println!("Go library built"); + + // Link the Go library + println!("cargo:rustc-link-search=native={}", dest_path.display()); + println!("cargo:rustc-link-lib=static={}", lib_name); + } } - - // Copy go/babybear.h to OUT_DIR/babybear.h - let header_src = PathBuf::from("go/babybear.h"); - let header_dest = dest_path.join("babybear.h"); - std::fs::copy(header_src, header_dest).unwrap(); - - // Generate bindings using bindgen - let header_path = dest_path.join(format!("lib{}.h", lib_name)); - let bindings = bindgen::Builder::default() - .header(header_path.to_str().unwrap()) - .parse_callbacks(Box::new(CargoCallbacks::new())) - .generate() - .expect("Unable to generate bindings"); - - bindings - .write_to_file(dest_path.join("bindings.rs")) - .expect("Couldn't write bindings!"); - - println!("Go library built"); - - // Link the Go library - println!("cargo:rustc-link-search=native={}", dest_path.display()); - println!("cargo:rustc-link-lib=static={}", lib_name); } diff --git a/recursion/gnark-ffi/src/ffi.rs b/recursion/gnark-ffi/src/ffi.rs index 9edc9d11a7..5223d79bf4 100644 --- a/recursion/gnark-ffi/src/ffi.rs +++ b/recursion/gnark-ffi/src/ffi.rs @@ -4,35 +4,50 @@ //! should not modify the strings. use crate::Groth16Proof; +use cfg_if::cfg_if; use std::ffi::{c_char, CString}; #[allow(warnings, clippy::all)] mod bind { + #[cfg(feature = "groth16")] include!(concat!(env!("OUT_DIR"), "/bindings.rs")); } use bind::*; pub fn prove_groth16(data_dir: &str, witness_path: &str) -> Groth16Proof { - let data_dir = CString::new(data_dir).expect("CString::new failed"); - let witness_path = CString::new(witness_path).expect("CString::new failed"); + cfg_if! { + if #[cfg(feature = "groth16")] { + let data_dir = CString::new(data_dir).expect("CString::new failed"); + let witness_path = CString::new(witness_path).expect("CString::new failed"); - let proof = unsafe { - let proof = bind::ProveGroth16( - data_dir.as_ptr() as *mut c_char, - witness_path.as_ptr() as *mut c_char, - ); - // Safety: The pointer is returned from the go code and is guaranteed to be valid. - *proof - }; + let proof = unsafe { + let proof = bind::ProveGroth16( + data_dir.as_ptr() as *mut c_char, + witness_path.as_ptr() as *mut c_char, + ); + // Safety: The pointer is returned from the go code and is guaranteed to be valid. + *proof + }; - proof.into_rust() + proof.into_rust() + } else { + panic!("groth16 feature not enabled"); + } + } } pub fn build_groth16(data_dir: &str) { - let data_dir = CString::new(data_dir).expect("CString::new failed"); + cfg_if! { + if #[cfg(feature = "groth16")] { + let data_dir = CString::new(data_dir).expect("CString::new failed"); - unsafe { - bind::BuildGroth16(data_dir.as_ptr() as *mut c_char); + unsafe { + bind::BuildGroth16(data_dir.as_ptr() as *mut c_char); + } + } else { + panic!("groth16 feature not enabled"); + + } } } @@ -42,41 +57,53 @@ pub fn verify_groth16( vkey_hash: &str, committed_values_digest: &str, ) -> Result<(), String> { - let data_dir = CString::new(data_dir).expect("CString::new failed"); - let proof = CString::new(proof).expect("CString::new failed"); - let vkey_hash = CString::new(vkey_hash).expect("CString::new failed"); - let committed_values_digest = - CString::new(committed_values_digest).expect("CString::new failed"); + cfg_if! { + if #[cfg(feature = "groth16")] { + let data_dir = CString::new(data_dir).expect("CString::new failed"); + let proof = CString::new(proof).expect("CString::new failed"); + let vkey_hash = CString::new(vkey_hash).expect("CString::new failed"); + let committed_values_digest = + CString::new(committed_values_digest).expect("CString::new failed"); - let err_ptr = unsafe { - bind::VerifyGroth16( - data_dir.as_ptr() as *mut c_char, - proof.as_ptr() as *mut c_char, - vkey_hash.as_ptr() as *mut c_char, - committed_values_digest.as_ptr() as *mut c_char, - ) - }; - if err_ptr.is_null() { - Ok(()) - } else { - // Safety: The error message is returned from the go code and is guaranteed to be valid. - let err = unsafe { CString::from_raw(err_ptr) }; - Err(err.into_string().unwrap()) + let err_ptr = unsafe { + bind::VerifyGroth16( + data_dir.as_ptr() as *mut c_char, + proof.as_ptr() as *mut c_char, + vkey_hash.as_ptr() as *mut c_char, + committed_values_digest.as_ptr() as *mut c_char, + ) + }; + if err_ptr.is_null() { + Ok(()) + } else { + // Safety: The error message is returned from the go code and is guaranteed to be valid. + let err = unsafe { CString::from_raw(err_ptr) }; + Err(err.into_string().unwrap()) + } + } else { + panic!("groth16 feature not enabled"); + } } } pub fn test_groth16(witness_json: &str, constraints_json: &str) { - unsafe { - let witness_json = CString::new(witness_json).expect("CString::new failed"); - let build_dir = CString::new(constraints_json).expect("CString::new failed"); - let err_ptr = bind::TestGroth16( - witness_json.as_ptr() as *mut c_char, - build_dir.as_ptr() as *mut c_char, - ); - if !err_ptr.is_null() { - // Safety: The error message is returned from the go code and is guaranteed to be valid. - let err = CString::from_raw(err_ptr); - panic!("TestGroth16 failed: {}", err.into_string().unwrap()); + cfg_if! { + if #[cfg(feature = "groth16")] { + unsafe { + let witness_json = CString::new(witness_json).expect("CString::new failed"); + let build_dir = CString::new(constraints_json).expect("CString::new failed"); + let err_ptr = bind::TestGroth16( + witness_json.as_ptr() as *mut c_char, + build_dir.as_ptr() as *mut c_char, + ); + if !err_ptr.is_null() { + // Safety: The error message is returned from the go code and is guaranteed to be valid. + let err = CString::from_raw(err_ptr); + panic!("TestGroth16 failed: {}", err.into_string().unwrap()); + } + } + } else { + panic!("groth16 feature not enabled"); } } } @@ -94,6 +121,7 @@ unsafe fn c_char_ptr_to_string(input: *mut c_char) -> String { } } +#[cfg(feature = "groth16")] impl C_Groth16Proof { /// Converts a C Groth16Proof into a Rust Groth16Proof, freeing the C strings. fn into_rust(self) -> Groth16Proof { diff --git a/recursion/gnark-ffi/src/groth16.rs b/recursion/gnark-ffi/src/groth16.rs index 48b3509ee9..703f16b358 100644 --- a/recursion/gnark-ffi/src/groth16.rs +++ b/recursion/gnark-ffi/src/groth16.rs @@ -33,6 +33,7 @@ impl Groth16Prover { pub fn new() -> Self { Self } + /// Executes the prover in testing mode with a circuit definition and witness. pub fn test(constraints: Vec, witness: Witness) { let serialized = serde_json::to_string(&constraints).unwrap(); @@ -53,6 +54,7 @@ impl Groth16Prover { ); } + /// Builds the groth16 circuit locally. pub fn build(constraints: Vec, witness: Witness, build_dir: PathBuf) { let serialized = serde_json::to_string(&constraints).unwrap(); @@ -100,18 +102,19 @@ impl Groth16Prover { ) } + /// Verify a Groth16 proof and verify that the supplied vkey_hash and committed_values_digest match. pub fn verify( &self, proof: &Groth16Proof, vkey_hash: &BigUint, - commited_values_digest: &BigUint, + committed_values_digest: &BigUint, build_dir: &Path, ) { verify_groth16( build_dir.to_str().unwrap(), &proof.raw_proof, &vkey_hash.to_string(), - &commited_values_digest.to_string(), + &committed_values_digest.to_string(), ) .expect("failed to verify proof") } diff --git a/sdk/Cargo.toml b/sdk/Cargo.toml index 4217581948..12e8cfbf37 100644 --- a/sdk/Cargo.toml +++ b/sdk/Cargo.toml @@ -13,9 +13,13 @@ serde_json = "1.0.117" twirp = { git = "https://github.com/github/twirp-rs.git", rev = "c85f31f9c54957374e7dcb3534fc52cff0aa2dc5" } async-trait = "0.1.80" reqwest-middleware = "0.3.1" -reqwest = { version = "0.12.4", features = ["rustls-tls", "trust-dns", "stream"] } +reqwest = { version = "0.12.4", features = [ + "rustls-tls", + "trust-dns", + "stream", +] } anyhow = "1.0.83" -sp1-prover = { path = "../prover" } +sp1-prover = { path = "../prover", default-features = false } sp1-core = { path = "../core" } futures = "0.3.30" bincode = "1.3.3" @@ -37,9 +41,11 @@ sha2 = "0.10.8" dirs = "5.0.1" tempfile = "3.10.1" num-bigint = "0.4.5" +cfg-if = "1.0" [features] neon = ["sp1-core/neon"] +groth16 = ["sp1-prover/groth16"] [build-dependencies] vergen = { version = "8", default-features = false, features = [ diff --git a/sdk/src/provers/local.rs b/sdk/src/provers/local.rs index 261c9e771f..35a1a42519 100644 --- a/sdk/src/provers/local.rs +++ b/sdk/src/provers/local.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use cfg_if::cfg_if; use sp1_prover::{SP1Prover, SP1Stdin}; use crate::{ @@ -54,27 +55,34 @@ impl Prover for LocalProver { } fn prove_groth16(&self, pk: &SP1ProvingKey, stdin: SP1Stdin) -> Result { - let proof = self.prover.prove_core(pk, &stdin)?; - let deferred_proofs = stdin.proofs.iter().map(|p| p.0.clone()).collect(); - let public_values = proof.public_values.clone(); - let reduce_proof = self.prover.compress(&pk.vk, proof, deferred_proofs)?; - let compress_proof = self.prover.shrink(reduce_proof)?; - let outer_proof = self.prover.wrap_bn254(compress_proof)?; + cfg_if! { + if #[cfg(feature = "groth16")] { - let groth16_aritfacts = if sp1_prover::build::sp1_dev_mode() { - sp1_prover::build::try_build_groth16_artifacts_dev( - &self.prover.wrap_vk, - &outer_proof.proof, - ) - } else { - sp1_prover::build::try_install_groth16_artifacts() - }; - let proof = self.prover.wrap_groth16(outer_proof, &groth16_aritfacts); - Ok(SP1ProofWithPublicValues { - proof, - stdin, - public_values, - }) + let proof = self.prover.prove_core(pk, &stdin)?; + let deferred_proofs = stdin.proofs.iter().map(|p| p.0.clone()).collect(); + let public_values = proof.public_values.clone(); + let reduce_proof = self.prover.compress(&pk.vk, proof, deferred_proofs)?; + let compress_proof = self.prover.shrink(reduce_proof)?; + let outer_proof = self.prover.wrap_bn254(compress_proof)?; + + let groth16_aritfacts = if sp1_prover::build::sp1_dev_mode() { + sp1_prover::build::try_build_groth16_artifacts_dev( + &self.prover.wrap_vk, + &outer_proof.proof, + ) + } else { + sp1_prover::build::try_install_groth16_artifacts() + }; + let proof = self.prover.wrap_groth16(outer_proof, &groth16_aritfacts); + Ok(SP1ProofWithPublicValues { + proof, + stdin, + public_values, + }) + } else { + panic!("groth16 feature not enabled") + } + } } fn prove_plonk(&self, _pk: &SP1ProvingKey, _stdin: SP1Stdin) -> Result { From 65763abbcaf360c0683e14efbd04be03ceabd6f8 Mon Sep 17 00:00:00 2001 From: Kevin Jue Date: Wed, 22 May 2024 10:40:35 -0700 Subject: [PATCH 07/42] chore(recursion): explicitly don't allow witness and public values related apis in sub-builder (#744) --- recursion/compiler/src/ir/builder.rs | 55 ++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/recursion/compiler/src/ir/builder.rs b/recursion/compiler/src/ir/builder.rs index f3bc11b386..404da05a4b 100644 --- a/recursion/compiler/src/ir/builder.rs +++ b/recursion/compiler/src/ir/builder.rs @@ -96,35 +96,36 @@ pub struct Builder { pub(crate) ext_count: u32, pub(crate) var_count: u32, pub operations: TracedVec>, - pub nb_public_values: Option>, - pub public_values_buffer: Option>>, - pub witness_var_count: u32, - pub witness_felt_count: u32, - pub witness_ext_count: u32, - pub debug: bool, - pub po2_table: Option>>, + pub(crate) nb_public_values: Option>, + pub(crate) witness_var_count: u32, + pub(crate) witness_felt_count: u32, + pub(crate) witness_ext_count: u32, + pub(crate) debug: bool, + pub(crate) is_sub_builder: bool, } impl Builder { /// Creates a new builder with a given number of counts for each type. - pub fn new( + pub fn new_sub_builder( var_count: u32, felt_count: u32, ext_count: u32, nb_public_values: Option>, + debug: bool, ) -> Self { Self { felt_count, ext_count, var_count, + // Witness counts are only used when the target is a gnark circuit. And sub-builders are + // not used when the target is a gnark circuit, so it's fine to set the witness counts to 0. witness_var_count: 0, witness_felt_count: 0, witness_ext_count: 0, operations: Default::default(), nb_public_values, - public_values_buffer: None, - debug: false, - po2_table: None, + debug, + is_sub_builder: true, } } @@ -388,6 +389,10 @@ impl Builder { } pub fn witness_var(&mut self) -> Var { + assert!( + !self.is_sub_builder, + "Cannot create a witness var with a sub builder" + ); let witness = self.uninit(); self.operations .push(DslIr::WitnessVar(witness, self.witness_var_count)); @@ -396,6 +401,10 @@ impl Builder { } pub fn witness_felt(&mut self) -> Felt { + assert!( + !self.is_sub_builder, + "Cannot create a witness felt with a sub builder" + ); let witness = self.uninit(); self.operations .push(DslIr::WitnessFelt(witness, self.witness_felt_count)); @@ -404,6 +413,10 @@ impl Builder { } pub fn witness_ext(&mut self) -> Ext { + assert!( + !self.is_sub_builder, + "Cannot create a witness ext with a sub builder" + ); let witness = self.uninit(); self.operations .push(DslIr::WitnessExt(witness, self.witness_ext_count)); @@ -431,6 +444,10 @@ impl Builder { /// Register and commits a felt as public value. This value will be constrained when verified. pub fn commit_public_value(&mut self, val: Felt) { + assert!( + !self.is_sub_builder, + "Cannot commit to a public value with a sub builder" + ); if self.nb_public_values.is_none() { self.nb_public_values = Some(self.eval(C::N::zero())); } @@ -442,6 +459,10 @@ impl Builder { /// Commits an array of felts in public values. pub fn commit_public_values(&mut self, vals: &Array>) { + assert!( + !self.is_sub_builder, + "Cannot commit to public values with a sub builder" + ); let len = vals.len(); self.range(0, len).for_each(|i, builder| { let val = builder.get(vals, i); @@ -491,11 +512,12 @@ impl<'a, C: Config> IfBuilder<'a, C> { let condition = self.condition(); // Execute the `then` block and collect the instructions. - let mut f_builder = Builder::::new( + let mut f_builder = Builder::::new_sub_builder( self.builder.var_count, self.builder.felt_count, self.builder.ext_count, self.builder.nb_public_values, + self.builder.debug, ); f(&mut f_builder); let then_instructions = f_builder.operations; @@ -538,22 +560,24 @@ impl<'a, C: Config> IfBuilder<'a, C> { ) { // Get the condition reduced from the expressions for lhs and rhs. let condition = self.condition(); - let mut then_builder = Builder::::new( + let mut then_builder = Builder::::new_sub_builder( self.builder.var_count, self.builder.felt_count, self.builder.ext_count, self.builder.nb_public_values, + self.builder.debug, ); // Execute the `then` and `else_then` blocks and collect the instructions. then_f(&mut then_builder); let then_instructions = then_builder.operations; - let mut else_builder = Builder::::new( + let mut else_builder = Builder::::new_sub_builder( self.builder.var_count, self.builder.felt_count, self.builder.ext_count, self.builder.nb_public_values, + self.builder.debug, ); else_f(&mut else_builder); let else_instructions = else_builder.operations; @@ -682,11 +706,12 @@ impl<'a, C: Config> RangeBuilder<'a, C> { pub fn for_each(self, mut f: impl FnMut(Var, &mut Builder)) { let step_size = C::N::from_canonical_usize(self.step_size); let loop_variable: Var = self.builder.uninit(); - let mut loop_body_builder = Builder::::new( + let mut loop_body_builder = Builder::::new_sub_builder( self.builder.var_count, self.builder.felt_count, self.builder.ext_count, self.builder.nb_public_values, + self.builder.debug, ); f(loop_variable, &mut loop_body_builder); From 4718a9e06590356bcdbde637a61f8be3fe7dafed Mon Sep 17 00:00:00 2001 From: Kevin Jue Date: Wed, 22 May 2024 10:41:14 -0700 Subject: [PATCH 08/42] fix(recursion): assert curve bit length in circuit p2_hash (#736) --- recursion/circuit/src/poseidon2.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/recursion/circuit/src/poseidon2.rs b/recursion/circuit/src/poseidon2.rs index c573875631..7be8ab02c1 100644 --- a/recursion/circuit/src/poseidon2.rs +++ b/recursion/circuit/src/poseidon2.rs @@ -24,6 +24,8 @@ impl Poseidon2CircuitBuilder for Builder { } fn p2_hash(&mut self, input: &[Felt]) -> OuterDigestVariable { + assert!(C::N::bits() == p3_bn254_fr::Bn254Fr::bits()); + assert!(C::F::bits() == p3_baby_bear::BabyBear::bits()); let num_f_elms = C::N::bits() / C::F::bits(); let mut state: [Var; SPONGE_SIZE] = [ self.eval(C::N::zero()), From 5b00b1df25b61787c2769f4b327ab3651d006887 Mon Sep 17 00:00:00 2001 From: Kevin Jue Date: Wed, 22 May 2024 10:41:47 -0700 Subject: [PATCH 09/42] fix(recursion): num2bits fixes (#732) --- recursion/compiler/src/ir/bits.rs | 49 ++++++++++++++++++++++++++----- recursion/core/src/runtime/mod.rs | 2 +- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/recursion/compiler/src/ir/bits.rs b/recursion/compiler/src/ir/bits.rs index 7df2f0e5e5..f69c8cee1d 100644 --- a/recursion/compiler/src/ir/bits.rs +++ b/recursion/compiler/src/ir/bits.rs @@ -1,11 +1,14 @@ -use p3_field::AbstractField; +use p3_field::{AbstractField, Field}; use sp1_recursion_core::runtime::NUM_BITS; use super::{Array, Builder, Config, DslIr, Felt, Usize, Var}; impl Builder { - /// Converts a variable to bits. + /// Converts a variable to LE bits. pub fn num2bits_v(&mut self, num: Var) -> Array> { + // This function is only used when the native field is Babybear. + assert!(C::N::bits() == NUM_BITS); + let output = self.dyn_array::>(NUM_BITS); self.push(DslIr::HintBitsV(output.clone(), num)); @@ -16,10 +19,10 @@ impl Builder { self.assign(sum, sum + bit * C::N::from_canonical_u32(1 << i)); } - // TODO: There is an edge case where the witnessed bits may slightly overflow and cause - // the output to be incorrect. This is a known issue and will be fixed in the future. self.assert_var_eq(sum, num); + self.less_than_bb_modulus(output.clone()); + output } @@ -49,22 +52,25 @@ impl Builder { }); } - // TODO: There is an edge case where the witnessed bits may slightly overflow and cause - // the output to be incorrect. This is a known issue and will be fixed in the future. self.assert_felt_eq(sum, num); + self.less_than_bb_modulus(output.clone()); + output } /// Converts a felt to bits inside a circuit. pub fn num2bits_f_circuit(&mut self, num: Felt) -> Vec> { let mut output = Vec::new(); - for _ in 0..32 { + for _ in 0..NUM_BITS { output.push(self.uninit()); } self.push(DslIr::CircuitNum2BitsF(num, output.clone())); + let output_array = self.vec(output.clone()); + self.less_than_bb_modulus(output_array); + output } @@ -149,4 +155,33 @@ impl Builder { } result_bits } + + /// Checks that the LE bit decomposition of a number is less than the babybear modulus. + /// + /// SAFETY: This function assumes that the num_bits values are already verified to be boolean. + /// + /// The babybear modulus in LE bits is: 100_000_000_000_000_000_000_000_000_111_1. + /// To check that the num_bits array is less than that value, we first check if the most significant + /// bits are all 1. If it is, then we assert that the other bits are all 0. + fn less_than_bb_modulus(&mut self, num_bits: Array>) { + let one: Var<_> = self.eval(C::N::one()); + let zero: Var<_> = self.eval(C::N::zero()); + + let mut most_sig_4_bits = one; + for i in (NUM_BITS - 4)..NUM_BITS { + let bit = self.get(&num_bits, i); + most_sig_4_bits = self.eval(bit * most_sig_4_bits); + } + + let mut sum_least_sig_bits = zero; + for i in 0..(NUM_BITS - 4) { + let bit = self.get(&num_bits, i); + sum_least_sig_bits = self.eval(bit + sum_least_sig_bits); + } + + // If the most significant 4 bits are all 1, then check the sum of the least significant bits, else return zero. + let check: Var<_> = + self.eval(most_sig_4_bits * sum_least_sig_bits + (one - most_sig_4_bits) * zero); + self.assert_var_eq(check, zero); + } } diff --git a/recursion/core/src/runtime/mod.rs b/recursion/core/src/runtime/mod.rs index 77a118326a..a37ce6858c 100644 --- a/recursion/core/src/runtime/mod.rs +++ b/recursion/core/src/runtime/mod.rs @@ -697,7 +697,7 @@ where // Get the src value. let num = b_val[0].as_canonical_u32(); - // Decompose the num into bits. + // Decompose the num into LE bits. let bits = (0..NUM_BITS).map(|i| (num >> i) & 1).collect::>(); // Write the bits to the array at dst. for (i, bit) in bits.iter().enumerate() { From 2c621149cb20218ff76232519813565012fe5ee6 Mon Sep 17 00:00:00 2001 From: Kevin Jue Date: Wed, 22 May 2024 11:13:26 -0700 Subject: [PATCH 10/42] chore(recursion): document IR (#737) --- recursion/compiler/src/asm/compiler.rs | 6 -- recursion/compiler/src/ir/instructions.rs | 115 ++++++++++++++++++++-- 2 files changed, 107 insertions(+), 14 deletions(-) diff --git a/recursion/compiler/src/asm/compiler.rs b/recursion/compiler/src/asm/compiler.rs index a84775f4fa..6d46cf1bd9 100644 --- a/recursion/compiler/src/asm/compiler.rs +++ b/recursion/compiler/src/asm/compiler.rs @@ -467,18 +467,12 @@ impl + TwoAdicField> AsmCo } _ => unimplemented!(), }, - DslIr::Num2BitsF(_, _) => unimplemented!(), - DslIr::Num2BitsV(_, _) => unimplemented!(), DslIr::Poseidon2PermuteBabyBear(dst, src) => match (dst, src) { (Array::Dyn(dst, _), Array::Dyn(src, _)) => { self.push(AsmInstruction::Poseidon2Permute(dst.fp(), src.fp()), trace) } _ => unimplemented!(), }, - DslIr::ReverseBitsLen(_, _, _) => unimplemented!(), - DslIr::TwoAdicGenerator(_, _) => unimplemented!(), - DslIr::ExpUsizeV(_, _, _) => unimplemented!(), - DslIr::ExpUsizeF(_, _, _) => unimplemented!(), DslIr::Error() => self.push(AsmInstruction::Trap, trace), DslIr::PrintF(dst) => self.push(AsmInstruction::PrintF(dst.fp()), trace), DslIr::PrintV(dst) => self.push(AsmInstruction::PrintV(dst.fp()), trace), diff --git a/recursion/compiler/src/ir/instructions.rs b/recursion/compiler/src/ir/instructions.rs index b3986f05d9..f7a5cee3e0 100644 --- a/recursion/compiler/src/ir/instructions.rs +++ b/recursion/compiler/src/ir/instructions.rs @@ -8,64 +8,111 @@ use super::{Config, Ext, Felt, Usize, Var}; #[derive(Debug, Clone)] pub enum DslIr { // Immediates. + /// Assigns an immediate to a variable (var = imm). ImmV(Var, C::N), + /// Assigns a field immediate to a field element (felt = field imm). ImmF(Felt, C::F), + /// Assigns an ext field immediate to an extension field element (ext = ext field imm). ImmE(Ext, C::EF), // Additions. + /// Add two variables (var = var + var). AddV(Var, Var, Var), + /// Add a variable and an immediate (var = var + imm). AddVI(Var, Var, C::N), + /// Add two field elements (felt = felt + felt). AddF(Felt, Felt, Felt), + /// Add a field element and a field immediate (felt = felt + field imm). AddFI(Felt, Felt, C::F), + /// Add two extension field elements (ext = ext + ext). AddE(Ext, Ext, Ext), + /// Add an extension field element and an ext field immediate (ext = ext + ext field imm). AddEI(Ext, Ext, C::EF), + /// Add an extension field element and a field element (ext = ext + felt). AddEF(Ext, Ext, Felt), + /// Add an extension field element and a field immediate (ext = ext + field imm). AddEFI(Ext, Ext, C::F), + /// Add a field element and an ext field immediate (ext = felt + ext field imm). AddEFFI(Ext, Felt, C::EF), // Subtractions. + /// Subtracts two variables (var = var - var). SubV(Var, Var, Var), + /// Subtracts a variable and an immediate (var = var - imm). SubVI(Var, Var, C::N), + /// Subtracts an immediate and a variable (var = imm - var). SubVIN(Var, C::N, Var), + /// Subtracts two field elements (felt = felt - felt). SubF(Felt, Felt, Felt), + /// Subtracts a field element and a field immediate (felt = felt - field imm). SubFI(Felt, Felt, C::F), + /// Subtracts a field immediate and a field element (felt = field imm - felt). SubFIN(Felt, C::F, Felt), + /// Subtracts two extension field elements (ext = ext - ext). SubE(Ext, Ext, Ext), + /// Subtrancts an extension field element and an extension field immediate (ext = ext - ext field imm). SubEI(Ext, Ext, C::EF), + /// Subtracts an extension field immediate and an extension field element (ext = ext field imm - ext). SubEIN(Ext, C::EF, Ext), + /// Subtracts an extension field element and a field immediate (ext = ext - field imm). SubEFI(Ext, Ext, C::F), + /// Subtracts an extension field element and a field element (ext = ext - felt). SubEF(Ext, Ext, Felt), // Multiplications. + /// Multiplies two variables (var = var * var). MulV(Var, Var, Var), + /// Multiplies a variable and an immediate (var = var * imm). MulVI(Var, Var, C::N), + /// Multiplies two field elements (felt = felt * felt). MulF(Felt, Felt, Felt), + /// Multiplies a field element and a field immediate (felt = felt * field imm). MulFI(Felt, Felt, C::F), + /// Multiplies two extension field elements (ext = ext * ext). MulE(Ext, Ext, Ext), + /// Multiplies an extension field element and an extension field immediate (ext = ext * ext field imm). MulEI(Ext, Ext, C::EF), + /// Multiplies an extension field element and a field immediate (ext = ext * field imm). MulEFI(Ext, Ext, C::F), + /// Multiplies an extension field element and a field element (ext = ext * felt). MulEF(Ext, Ext, Felt), // Divisions. + /// Divides two variables (var = var / var). DivF(Felt, Felt, Felt), + /// Divides a field element and a field immediate (felt = felt / field imm). DivFI(Felt, Felt, C::F), + /// Divides a field immediate and a field element (felt = field imm / felt). DivFIN(Felt, C::F, Felt), + /// Divides two extension field elements (ext = ext / ext). DivE(Ext, Ext, Ext), + /// Divides an extension field element and an extension field immediate (ext = ext / ext field imm). DivEI(Ext, Ext, C::EF), + /// Divides and extension field immediate and an extension field element (ext = ext field imm / ext). DivEIN(Ext, C::EF, Ext), + /// Divides an extension field element and a field immediate (ext = ext / field imm). DivEFI(Ext, Ext, C::F), + /// Divides a field immediate and an extension field element (ext = field imm / ext). DivEFIN(Ext, C::F, Ext), + /// Divides an extension field element and a field element (ext = ext / felt). DivEF(Ext, Ext, Felt), // Negations. + /// Negates a variable (var = -var). NegV(Var, Var), + /// Negates a field element (felt = -felt). NegF(Felt, Felt), + /// Negates an extension field element (ext = -ext). NegE(Ext, Ext), + /// Inverts a variable (var = 1 / var). InvV(Var, Var), + /// Inverts a field element (felt = 1 / felt). InvF(Felt, Felt), + /// Inverts an extension field element (ext = 1 / ext). InvE(Ext, Ext), // Control flow. + /// Executes a for loop with the parameters (start step value, end step value, step size, step variable, body). For( Usize, Usize, @@ -73,34 +120,51 @@ pub enum DslIr { Var, TracedVec>, ), + /// Executes an equal conditional branch with the parameters (lhs var, rhs var, then body, else body). IfEq( Var, Var, TracedVec>, TracedVec>, ), + /// Executes a not equal conditional branch with the parameters (lhs var, rhs var, then body, else body). IfNe( Var, Var, TracedVec>, TracedVec>, ), + /// Executes an equal conditional branch with the parameters (lhs var, rhs imm, then body, else body). IfEqI(Var, C::N, TracedVec>, TracedVec>), + /// Executes a not equal conditional branch with the parameters (lhs var, rhs imm, then body, else body). IfNeI(Var, C::N, TracedVec>, TracedVec>), + /// Break out of a for loop. Break, // Assertions. + /// Assert that two variables are equal (var == var). AssertEqV(Var, Var), + /// Assert that two variables are not equal (var != var). AssertNeV(Var, Var), + /// Assert that two field elements are equal (felt == felt). AssertEqF(Felt, Felt), + /// Assert that two field elements are not equal (felt != felt). AssertNeF(Felt, Felt), + /// Assert that two extension field elements are equal (ext == ext). AssertEqE(Ext, Ext), + /// Assert that two extension field elements are not equal (ext != ext). AssertNeE(Ext, Ext), + /// Assert that a variable is equal to an immediate (var == imm). AssertEqVI(Var, C::N), + /// Assert that a variable is not equal to an immediate (var != imm). AssertNeVI(Var, C::N), + /// Assert that a field element is equal to a field immediate (felt == field imm). AssertEqFI(Felt, C::F), + /// Assert that a field element is not equal to a field immediate (felt != field imm). AssertNeFI(Felt, C::F), + /// Assert that an extension field element is equal to an extension field immediate (ext == ext field imm). AssertEqEI(Ext, C::EF), + /// Assert that an extension field element is not equal to an extension field immediate (ext != ext field imm). AssertNeEI(Ext, C::EF), // Memory instructions. @@ -114,68 +178,103 @@ pub enum DslIr { LoadE(Ext, Ptr, MemIndex), /// Store variable at address StoreV(Var, Ptr, MemIndex), - /// Store field element at adress + /// Store field element at address StoreF(Felt, Ptr, MemIndex), - /// Store extension field at adress + /// Store extension field at address StoreE(Ext, Ptr, MemIndex), // Bits. - Num2BitsV(Array>, Usize), - Num2BitsF(Array>, Felt), + /// Decompose a variable into size bits (bits = num2bits(var, size)). Should only be used when target is a gnark circuit. CircuitNum2BitsV(Var, usize, Vec>), + /// Decompose a field element into bits (bits = num2bits(felt)). Should only be used when target is a gnark circuit. CircuitNum2BitsF(Felt, Vec>), - ReverseBitsLen(Usize, Usize, Usize), // Hashing. + /// Permutes an array of baby bear elements using Poseidon2 (output = p2_permute(array)). Poseidon2PermuteBabyBear(Array>, Array>), + /// Compresses two baby bear element arrays using Poseidon2 (output = p2_compress(array1, array2)). Poseidon2CompressBabyBear( Array>, Array>, Array>, ), + /// Permutes an array of Bn254 elements using Poseidon2 (output = p2_permute(array)). Should only + /// be used when target is a gnark circuit. CircuitPoseidon2Permute([Var; 3]), // Miscellaneous instructions. + /// Decompose hint operation of a usize into an array. (output = num2bits(usize)). HintBitsU(Array>, Usize), + /// Decompose hint operation of a variable into an array. (output = num2bits(var)). HintBitsV(Array>, Var), + /// Decompose hint operation of a field element into an array. (output = num2bits(felt)). HintBitsF(Array>, Felt), + /// Prints a variable. PrintV(Var), + /// Prints a field element. PrintF(Felt), + /// Prints an extension field element. PrintE(Ext), + /// Throws an error. Error(), - TwoAdicGenerator(Felt, Usize), - ExpUsizeV(Var, Var, Usize), - ExpUsizeF(Felt, Felt, Usize), + + /// Converts an ext to a slice of felts. HintExt2Felt(Array>, Ext), + /// Hint the length of the next array. HintLen(Var), + /// Hint an array of variables. HintVars(Array>), + /// Hint an array of field elements. HintFelts(Array>), + /// Hint an array of extension field elements. HintExts(Array>), + /// Witness a variable. Should only be used when target is a gnark circuit. WitnessVar(Var, u32), + /// Witness a field element. Should only be used when target is a gnark circuit. WitnessFelt(Felt, u32), + /// Witness an extension field element. Should only be used when target is a gnark circuit. WitnessExt(Ext, u32), + /// Label a field element as the ith public input. Commit(Felt, Var), + /// Registers a field element to the public inputs. RegisterPublicValue(Felt), + /// Operation to halt the program. Should be the last instruction in the program. Halt, // Public inputs for circuits. + /// Asserts that the inputted var is equal the circuit's vkey hash public input. Should only be + /// used when target is a gnark circuit. CircuitCommitVkeyHash(Var), + /// Asserts that the inputted var is equal the circuit's commited values digest public input. Should + /// only be used when target is a gnark circuit. CircuitCommitCommitedValuesDigest(Var), // FRI specific instructions. + /// Executes a FRI fold operation. 1st field is the size of the fri fold input array. 2nd field + /// is the fri fold input array. See [`FriFoldInput`] for more details. FriFold(Var, Array>), + /// Select's a variable based on a condition. (select(cond, true_val, false_val) => output). + /// Should only be used when target is a gnark circuit. CircuitSelectV(Var, Var, Var, Var), + /// Select's a field element based on a condition. (select(cond, true_val, false_val) => output). + /// Should only be used when target is a gnark circuit. CircuitSelectF(Var, Felt, Felt, Felt), + /// Select's an extension field element based on a condition. (select(cond, true_val, false_val) => output). + /// Should only be used when target is a gnark circuit. CircuitSelectE( Var, Ext, Ext, Ext, ), + /// Converts an ext to a slice of felts. Should only be used when target is a gnark circuit. CircuitExt2Felt([Felt; 4], Ext), + /// Converts a slice of felts to an ext. Should only be used when target is a gnark circuit. CircuitFelts2Ext([Felt; 4], Ext), // Debugging instructions. + /// Executes less than (var = var < var). This operation is NOT constrained. LessThan(Var, Var, Var), + /// Tracks the number of cycles used by a block of code annotated by the string input. CycleTracker(String), } From c140e0a031a03585bf4276f21ab05bacb8bf1b3b Mon Sep 17 00:00:00 2001 From: Tamir Hemo Date: Wed, 22 May 2024 12:44:48 -0700 Subject: [PATCH 11/42] chore: logup format (#788) --- core/src/stark/permutation.rs | 42 ++++++++++------------------------- 1 file changed, 12 insertions(+), 30 deletions(-) diff --git a/core/src/stark/permutation.rs b/core/src/stark/permutation.rs index 4536856ade..a76b4c8995 100644 --- a/core/src/stark/permutation.rs +++ b/core/src/stark/permutation.rs @@ -9,25 +9,6 @@ use rayon_scan::ScanParallelIterator; use crate::{air::MultiTableAirBuilder, lookup::Interaction}; -/// Generates powers of a random element based on how many interactions there are in the chip. -/// -/// These elements are used to uniquely fingerprint each interaction. -#[inline] -pub fn generate_interaction_rlc_elements( - sends: &[Interaction], - receives: &[Interaction], - random_element: AF, -) -> Vec { - let n = sends - .iter() - .chain(receives.iter()) - .map(|interaction| interaction.argument_index()) - .max() - .unwrap_or(0) - + 1; - random_element.powers().skip(1).take(n).collect::>() -} - #[inline] #[allow(clippy::too_many_arguments)] pub fn populate_permutation_row>( @@ -36,7 +17,7 @@ pub fn populate_permutation_row>( main_row: &[F], sends: &[Interaction], receives: &[Interaction], - alphas: &[EF], + alpha: EF, betas: Powers, batch_size: usize, ) { @@ -50,9 +31,11 @@ pub fn populate_permutation_row>( *value = chunk .into_iter() .map(|(interaction, is_send)| { - let alpha = alphas[interaction.argument_index()]; let mut denominator = alpha; - for (columns, beta) in interaction.values.iter().zip(betas.clone()) { + let mut betas = betas.clone(); + denominator += + betas.next().unwrap() * EF::from_canonical_usize(interaction.argument_index()); + for (columns, beta) in interaction.values.iter().zip(betas) { denominator += beta * columns.apply::(preprocessed_row, main_row) } let mut mult = interaction @@ -87,7 +70,7 @@ pub(crate) fn generate_permutation_trace>( batch_size: usize, ) -> RowMajorMatrix { // Generate the RLC elements to uniquely identify each interaction. - let alphas = generate_interaction_rlc_elements(sends, receives, random_elements[0]); + let alpha = random_elements[0]; // Generate the RLC elements to uniquely identify each item in the looked up tuple. let betas = random_elements[1].powers(); @@ -122,7 +105,7 @@ pub(crate) fn generate_permutation_trace>( main_row.collect::>().as_slice(), sends, receives, - &alphas, + alpha, betas.clone(), batch_size, ) @@ -139,7 +122,7 @@ pub(crate) fn generate_permutation_trace>( main_row, sends, receives, - &alphas, + alpha, betas.clone(), batch_size, ) @@ -208,9 +191,6 @@ pub fn eval_permutation_constraints( let perm_next = perm.row_slice(1); let perm_next: &[AB::VarEF] = (*perm_next).borrow(); - let alphas = generate_interaction_rlc_elements(sends, receives, alpha); - let betas = beta.powers(); - // Ensure that each batch sum m_i/f_i is computed correctly. let interaction_chunks = &sends .iter() @@ -244,12 +224,14 @@ pub fn eval_permutation_constraints( let mut rlcs: Vec = Vec::with_capacity(batch_size); let mut multiplicities: Vec = Vec::with_capacity(batch_size); for (interaction, is_send) in chunk { - let mut rlc = AB::ExprEF::zero(); + let mut rlc = alpha.clone(); + let mut betas = beta.powers(); + rlc += betas.next().unwrap() + * AB::ExprEF::from_canonical_usize(interaction.argument_index()); for (field, beta) in interaction.values.iter().zip(betas.clone()) { let elem = field.apply::(&preprocessed_local, main_local); rlc += beta * elem; } - rlc += alphas[interaction.argument_index()].clone(); rlcs.push(rlc); let send_factor = if is_send { AB::F::one() } else { -AB::F::one() }; From 45c875b56e46497c1cb7a3a91aaa23493ed58012 Mon Sep 17 00:00:00 2001 From: Ratan Kaliani Date: Thu, 23 May 2024 11:58:21 -0700 Subject: [PATCH 12/42] chore: merge main into dev (#801) Co-authored-by: Chris T --- .github/workflows/release.yml | 11 ++++ Cargo.lock | 4 +- sdk/src/auth.rs | 26 ++++++++ sdk/src/client.rs | 53 ++++++++++++---- sdk/src/proto/network.rs | 113 +++++++++++++++++++++++++++++++--- sdk/src/provers/network.rs | 26 +++++--- sp1up/sp1up | 7 +-- 7 files changed, 206 insertions(+), 34 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 943a7d2743..980780a98c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,6 +4,8 @@ name: release on: push: + branches: + - main tags: - "v*.*.*" workflow_dispatch: @@ -119,6 +121,15 @@ jobs: with: key: ${{ matrix.target }} cache-on-failure: true + + - name: Install go + uses: actions/setup-go@v5 + with: + go-version: '^1.22.1' + + - name: Check go installation + run: | + go version - name: Set up git private repo access run: | diff --git a/Cargo.lock b/Cargo.lock index 10eb4fd0b6..c4add6d707 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -856,7 +856,7 @@ dependencies = [ "bitflags 2.5.0", "cexpr", "clang-sys", - "itertools 0.12.1", + "itertools 0.10.5", "lazy_static", "lazycell", "log", @@ -3520,7 +3520,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.12.1", + "itertools 0.10.5", "proc-macro2", "quote", "syn 2.0.65", diff --git a/sdk/src/auth.rs b/sdk/src/auth.rs index 44878a0c1d..5ff49393eb 100644 --- a/sdk/src/auth.rs +++ b/sdk/src/auth.rs @@ -6,6 +6,8 @@ use alloy::sol; use alloy::sol_types::{Eip712Domain, SolStruct}; use anyhow::Result; +use crate::proto::network::UnclaimReason; + sol! { struct CreateProof { uint64 nonce; @@ -23,6 +25,13 @@ sol! { string proof_id; } + struct UnclaimProof { + uint64 nonce; + string proof_id; + uint8 reason; + string description; + } + struct FulfillProof { uint64 nonce; string proof_id; @@ -110,6 +119,23 @@ impl NetworkAuth { self.sign_message(type_struct).await } + /// Signs a message to unclaim a proof that was previously claimed. + pub async fn sign_unclaim_proof_message( + &self, + nonce: u64, + proof_id: String, + reason: UnclaimReason, + description: String, + ) -> Result> { + let type_struct = UnclaimProof { + nonce, + proof_id, + reason: reason as u8, + description, + }; + self.sign_message(type_struct).await + } + /// Signs a message to fulfill a proof. The proof must have been previously claimed by the /// signer first. pub async fn sign_fulfill_proof_message(&self, nonce: u64, proof_id: &str) -> Result> { diff --git a/sdk/src/client.rs b/sdk/src/client.rs index 00e332f2e3..87403dbde7 100644 --- a/sdk/src/client.rs +++ b/sdk/src/client.rs @@ -1,6 +1,9 @@ use std::{env, time::Duration}; -use crate::auth::NetworkAuth; +use crate::{ + auth::NetworkAuth, + proto::network::{UnclaimProofRequest, UnclaimReason}, +}; use anyhow::{Context, Ok, Result}; use futures::future::join_all; use reqwest::{Client as HttpClient, Url}; @@ -73,15 +76,14 @@ impl NetworkClient { } /// Gets the latest nonce for this auth's account. - pub async fn get_nonce(&self) -> u64 { + pub async fn get_nonce(&self) -> Result { let res = self .rpc .get_nonce(GetNonceRequest { address: self.auth.get_address().to_vec(), }) - .await - .unwrap(); - res.nonce + .await?; + Ok(res.nonce) } // Upload a file to the specified url. @@ -105,10 +107,10 @@ impl NetworkClient { let proof = match res.status() { ProofStatus::ProofFulfilled => { - println!("Proof request fulfilled"); + log::info!("Proof request fulfilled"); let proof_bytes = self .http - .get(res.proof_url.clone()) + .get(res.proof_url.as_ref().expect("no proof url")) .send() .await .context("Failed to send HTTP request for proof")? @@ -177,7 +179,7 @@ impl NetworkClient { .expect("Invalid start time"); let deadline = since_the_epoch.as_secs() + 1000; - let nonce = self.get_nonce().await; + let nonce = self.get_nonce().await?; let create_proof_signature = self .auth .sign_create_proof_message(nonce, deadline, mode.into()) @@ -201,7 +203,7 @@ impl NetworkClient { results.pop().expect("Failed to upload stdin")?; results.pop().expect("Failed to upload program")?; - let nonce = self.get_nonce().await; + let nonce = self.get_nonce().await?; let submit_proof_signature = self .auth .sign_submit_proof_message(nonce, &res.proof_id) @@ -220,7 +222,7 @@ impl NetworkClient { // Claim a proof that was requested. This commits to generating a proof and fulfilling it. // Returns an error if the proof is not in a PROOF_REQUESTED state. pub async fn claim_proof(&self, proof_id: &str) -> Result { - let nonce = self.get_nonce().await; + let nonce = self.get_nonce().await?; let signature = self.auth.sign_claim_proof_message(nonce, proof_id).await?; let res = self .rpc @@ -234,10 +236,37 @@ impl NetworkClient { Ok(res) } + // Unclaim a proof that was claimed. This should only be called if the proof has not been + // fulfilled yet. Returns an error if the proof is not in a PROOF_CLAIMED state or if the caller + // is not the claimer. + pub async fn unclaim_proof( + &self, + proof_id: String, + reason: UnclaimReason, + description: String, + ) -> Result<()> { + let nonce = self.get_nonce().await?; + let signature = self + .auth + .sign_unclaim_proof_message(nonce, proof_id.clone(), reason, description.clone()) + .await?; + self.rpc + .unclaim_proof(UnclaimProofRequest { + signature, + nonce, + proof_id, + reason: reason.into(), + description, + }) + .await?; + + Ok(()) + } + // Fulfill a proof. Should only be called after the proof has been uploaded. Returns an error // if the proof is not in a PROOF_CLAIMED state or if the caller is not the claimer. pub async fn fulfill_proof(&self, proof_id: &str) -> Result { - let nonce = self.get_nonce().await; + let nonce = self.get_nonce().await?; let signature = self .auth .sign_fulfill_proof_message(nonce, proof_id) @@ -263,7 +292,7 @@ impl NetworkClient { callback: [u8; 20], callback_data: &[u8], ) -> Result { - let nonce = self.get_nonce().await; + let nonce = self.get_nonce().await?; let signature = self .auth .sign_relay_proof_message(nonce, proof_id, chain_id, verifier, callback, callback_data) diff --git a/sdk/src/proto/network.rs b/sdk/src/proto/network.rs index 2dd9b39d84..52bb125647 100644 --- a/sdk/src/proto/network.rs +++ b/sdk/src/proto/network.rs @@ -86,6 +86,33 @@ pub struct ClaimProofResponse { #[prost(string, tag = "3")] pub proof_artifact_id: ::prost::alloc::string::String, } +/// The request to unclaim a proof, which cancels the claim to fulfill the proof. MUST be called +/// when the proof is in a PROOF_CLAIMED state and MUST be called by the prover who claimed it. +#[derive(serde::Serialize, serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UnclaimProofRequest { + /// The signature of the message. + #[prost(bytes = "vec", tag = "1")] + pub signature: ::prost::alloc::vec::Vec, + /// The nonce for the account. + #[prost(uint64, tag = "2")] + pub nonce: u64, + /// The proof identifier. + #[prost(string, tag = "3")] + pub proof_id: ::prost::alloc::string::String, + /// The reason for unclaiming the proof. + #[prost(enumeration = "UnclaimReason", tag = "4")] + pub reason: i32, + /// The description for the reason. + #[prost(string, tag = "5")] + pub description: ::prost::alloc::string::String, +} +/// The response for unclaiming a proof, empty on success. +#[derive(serde::Serialize, serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UnclaimProofResponse {} /// The request to fulfill a proof. MUST be called after the proof has been uploaded and MUST be called /// when the proof is in a PROOF_CLAIMED state. #[derive(serde::Serialize, serde::Deserialize)] @@ -185,8 +212,14 @@ pub struct GetProofStatusResponse { pub status: i32, /// Optional proof URL, where you can download the result of the proof request. Only included if /// the proof has been fulfilled. - #[prost(string, tag = "2")] - pub proof_url: ::prost::alloc::string::String, + #[prost(string, optional, tag = "2")] + pub proof_url: ::core::option::Option<::prost::alloc::string::String>, + /// If the proof was unclaimed, the reason why. + #[prost(enumeration = "UnclaimReason", optional, tag = "3")] + pub unclaim_reason: ::core::option::Option, + /// If the proof was unclaimed, the description detailing why. + #[prost(string, optional, tag = "4")] + pub unclaim_description: ::core::option::Option<::prost::alloc::string::String>, } /// The request to get proof requests by a given status. #[derive(serde::Serialize, serde::Deserialize)] @@ -320,10 +353,10 @@ pub enum ProofStatus { ProofRequested = 2, /// The proof request has been claimed and is awaiting a prover to fulfill it. ProofClaimed = 3, + /// The proof request was previously claimed but has now been unclaimed. + ProofUnclaimed = 4, /// The proof request has been fulfilled and is available for download. - ProofFulfilled = 4, - /// The proof request failed and will need to be re-created. - ProofFailed = 5, + ProofFulfilled = 5, } impl ProofStatus { /// String value of the enum field names used in the ProtoBuf definition. @@ -336,8 +369,8 @@ impl ProofStatus { ProofStatus::ProofPreparing => "PROOF_PREPARING", ProofStatus::ProofRequested => "PROOF_REQUESTED", ProofStatus::ProofClaimed => "PROOF_CLAIMED", + ProofStatus::ProofUnclaimed => "PROOF_UNCLAIMED", ProofStatus::ProofFulfilled => "PROOF_FULFILLED", - ProofStatus::ProofFailed => "PROOF_FAILED", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -347,8 +380,8 @@ impl ProofStatus { "PROOF_PREPARING" => Some(Self::ProofPreparing), "PROOF_REQUESTED" => Some(Self::ProofRequested), "PROOF_CLAIMED" => Some(Self::ProofClaimed), + "PROOF_UNCLAIMED" => Some(Self::ProofUnclaimed), "PROOF_FULFILLED" => Some(Self::ProofFulfilled), - "PROOF_FAILED" => Some(Self::ProofFailed), _ => None, } } @@ -410,6 +443,50 @@ impl TransactionStatus { } } } +#[derive( + serde::Serialize, + serde::Deserialize, + Clone, + Copy, + Debug, + PartialEq, + Eq, + Hash, + PartialOrd, + Ord, + ::prost::Enumeration, +)] +#[repr(i32)] +pub enum UnclaimReason { + /// Unspecified reason. + Unspecified = 0, + /// The prover claims the request is invalid and cannot be fulfilled. + Invalid = 1, + /// The prover is unable to fulfill the proof due to any other reason. + Abandoned = 2, +} +impl UnclaimReason { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + UnclaimReason::Unspecified => "UNCLAIM_REASON_UNSPECIFIED", + UnclaimReason::Invalid => "UNCLAIM_REASON_INVALID", + UnclaimReason::Abandoned => "UNCLAIM_REASON_ABANDONED", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "UNCLAIM_REASON_UNSPECIFIED" => Some(Self::Unspecified), + "UNCLAIM_REASON_INVALID" => Some(Self::Invalid), + "UNCLAIM_REASON_ABANDONED" => Some(Self::Abandoned), + _ => None, + } + } +} pub const SERVICE_FQN: &str = "/network.NetworkService"; #[twirp::async_trait::async_trait] pub trait NetworkService { @@ -428,6 +505,11 @@ pub trait NetworkService { ctx: twirp::Context, req: ClaimProofRequest, ) -> Result; + async fn unclaim_proof( + &self, + ctx: twirp::Context, + req: UnclaimProofRequest, + ) -> Result; async fn fulfill_proof( &self, ctx: twirp::Context, @@ -482,6 +564,12 @@ where api.claim_proof(ctx, req).await }, ) + .route( + "/UnclaimProof", + |api: std::sync::Arc, ctx: twirp::Context, req: UnclaimProofRequest| async move { + api.unclaim_proof(ctx, req).await + }, + ) .route( "/FulfillProof", |api: std::sync::Arc, ctx: twirp::Context, req: FulfillProofRequest| async move { @@ -534,6 +622,10 @@ pub trait NetworkServiceClient: Send + Sync + std::fmt::Debug { &self, req: ClaimProofRequest, ) -> Result; + async fn unclaim_proof( + &self, + req: UnclaimProofRequest, + ) -> Result; async fn fulfill_proof( &self, req: FulfillProofRequest, @@ -580,6 +672,13 @@ impl NetworkServiceClient for twirp::client::Client { let url = self.base_url.join("network.NetworkService/ClaimProof")?; self.request(url, req).await } + async fn unclaim_proof( + &self, + req: UnclaimProofRequest, + ) -> Result { + let url = self.base_url.join("network.NetworkService/UnclaimProof")?; + self.request(url, req).await + } async fn fulfill_proof( &self, req: FulfillProofRequest, diff --git a/sdk/src/provers/network.rs b/sdk/src/provers/network.rs index a5b2e58e3c..4e9dc0f9c0 100644 --- a/sdk/src/provers/network.rs +++ b/sdk/src/provers/network.rs @@ -11,6 +11,7 @@ use crate::{ }; use anyhow::{Context, Result}; use serde::de::DeserializeOwned; +use sp1_core::runtime::{Program, Runtime}; use sp1_prover::utils::block_on; use sp1_prover::{SP1Prover, SP1Stdin}; use tokio::{runtime, time::sleep}; @@ -43,13 +44,19 @@ impl NetworkProver { ) -> Result

{ let client = &self.client; // Execute the runtime before creating the proof request. - // TODO: Maybe we don't want to always do this locally, with large programs. Or we may want - // to disable events at least. - let _public_values = SP1Prover::execute(elf, &stdin); - println!("Simulation complete"); + let program = Program::from(elf); + let mut runtime = Runtime::new(program); + runtime.write_vecs(&stdin.buffer); + for (proof, vkey) in stdin.proofs.iter() { + runtime.write_proof(proof.clone(), vkey.clone()); + } + runtime + .run_untraced() + .context("Failed to execute program")?; + log::info!("Simulation complete, cycles: {}", runtime.state.global_clk); let proof_id = client.create_proof(elf, &stdin, mode).await?; - println!("Proof request ID: {:?}", proof_id); + log::info!("Created {}", proof_id); let mut is_claimed = false; loop { @@ -61,12 +68,15 @@ impl NetworkProver { } ProofStatus::ProofClaimed => { if !is_claimed { - println!("Proof request claimed, proving..."); + log::info!("Proof request claimed, proving..."); is_claimed = true; } } - ProofStatus::ProofFailed => { - return Err(anyhow::anyhow!("Proof generation failed")); + ProofStatus::ProofUnclaimed => { + return Err(anyhow::anyhow!( + "Proof generation failed: {}", + status.unclaim_description() + )); } _ => { sleep(Duration::from_secs(1)).await; diff --git a/sp1up/sp1up b/sp1up/sp1up index a5a26a95f2..5524462ba0 100644 --- a/sp1up/sp1up +++ b/sp1up/sp1up @@ -80,13 +80,10 @@ main() { # Install by downloading binaries if [[ "$SP1UP_REPO" == "succinctlabs/sp1" && -z "$SP1UP_BRANCH" && -z "$SP1UP_COMMIT" ]]; then - SP1UP_VERSION=${SP1UP_VERSION:-nightly} + SP1UP_VERSION=${SP1UP_VERSION:-main} SP1UP_TAG=$SP1UP_VERSION - # Normalize versions (handle channels, versions without v prefix - if [[ "$SP1UP_VERSION" =~ ^nightly ]]; then - SP1UP_VERSION="nightly" - elif [[ "$SP1UP_VERSION" == [[:digit:]]* ]]; then + if [[ "$SP1UP_VERSION" == [[:digit:]]* ]]; then # Add v prefix SP1UP_VERSION="v${SP1UP_VERSION}" SP1UP_TAG="${SP1UP_VERSION}" From 0afe817592a20a52ee86ede992d6b176c7f5ed40 Mon Sep 17 00:00:00 2001 From: Tamir Hemo Date: Thu, 23 May 2024 14:19:49 -0700 Subject: [PATCH 13/42] feat: byte multiplicity channel (#800) --- core/src/air/builder.rs | 64 ++++++++- core/src/alu/add_sub/mod.rs | 24 +++- core/src/alu/bitwise/mod.rs | 24 +++- core/src/alu/divrem/mod.rs | 60 ++++++-- core/src/alu/lt/mod.rs | 41 ++++-- core/src/alu/mod.rs | 6 +- core/src/alu/mul/mod.rs | 33 ++++- core/src/alu/sll/mod.rs | 27 +++- core/src/alu/sr/mod.rs | 36 +++-- core/src/bytes/air.rs | 103 ++++++++------ core/src/bytes/columns.rs | 12 +- core/src/bytes/event.rs | 42 ++++-- core/src/bytes/mod.rs | 128 ++++++++++-------- core/src/bytes/trace.rs | 3 +- core/src/cpu/air/branch.rs | 3 + core/src/cpu/air/ecall.rs | 1 + core/src/cpu/air/memory.rs | 4 + core/src/cpu/air/mod.rs | 18 +++ core/src/cpu/air/register.rs | 3 + core/src/cpu/columns/channel.rs | 65 +++++++++ core/src/cpu/columns/mod.rs | 7 + core/src/cpu/event.rs | 3 + core/src/cpu/trace.rs | 28 +++- core/src/memory/trace.rs | 54 ++++++-- core/src/operations/add.rs | 14 +- core/src/operations/add4.rs | 23 ++-- core/src/operations/add5.rs | 18 +-- core/src/operations/and.rs | 12 +- core/src/operations/field/field_den.rs | 47 ++++--- .../operations/field/field_inner_product.rs | 56 +++++--- core/src/operations/field/field_op.rs | 49 +++++-- core/src/operations/field/field_sqrt.rs | 43 +++--- core/src/operations/field/range.rs | 22 +-- core/src/operations/fixed_rotate_right.rs | 4 + core/src/operations/fixed_shift_right.rs | 6 +- core/src/operations/not.rs | 16 ++- core/src/operations/or.rs | 15 +- core/src/operations/xor.rs | 12 +- core/src/runtime/mod.rs | 21 ++- core/src/runtime/state.rs | 5 + core/src/runtime/syscall.rs | 4 + .../precompiles/blake3/compress/air.rs | 12 +- .../precompiles/blake3/compress/columns.rs | 1 + .../precompiles/blake3/compress/execute.rs | 2 + .../syscall/precompiles/blake3/compress/g.rs | 123 ++++++++++++++--- .../precompiles/blake3/compress/mod.rs | 1 + .../precompiles/blake3/compress/trace.rs | 6 +- .../src/syscall/precompiles/edwards/ed_add.rs | 81 ++++++++--- .../precompiles/edwards/ed_decompress.rs | 74 +++++++--- core/src/syscall/precompiles/keccak256/air.rs | 2 + .../syscall/precompiles/keccak256/columns.rs | 1 + .../syscall/precompiles/keccak256/execute.rs | 2 + core/src/syscall/precompiles/keccak256/mod.rs | 1 + .../syscall/precompiles/keccak256/trace.rs | 16 ++- core/src/syscall/precompiles/mod.rs | 6 + .../precompiles/sha256/compress/air.rs | 26 ++++ .../precompiles/sha256/compress/columns.rs | 1 + .../precompiles/sha256/compress/execute.rs | 2 + .../precompiles/sha256/compress/mod.rs | 1 + .../precompiles/sha256/compress/trace.rs | 102 +++++++++----- .../syscall/precompiles/sha256/extend/air.rs | 17 +++ .../precompiles/sha256/extend/columns.rs | 1 + .../precompiles/sha256/extend/execute.rs | 2 + .../syscall/precompiles/sha256/extend/mod.rs | 3 +- .../precompiles/sha256/extend/trace.rs | 89 ++++++++---- core/src/syscall/precompiles/uint256/air.rs | 30 +++- .../weierstrass/weierstrass_add.rs | 89 +++++++++--- .../weierstrass/weierstrass_decompress.rs | 75 +++++++--- .../weierstrass/weierstrass_double.rs | 77 +++++++++-- 69 files changed, 1520 insertions(+), 479 deletions(-) create mode 100644 core/src/cpu/columns/channel.rs diff --git a/core/src/air/builder.rs b/core/src/air/builder.rs index 903aac3045..eba567d920 100644 --- a/core/src/air/builder.rs +++ b/core/src/air/builder.rs @@ -84,6 +84,7 @@ pub trait BaseAirBuilder: AirBuilder + MessageBuilder /// A trait which contains methods for byte interactions in an AIR. pub trait ByteAirBuilder: BaseAirBuilder { /// Sends a byte operation to be processed. + #[allow(clippy::too_many_arguments)] fn send_byte( &mut self, opcode: impl Into, @@ -91,9 +92,19 @@ pub trait ByteAirBuilder: BaseAirBuilder { b: impl Into, c: impl Into, shard: impl Into, + channel: impl Into, multiplicity: impl Into, ) { - self.send_byte_pair(opcode, a, Self::Expr::zero(), b, c, shard, multiplicity) + self.send_byte_pair( + opcode, + a, + Self::Expr::zero(), + b, + c, + shard, + channel, + multiplicity, + ) } /// Sends a byte operation with two outputs to be processed. @@ -106,6 +117,7 @@ pub trait ByteAirBuilder: BaseAirBuilder { b: impl Into, c: impl Into, shard: impl Into, + channel: impl Into, multiplicity: impl Into, ) { self.send(AirInteraction::new( @@ -116,6 +128,7 @@ pub trait ByteAirBuilder: BaseAirBuilder { b.into(), c.into(), shard.into(), + channel.into(), ], multiplicity.into(), InteractionKind::Byte, @@ -123,6 +136,7 @@ pub trait ByteAirBuilder: BaseAirBuilder { } /// Receives a byte operation to be processed. + #[allow(clippy::too_many_arguments)] fn receive_byte( &mut self, opcode: impl Into, @@ -130,9 +144,19 @@ pub trait ByteAirBuilder: BaseAirBuilder { b: impl Into, c: impl Into, shard: impl Into, + channel: impl Into, multiplicity: impl Into, ) { - self.receive_byte_pair(opcode, a, Self::Expr::zero(), b, c, shard, multiplicity) + self.receive_byte_pair( + opcode, + a, + Self::Expr::zero(), + b, + c, + shard, + channel, + multiplicity, + ) } /// Receives a byte operation with two outputs to be processed. @@ -145,6 +169,7 @@ pub trait ByteAirBuilder: BaseAirBuilder { b: impl Into, c: impl Into, shard: impl Into, + channel: impl Into, multiplicity: impl Into, ) { self.receive(AirInteraction::new( @@ -155,6 +180,7 @@ pub trait ByteAirBuilder: BaseAirBuilder { b.into(), c.into(), shard.into(), + channel.into(), ], multiplicity.into(), InteractionKind::Byte, @@ -219,6 +245,7 @@ pub trait WordAirBuilder: ByteAirBuilder { &mut self, input: &[impl Into + Clone], shard: impl Into + Clone, + channel: impl Into + Clone, mult: impl Into + Clone, ) { let mut index = 0; @@ -229,6 +256,7 @@ pub trait WordAirBuilder: ByteAirBuilder { input[index].clone(), input[index + 1].clone(), shard.clone(), + channel.clone(), mult.clone(), ); index += 2; @@ -240,6 +268,7 @@ pub trait WordAirBuilder: ByteAirBuilder { input[index].clone(), Self::Expr::zero(), shard.clone(), + channel.clone(), mult.clone(), ); } @@ -250,6 +279,7 @@ pub trait WordAirBuilder: ByteAirBuilder { &mut self, input: &[impl Into + Copy], shard: impl Into + Clone, + channel: impl Into + Clone, mult: impl Into + Clone, ) { input.iter().for_each(|limb| { @@ -259,6 +289,7 @@ pub trait WordAirBuilder: ByteAirBuilder { Self::Expr::zero(), Self::Expr::zero(), shard.clone(), + channel.clone(), mult.clone(), ); }); @@ -268,6 +299,7 @@ pub trait WordAirBuilder: ByteAirBuilder { /// A trait which contains methods related to ALU interactions in an AIR. pub trait AluAirBuilder: BaseAirBuilder { /// Sends an ALU operation to be processed. + #[allow(clippy::too_many_arguments)] fn send_alu( &mut self, opcode: impl Into, @@ -275,6 +307,7 @@ pub trait AluAirBuilder: BaseAirBuilder { b: Word>, c: Word>, shard: impl Into, + channel: impl Into, multiplicity: impl Into, ) { let values = once(opcode.into()) @@ -282,6 +315,7 @@ pub trait AluAirBuilder: BaseAirBuilder { .chain(b.0.into_iter().map(Into::into)) .chain(c.0.into_iter().map(Into::into)) .chain(once(shard.into())) + .chain(once(channel.into())) .collect(); self.send(AirInteraction::new( @@ -292,6 +326,7 @@ pub trait AluAirBuilder: BaseAirBuilder { } /// Receives an ALU operation to be processed. + #[allow(clippy::too_many_arguments)] fn receive_alu( &mut self, opcode: impl Into, @@ -299,6 +334,7 @@ pub trait AluAirBuilder: BaseAirBuilder { b: Word>, c: Word>, shard: impl Into, + channel: impl Into, multiplicity: impl Into, ) { let values = once(opcode.into()) @@ -306,6 +342,7 @@ pub trait AluAirBuilder: BaseAirBuilder { .chain(b.0.into_iter().map(Into::into)) .chain(c.0.into_iter().map(Into::into)) .chain(once(shard.into())) + .chain(once(channel.into())) .collect(); self.receive(AirInteraction::new( @@ -316,9 +353,11 @@ pub trait AluAirBuilder: BaseAirBuilder { } /// Sends an syscall operation to be processed (with "ECALL" opcode). + #[allow(clippy::too_many_arguments)] fn send_syscall( &mut self, shard: impl Into + Clone, + channel: impl Into + Clone, clk: impl Into + Clone, syscall_id: impl Into + Clone, arg1: impl Into + Clone, @@ -328,6 +367,7 @@ pub trait AluAirBuilder: BaseAirBuilder { self.send(AirInteraction::new( vec![ shard.clone().into(), + channel.clone().into(), clk.clone().into(), syscall_id.clone().into(), arg1.clone().into(), @@ -339,9 +379,11 @@ pub trait AluAirBuilder: BaseAirBuilder { } /// Receives a syscall operation to be processed. + #[allow(clippy::too_many_arguments)] fn receive_syscall( &mut self, shard: impl Into + Clone, + channel: impl Into + Clone, clk: impl Into + Clone, syscall_id: impl Into + Clone, arg1: impl Into + Clone, @@ -351,6 +393,7 @@ pub trait AluAirBuilder: BaseAirBuilder { self.receive(AirInteraction::new( vec![ shard.clone().into(), + channel.clone().into(), clk.clone().into(), syscall_id.clone().into(), arg1.clone().into(), @@ -371,6 +414,7 @@ pub trait MemoryAirBuilder: BaseAirBuilder { fn eval_memory_access + Clone>( &mut self, shard: impl Into, + channel: impl Into, clk: impl Into, addr: impl Into, memory_access: &impl MemoryCols, @@ -378,13 +422,20 @@ pub trait MemoryAirBuilder: BaseAirBuilder { ) { let do_check: Self::Expr = do_check.into(); let shard: Self::Expr = shard.into(); + let channel: Self::Expr = channel.into(); let clk: Self::Expr = clk.into(); let mem_access = memory_access.access(); self.assert_bool(do_check.clone()); // Verify that the current memory access time is greater than the previous's. - self.eval_memory_access_timestamp(mem_access, do_check.clone(), shard.clone(), clk.clone()); + self.eval_memory_access_timestamp( + mem_access, + do_check.clone(), + shard.clone(), + channel, + clk.clone(), + ); // Add to the memory argument. let addr = addr.into(); @@ -420,6 +471,7 @@ pub trait MemoryAirBuilder: BaseAirBuilder { fn eval_memory_access_slice + Copy>( &mut self, shard: impl Into + Copy, + channel: impl Into + Clone, clk: impl Into + Clone, initial_addr: impl Into + Clone, memory_access_slice: &[impl MemoryCols], @@ -428,6 +480,7 @@ pub trait MemoryAirBuilder: BaseAirBuilder { for (i, access_slice) in memory_access_slice.iter().enumerate() { self.eval_memory_access( shard, + channel.clone(), clk.clone(), initial_addr.clone().into() + Self::Expr::from_canonical_usize(i * 4), access_slice, @@ -447,6 +500,7 @@ pub trait MemoryAirBuilder: BaseAirBuilder { mem_access: &MemoryAccessCols + Clone>, do_check: impl Into, shard: impl Into + Clone, + channel: impl Into + Clone, clk: impl Into, ) { let do_check: Self::Expr = do_check.into(); @@ -487,6 +541,7 @@ pub trait MemoryAirBuilder: BaseAirBuilder { mem_access.diff_16bit_limb.clone(), mem_access.diff_8bit_limb.clone(), shard.clone(), + channel.clone(), do_check, ); } @@ -503,6 +558,7 @@ pub trait MemoryAirBuilder: BaseAirBuilder { limb_16: impl Into + Clone, limb_8: impl Into + Clone, shard: impl Into + Clone, + channel: impl Into + Clone, do_check: impl Into + Clone, ) { // Verify that value = limb_16 + limb_8 * 2^16. @@ -519,6 +575,7 @@ pub trait MemoryAirBuilder: BaseAirBuilder { Self::Expr::zero(), Self::Expr::zero(), shard.clone(), + channel.clone(), do_check.clone(), ); @@ -528,6 +585,7 @@ pub trait MemoryAirBuilder: BaseAirBuilder { Self::Expr::zero(), limb_8, shard.clone(), + channel.clone(), do_check, ) } diff --git a/core/src/alu/add_sub/mod.rs b/core/src/alu/add_sub/mod.rs index 3de0819383..2321427c53 100644 --- a/core/src/alu/add_sub/mod.rs +++ b/core/src/alu/add_sub/mod.rs @@ -35,6 +35,9 @@ pub struct AddSubCols { /// The shard number, used for byte lookup table. pub shard: T, + /// The channel number, used for byte lookup table. + pub channel: T, + /// Instance of `AddOperation` to handle addition logic in `AddSubChip`'s ALU operations. /// It's result will be `a` for the add operation and `b` for the sub operation. pub add_operation: AddOperation, @@ -88,14 +91,20 @@ impl MachineAir for AddSubChip { let cols: &mut AddSubCols = row.as_mut_slice().borrow_mut(); let is_add = event.opcode == Opcode::ADD; cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); cols.is_add = F::from_bool(is_add); cols.is_sub = F::from_bool(!is_add); let operand_1 = if is_add { event.b } else { event.a }; let operand_2 = event.c; - cols.add_operation - .populate(&mut record, event.shard, operand_1, operand_2); + cols.add_operation.populate( + &mut record, + event.shard, + event.channel, + operand_1, + operand_2, + ); cols.operand_1 = Word::from(operand_1); cols.operand_2 = Word::from(operand_2); row @@ -150,6 +159,7 @@ where local.operand_2, local.add_operation, local.shard, + local.channel, local.is_add + local.is_sub, ); @@ -161,6 +171,7 @@ where local.operand_1, local.operand_2, local.shard, + local.channel, local.is_add, ); @@ -171,6 +182,7 @@ where local.add_operation.value, local.operand_2, local.shard, + local.channel, local.is_sub, ); @@ -203,7 +215,7 @@ mod tests { #[test] fn generate_trace() { let mut shard = ExecutionRecord::default(); - shard.add_events = vec![AluEvent::new(0, 0, Opcode::ADD, 14, 8, 6)]; + shard.add_events = vec![AluEvent::new(0, 0, 0, Opcode::ADD, 14, 8, 6)]; let chip = AddSubChip::default(); let trace: RowMajorMatrix = chip.generate_trace(&shard, &mut ExecutionRecord::default()); @@ -216,12 +228,13 @@ mod tests { let mut challenger = config.challenger(); let mut shard = ExecutionRecord::default(); - for _ in 0..1000 { + for i in 0..1000 { let operand_1 = thread_rng().gen_range(0..u32::MAX); let operand_2 = thread_rng().gen_range(0..u32::MAX); let result = operand_1.wrapping_add(operand_2); shard.add_events.push(AluEvent::new( 0, + i % 2, 0, Opcode::ADD, result, @@ -229,12 +242,13 @@ mod tests { operand_2, )); } - for _ in 0..1000 { + for i in 0..1000 { let operand_1 = thread_rng().gen_range(0..u32::MAX); let operand_2 = thread_rng().gen_range(0..u32::MAX); let result = operand_1.wrapping_sub(operand_2); shard.add_events.push(AluEvent::new( 0, + i % 2, 0, Opcode::SUB, result, diff --git a/core/src/alu/bitwise/mod.rs b/core/src/alu/bitwise/mod.rs index 61ae4b1506..3e7227b709 100644 --- a/core/src/alu/bitwise/mod.rs +++ b/core/src/alu/bitwise/mod.rs @@ -28,6 +28,9 @@ pub struct BitwiseCols { /// The shard number, used for byte lookup table. pub shard: T, + /// The channel number, used for byte lookup table. + pub channel: T, + /// The output operand. pub a: Word, @@ -73,6 +76,7 @@ impl MachineAir for BitwiseChip { let c = event.c.to_le_bytes(); cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); cols.a = Word::from(event.a); cols.b = Word::from(event.b); cols.c = Word::from(event.c); @@ -84,6 +88,7 @@ impl MachineAir for BitwiseChip { for ((b_a, b_b), b_c) in a.into_iter().zip(b).zip(c) { let byte_event = ByteLookupEvent { shard: event.shard, + channel: event.channel, opcode: ByteOpcode::from(event.opcode), a1: b_a as u32, a2: 0, @@ -137,7 +142,15 @@ where // Get a multiplicity of `1` only for a true row. let mult = local.is_xor + local.is_or + local.is_and; for ((a, b), c) in local.a.into_iter().zip(local.b).zip(local.c) { - builder.send_byte(opcode.clone(), a, b, c, local.shard, mult.clone()); + builder.send_byte( + opcode.clone(), + a, + b, + c, + local.shard, + local.channel, + mult.clone(), + ); } // Get the cpu opcode, which corresponds to the opcode being sent in the CPU table. @@ -152,6 +165,7 @@ where local.b, local.c, local.shard, + local.channel, local.is_xor + local.is_or + local.is_and, ); @@ -180,7 +194,7 @@ mod tests { #[test] fn generate_trace() { let mut shard = ExecutionRecord::default(); - shard.bitwise_events = vec![AluEvent::new(0, 0, Opcode::XOR, 25, 10, 19)]; + shard.bitwise_events = vec![AluEvent::new(0, 0, 0, Opcode::XOR, 25, 10, 19)]; let chip = BitwiseChip::default(); let trace: RowMajorMatrix = chip.generate_trace(&shard, &mut ExecutionRecord::default()); @@ -194,9 +208,9 @@ mod tests { let mut shard = ExecutionRecord::default(); shard.bitwise_events = [ - AluEvent::new(0, 0, Opcode::XOR, 25, 10, 19), - AluEvent::new(0, 0, Opcode::OR, 27, 10, 19), - AluEvent::new(0, 0, Opcode::AND, 2, 10, 19), + AluEvent::new(0, 0, 0, Opcode::XOR, 25, 10, 19), + AluEvent::new(0, 1, 0, Opcode::OR, 27, 10, 19), + AluEvent::new(0, 0, 0, Opcode::AND, 2, 10, 19), ] .repeat(1000); let chip = BitwiseChip::default(); diff --git a/core/src/alu/divrem/mod.rs b/core/src/alu/divrem/mod.rs index a94cd5d70b..b861f91721 100644 --- a/core/src/alu/divrem/mod.rs +++ b/core/src/alu/divrem/mod.rs @@ -104,6 +104,9 @@ pub struct DivRemCols { /// The shard number, used for byte lookup table. pub shard: T, + /// The channel number, used for byte lookup table. + pub channel: T, + /// The output operand. pub a: Word, @@ -218,6 +221,7 @@ impl MachineAir for DivRemChip { cols.b = Word::from(event.b); cols.c = Word::from(event.c); cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); cols.is_real = F::one(); cols.is_divu = F::from_bool(event.opcode == Opcode::DIVU); cols.is_remu = F::from_bool(event.opcode == Opcode::REMU); @@ -260,6 +264,7 @@ impl MachineAir for DivRemChip { let most_significant_byte = word.to_le_bytes()[WORD_SIZE - 1]; blu_events.push(ByteLookupEvent { shard: event.shard, + channel: event.channel, opcode: ByteOpcode::MSB, a1: get_msb(*word) as u32, a2: 0, @@ -320,6 +325,7 @@ impl MachineAir for DivRemChip { let lower_multiplication = AluEvent { shard: event.shard, + channel: event.channel, clk: event.clk, opcode: Opcode::MUL, a: lower_word, @@ -330,6 +336,7 @@ impl MachineAir for DivRemChip { let upper_multiplication = AluEvent { shard: event.shard, + channel: event.channel, clk: event.clk, opcode: { if is_signed_operation(event.opcode) { @@ -348,6 +355,7 @@ impl MachineAir for DivRemChip { let lt_event = if is_signed_operation(event.opcode) { AluEvent { shard: event.shard, + channel: event.channel, opcode: Opcode::SLT, a: 1, b: (remainder as i32).abs() as u32, @@ -357,6 +365,7 @@ impl MachineAir for DivRemChip { } else { AluEvent { shard: event.shard, + channel: event.channel, opcode: Opcode::SLTU, a: 1, b: remainder, @@ -369,9 +378,13 @@ impl MachineAir for DivRemChip { // Range check. { - output.add_u8_range_checks(event.shard, "ient.to_le_bytes()); - output.add_u8_range_checks(event.shard, &remainder.to_le_bytes()); - output.add_u8_range_checks(event.shard, &c_times_quotient); + output.add_u8_range_checks(event.shard, event.channel, "ient.to_le_bytes()); + output.add_u8_range_checks( + event.shard, + event.channel, + &remainder.to_le_bytes(), + ); + output.add_u8_range_checks(event.shard, event.channel, &c_times_quotient); } } @@ -466,6 +479,7 @@ where local.quotient, local.c, local.shard, + local.channel, local.is_real, ); @@ -490,6 +504,7 @@ where local.quotient, local.c, local.shard, + local.channel, local.is_real, ); } @@ -682,6 +697,7 @@ where local.abs_remainder, local.max_abs_c_or_1, local.shard, + local.channel, local.is_real, ); } @@ -697,20 +713,43 @@ where for msb_pair in msb_pairs.iter() { let msb = msb_pair.0; let byte = msb_pair.1; - builder.send_byte(opcode, msb, byte, zero.clone(), local.shard, local.is_real); + builder.send_byte( + opcode, + msb, + byte, + zero.clone(), + local.shard, + local.channel, + local.is_real, + ); } } // Range check all the bytes. { - builder.slice_range_check_u8(&local.quotient.0, local.shard, local.is_real); - builder.slice_range_check_u8(&local.remainder.0, local.shard, local.is_real); + builder.slice_range_check_u8( + &local.quotient.0, + local.shard, + local.channel, + local.is_real, + ); + builder.slice_range_check_u8( + &local.remainder.0, + local.shard, + local.channel, + local.is_real, + ); local.carry.iter().for_each(|carry| { builder.assert_bool(*carry); }); - builder.slice_range_check_u8(&local.c_times_quotient, local.shard, local.is_real); + builder.slice_range_check_u8( + &local.c_times_quotient, + local.shard, + local.channel, + local.is_real, + ); } // Check that the flags are boolean. @@ -761,6 +800,7 @@ where local.b, local.c, local.shard, + local.channel, local.is_real, ); } @@ -789,7 +829,7 @@ mod tests { #[test] fn generate_trace() { let mut shard = ExecutionRecord::default(); - shard.divrem_events = vec![AluEvent::new(0, 0, Opcode::DIVU, 2, 17, 3)]; + shard.divrem_events = vec![AluEvent::new(0, 0, 0, Opcode::DIVU, 2, 17, 3)]; let chip = DivRemChip::default(); let trace: RowMajorMatrix = chip.generate_trace(&shard, &mut ExecutionRecord::default()); @@ -842,12 +882,12 @@ mod tests { (Opcode::REM, 0, 1 << 31, neg(1)), ]; for t in divrems.iter() { - divrem_events.push(AluEvent::new(0, 0, t.0, t.1, t.2, t.3)); + divrem_events.push(AluEvent::new(0, 9, 0, t.0, t.1, t.2, t.3)); } // Append more events until we have 1000 tests. for _ in 0..(1000 - divrems.len()) { - divrem_events.push(AluEvent::new(0, 0, Opcode::DIVU, 1, 1, 1)); + divrem_events.push(AluEvent::new(0, 0, 0, Opcode::DIVU, 1, 1, 1)); } let mut shard = ExecutionRecord::default(); diff --git a/core/src/alu/lt/mod.rs b/core/src/alu/lt/mod.rs index 7727efc219..91b504181c 100644 --- a/core/src/alu/lt/mod.rs +++ b/core/src/alu/lt/mod.rs @@ -31,6 +31,9 @@ pub struct LtCols { /// The shard number, used for byte lookup table. pub shard: T, + /// The channel number, used for byte lookup table. + pub channel: T, + /// If the opcode is SLT. pub is_slt: T, @@ -116,6 +119,7 @@ impl MachineAir for LtChip { let c = event.c.to_le_bytes(); cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); cols.a = Word(a.map(F::from_canonical_u8)); cols.b = Word(b.map(F::from_canonical_u8)); cols.c = Word(c.map(F::from_canonical_u8)); @@ -129,6 +133,7 @@ impl MachineAir for LtChip { // Send the masked interaction. new_byte_lookup_events.add_byte_lookup_event(ByteLookupEvent { shard: event.shard, + channel: event.channel, opcode: ByteOpcode::AND, a1: masked_b as u32, a2: 0, @@ -137,6 +142,7 @@ impl MachineAir for LtChip { }); new_byte_lookup_events.add_byte_lookup_event(ByteLookupEvent { shard: event.shard, + channel: event.channel, opcode: ByteOpcode::AND, a1: masked_c as u32, a2: 0, @@ -191,6 +197,7 @@ impl MachineAir for LtChip { new_byte_lookup_events.add_byte_lookup_event(ByteLookupEvent { shard: event.shard, + channel: event.channel, opcode: ByteOpcode::LTU, a1: cols.sltu.as_canonical_u32(), a2: 0, @@ -270,6 +277,7 @@ where local.b[3], AB::F::from_canonical_u8(0x7f), local.shard, + local.channel, is_real.clone(), ); builder.send_byte( @@ -278,6 +286,7 @@ where local.c[3], AB::F::from_canonical_u8(0x7f), local.shard, + local.channel, is_real.clone(), ); @@ -398,6 +407,7 @@ where b_comp_byte, c_comp_byte, local.shard, + local.channel, is_real.clone(), ); @@ -420,6 +430,7 @@ where local.b, local.c, local.shard, + local.channel, is_real, ); } @@ -447,7 +458,7 @@ mod tests { #[test] fn generate_trace() { let mut shard = ExecutionRecord::default(); - shard.lt_events = vec![AluEvent::new(0, 0, Opcode::SLT, 0, 3, 2)]; + shard.lt_events = vec![AluEvent::new(0, 1, 0, Opcode::SLT, 0, 3, 2)]; let chip = LtChip::default(); let trace: RowMajorMatrix = chip.generate_trace(&shard, &mut ExecutionRecord::default()); @@ -475,21 +486,21 @@ mod tests { const NEG_4: u32 = 0b11111111111111111111111111111100; shard.lt_events = vec![ // 0 == 3 < 2 - AluEvent::new(0, 0, Opcode::SLT, 0, 3, 2), + AluEvent::new(0, 0, 0, Opcode::SLT, 0, 3, 2), // 1 == 2 < 3 - AluEvent::new(0, 1, Opcode::SLT, 1, 2, 3), + AluEvent::new(0, 0, 1, Opcode::SLT, 1, 2, 3), // 0 == 5 < -3 - AluEvent::new(0, 3, Opcode::SLT, 0, 5, NEG_3), + AluEvent::new(0, 0, 3, Opcode::SLT, 0, 5, NEG_3), // 1 == -3 < 5 - AluEvent::new(0, 2, Opcode::SLT, 1, NEG_3, 5), + AluEvent::new(0, 0, 2, Opcode::SLT, 1, NEG_3, 5), // 0 == -3 < -4 - AluEvent::new(0, 4, Opcode::SLT, 0, NEG_3, NEG_4), + AluEvent::new(0, 0, 4, Opcode::SLT, 0, NEG_3, NEG_4), // 1 == -4 < -3 - AluEvent::new(0, 4, Opcode::SLT, 1, NEG_4, NEG_3), + AluEvent::new(0, 0, 4, Opcode::SLT, 1, NEG_4, NEG_3), // 0 == 3 < 3 - AluEvent::new(0, 5, Opcode::SLT, 0, 3, 3), + AluEvent::new(0, 0, 5, Opcode::SLT, 0, 3, 3), // 0 == -3 < -3 - AluEvent::new(0, 5, Opcode::SLT, 0, NEG_3, NEG_3), + AluEvent::new(0, 0, 5, Opcode::SLT, 0, NEG_3, NEG_3), ]; prove_babybear_template(&mut shard); @@ -502,17 +513,17 @@ mod tests { const LARGE: u32 = 0b11111111111111111111111111111101; shard.lt_events = vec![ // 0 == 3 < 2 - AluEvent::new(0, 0, Opcode::SLTU, 0, 3, 2), + AluEvent::new(0, 0, 0, Opcode::SLTU, 0, 3, 2), // 1 == 2 < 3 - AluEvent::new(0, 1, Opcode::SLTU, 1, 2, 3), + AluEvent::new(0, 0, 1, Opcode::SLTU, 1, 2, 3), // 0 == LARGE < 5 - AluEvent::new(0, 2, Opcode::SLTU, 0, LARGE, 5), + AluEvent::new(0, 0, 2, Opcode::SLTU, 0, LARGE, 5), // 1 == 5 < LARGE - AluEvent::new(0, 3, Opcode::SLTU, 1, 5, LARGE), + AluEvent::new(0, 0, 3, Opcode::SLTU, 1, 5, LARGE), // 0 == 0 < 0 - AluEvent::new(0, 5, Opcode::SLTU, 0, 0, 0), + AluEvent::new(0, 0, 5, Opcode::SLTU, 0, 0, 0), // 0 == LARGE < LARGE - AluEvent::new(0, 5, Opcode::SLTU, 0, LARGE, LARGE), + AluEvent::new(0, 0, 5, Opcode::SLTU, 0, LARGE, LARGE), ]; prove_babybear_template(&mut shard); diff --git a/core/src/alu/mod.rs b/core/src/alu/mod.rs index 1f780988b3..c667c612c8 100644 --- a/core/src/alu/mod.rs +++ b/core/src/alu/mod.rs @@ -24,6 +24,9 @@ pub struct AluEvent { /// The shard number, used for byte lookup table. pub shard: u32, + /// The channel number, used for byte lookup table. + pub channel: u32, + /// The clock cycle that the operation occurs on. pub clk: u32, @@ -42,9 +45,10 @@ pub struct AluEvent { impl AluEvent { /// Creates a new `AluEvent`. - pub fn new(shard: u32, clk: u32, opcode: Opcode, a: u32, b: u32, c: u32) -> Self { + pub fn new(shard: u32, channel: u32, clk: u32, opcode: Opcode, a: u32, b: u32, c: u32) -> Self { Self { shard, + channel, clk, opcode, a, diff --git a/core/src/alu/mul/mod.rs b/core/src/alu/mul/mod.rs index 32a15fef94..c30a59c4f4 100644 --- a/core/src/alu/mul/mod.rs +++ b/core/src/alu/mul/mod.rs @@ -76,6 +76,9 @@ pub struct MulCols { /// The shard number, used for byte lookup table. pub shard: T, + /// The channel number, used for byte lookup table. + pub channel: T, + /// The output operand. pub a: Word, @@ -191,6 +194,7 @@ impl MachineAir for MulChip { let most_significant_byte = word[WORD_SIZE - 1]; blu_events.push(ByteLookupEvent { shard: event.shard, + channel: event.channel, opcode: ByteOpcode::MSB, a1: get_msb(*word) as u32, a2: 0, @@ -234,11 +238,16 @@ impl MachineAir for MulChip { cols.is_mulhu = F::from_bool(event.opcode == Opcode::MULHU); cols.is_mulhsu = F::from_bool(event.opcode == Opcode::MULHSU); cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); // Range check. { - record.add_u16_range_checks(event.shard, &carry); - record.add_u8_range_checks(event.shard, &product.map(|x| x as u8)); + record.add_u16_range_checks(event.shard, event.channel, &carry); + record.add_u8_range_checks( + event.shard, + event.channel, + &product.map(|x| x as u8), + ); } row }) @@ -299,7 +308,15 @@ where for msb_pair in msb_pairs.iter() { let msb = msb_pair.0; let byte = msb_pair.1; - builder.send_byte(opcode, msb, byte, zero.clone(), local.shard, local.is_real); + builder.send_byte( + opcode, + msb, + byte, + zero.clone(), + local.shard, + local.channel, + local.is_real, + ); } (local.b_msb, local.c_msb) }; @@ -425,9 +442,9 @@ where // Ensure that the carry is at most 2^16. This ensures that // product_before_carry_propagation - carry * base + last_carry never overflows or // underflows enough to "wrap" around to create a second solution. - builder.slice_range_check_u16(&local.carry, local.shard, local.is_real); + builder.slice_range_check_u16(&local.carry, local.shard, local.channel, local.is_real); - builder.slice_range_check_u8(&local.product, local.shard, local.is_real); + builder.slice_range_check_u8(&local.product, local.shard, local.channel, local.is_real); } // Receive the arguments. @@ -437,6 +454,7 @@ where local.b, local.c, local.shard, + local.channel, local.is_real, ); } @@ -469,6 +487,7 @@ mod tests { let mut mul_events: Vec = Vec::new(); for _ in 0..10i32.pow(7) { mul_events.push(AluEvent::new( + 0, 0, 0, Opcode::MULHSU, @@ -544,12 +563,12 @@ mod tests { (Opcode::MULH, 0xffffffff, 0x00000001, 0xffffffff), ]; for t in mul_instructions.iter() { - mul_events.push(AluEvent::new(0, 0, t.0, t.1, t.2, t.3)); + mul_events.push(AluEvent::new(0, 0, 0, t.0, t.1, t.2, t.3)); } // Append more events until we have 1000 tests. for _ in 0..(1000 - mul_instructions.len()) { - mul_events.push(AluEvent::new(0, 0, Opcode::MUL, 1, 1, 1)); + mul_events.push(AluEvent::new(0, 0, 0, Opcode::MUL, 1, 1, 1)); } shard.mul_events = mul_events; diff --git a/core/src/alu/sll/mod.rs b/core/src/alu/sll/mod.rs index ec0f185fe2..d87ee780d6 100644 --- a/core/src/alu/sll/mod.rs +++ b/core/src/alu/sll/mod.rs @@ -64,6 +64,9 @@ pub struct ShiftLeftCols { /// The shard number, used for byte lookup table. pub shard: T, + /// The channel number, used for byte lookup table. + pub channel: T, + /// The output operand. pub a: Word, @@ -118,6 +121,7 @@ impl MachineAir for ShiftLeft { let b = event.b.to_le_bytes(); let c = event.c.to_le_bytes(); cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); cols.a = Word(a.map(F::from_canonical_u8)); cols.b = Word(b.map(F::from_canonical_u8)); cols.c = Word(c.map(F::from_canonical_u8)); @@ -156,8 +160,8 @@ impl MachineAir for ShiftLeft { // Range checks. { - output.add_u8_range_checks(event.shard, &bit_shift_result); - output.add_u8_range_checks(event.shard, &bit_shift_result_carry); + output.add_u8_range_checks(event.shard, event.channel, &bit_shift_result); + output.add_u8_range_checks(event.shard, event.channel, &bit_shift_result_carry); } // Sanity check. @@ -314,8 +318,18 @@ where // Range check. { - builder.slice_range_check_u8(&local.bit_shift_result, local.shard, local.is_real); - builder.slice_range_check_u8(&local.bit_shift_result_carry, local.shard, local.is_real); + builder.slice_range_check_u8( + &local.bit_shift_result, + local.shard, + local.channel, + local.is_real, + ); + builder.slice_range_check_u8( + &local.bit_shift_result_carry, + local.shard, + local.channel, + local.is_real, + ); } for shift in local.shift_by_n_bytes.iter() { @@ -339,6 +353,7 @@ where local.b, local.c, local.shard, + local.channel, local.is_real, ); } @@ -366,7 +381,7 @@ mod tests { #[test] fn generate_trace() { let mut shard = ExecutionRecord::default(); - shard.shift_left_events = vec![AluEvent::new(0, 0, Opcode::SLL, 16, 8, 1)]; + shard.shift_left_events = vec![AluEvent::new(0, 0, 0, Opcode::SLL, 16, 8, 1)]; let chip = ShiftLeft::default(); let trace: RowMajorMatrix = chip.generate_trace(&shard, &mut ExecutionRecord::default()); @@ -401,7 +416,7 @@ mod tests { (Opcode::SLL, 0x00000000, 0x21212120, 0xffffffff), ]; for t in shift_instructions.iter() { - shift_events.push(AluEvent::new(0, 0, t.0, t.1, t.2, t.3)); + shift_events.push(AluEvent::new(0, 0, 0, t.0, t.1, t.2, t.3)); } // Append more events until we have 1000 tests. diff --git a/core/src/alu/sr/mod.rs b/core/src/alu/sr/mod.rs index f31bf7ee5a..892ad7a8ab 100644 --- a/core/src/alu/sr/mod.rs +++ b/core/src/alu/sr/mod.rs @@ -82,6 +82,9 @@ pub struct ShiftRightCols { /// The shard number, used for byte lookup table. pub shard: T, + /// The channel number, used for byte lookup table. + pub channel: T, + /// The output operand. pub a: Word, @@ -149,6 +152,7 @@ impl MachineAir for ShiftRightChip { // Initialize cols with basic operands and flags derived from the current event. { cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); cols.a = Word::from(event.a); cols.b = Word::from(event.b); cols.c = Word::from(event.c); @@ -168,6 +172,7 @@ impl MachineAir for ShiftRightChip { let most_significant_byte = event.b.to_le_bytes()[WORD_SIZE - 1]; output.add_byte_lookup_events(vec![ByteLookupEvent { shard: event.shard, + channel: event.channel, opcode: ByteOpcode::MSB, a1: ((most_significant_byte >> 7) & 1) as u32, a2: 0, @@ -217,6 +222,7 @@ impl MachineAir for ShiftRightChip { let byte_event = ByteLookupEvent { shard: event.shard, + channel: event.channel, opcode: ByteOpcode::ShrCarry, a1: shift as u32, a2: carry as u32, @@ -239,10 +245,14 @@ impl MachineAir for ShiftRightChip { debug_assert_eq!(cols.a[i], cols.bit_shift_result[i].clone()); } // Range checks. - output.add_u8_range_checks(event.shard, &byte_shift_result); - output.add_u8_range_checks(event.shard, &bit_shift_result); - output.add_u8_range_checks(event.shard, &shr_carry_output_carry); - output.add_u8_range_checks(event.shard, &shr_carry_output_shifted_byte); + output.add_u8_range_checks(event.shard, event.channel, &byte_shift_result); + output.add_u8_range_checks(event.shard, event.channel, &bit_shift_result); + output.add_u8_range_checks(event.shard, event.channel, &shr_carry_output_carry); + output.add_u8_range_checks( + event.shard, + event.channel, + &shr_carry_output_shifted_byte, + ); } rows.push(row); @@ -303,7 +313,15 @@ where let byte = local.b[WORD_SIZE - 1]; let opcode = AB::F::from_canonical_u32(ByteOpcode::MSB as u32); let msb = local.b_msb; - builder.send_byte(opcode, msb, byte, zero.clone(), local.shard, local.is_real); + builder.send_byte( + opcode, + msb, + byte, + zero.clone(), + local.shard, + local.channel, + local.is_real, + ); } // Calculate the number of bits and bytes to shift by from c. @@ -411,6 +429,7 @@ where local.byte_shift_result[i], num_bits_to_shift.clone(), local.shard, + local.channel, local.is_real, ); } @@ -457,7 +476,7 @@ where ]; for long_word in long_words.iter() { - builder.slice_range_check_u8(long_word, local.shard, local.is_real); + builder.slice_range_check_u8(long_word, local.shard, local.channel, local.is_real); } } @@ -478,6 +497,7 @@ where local.b, local.c, local.shard, + local.channel, local.is_real, ); } @@ -504,7 +524,7 @@ mod tests { #[test] fn generate_trace() { let mut shard = ExecutionRecord::default(); - shard.shift_right_events = vec![AluEvent::new(0, 0, Opcode::SRL, 6, 12, 1)]; + shard.shift_right_events = vec![AluEvent::new(0, 0, 0, Opcode::SRL, 6, 12, 1)]; let chip = ShiftRightChip::default(); let trace: RowMajorMatrix = chip.generate_trace(&shard, &mut ExecutionRecord::default()); @@ -555,7 +575,7 @@ mod tests { ]; let mut shift_events: Vec = Vec::new(); for t in shifts.iter() { - shift_events.push(AluEvent::new(0, 0, t.0, t.1, t.2, t.3)); + shift_events.push(AluEvent::new(0, 0, 0, t.0, t.1, t.2, t.3)); } let mut shard = ExecutionRecord::default(); shard.shift_right_events = shift_events; diff --git a/core/src/bytes/air.rs b/core/src/bytes/air.rs index 712ff1b43e..69d2ba82fe 100644 --- a/core/src/bytes/air.rs +++ b/core/src/bytes/air.rs @@ -7,7 +7,7 @@ use p3_field::Field; use p3_matrix::Matrix; use super::columns::{ByteMultCols, BytePreprocessedCols, NUM_BYTE_MULT_COLS}; -use super::{ByteChip, ByteOpcode}; +use super::{ByteChip, ByteOpcode, NUM_BYTE_LOOKUP_CHANNELS}; use crate::air::SP1AirBuilder; impl BaseAir for ByteChip { @@ -27,49 +27,66 @@ impl Air for ByteChip { let local: &BytePreprocessedCols = (*prep).borrow(); // Send all the lookups for each operation. - for (i, opcode) in ByteOpcode::all().iter().enumerate() { - let field_op = opcode.as_field::(); - let mult = local_mult.multiplicities[i]; - let shard = local_mult.shard; - match opcode { - ByteOpcode::AND => { - builder.receive_byte(field_op, local.and, local.b, local.c, shard, mult) + for channel in 0..NUM_BYTE_LOOKUP_CHANNELS { + let channel_f = AB::F::from_canonical_u32(channel); + let channel = channel as usize; + for (i, opcode) in ByteOpcode::all().iter().enumerate() { + let field_op = opcode.as_field::(); + let mult = local_mult.mult_channels[channel].multiplicities[i]; + let shard = local_mult.shard; + match opcode { + ByteOpcode::AND => builder.receive_byte( + field_op, local.and, local.b, local.c, shard, channel_f, mult, + ), + ByteOpcode::OR => builder + .receive_byte(field_op, local.or, local.b, local.c, shard, channel_f, mult), + ByteOpcode::XOR => builder.receive_byte( + field_op, local.xor, local.b, local.c, shard, channel_f, mult, + ), + ByteOpcode::SLL => builder.receive_byte( + field_op, local.sll, local.b, local.c, shard, channel_f, mult, + ), + ByteOpcode::U8Range => builder.receive_byte( + field_op, + AB::F::zero(), + local.b, + local.c, + shard, + channel_f, + mult, + ), + ByteOpcode::ShrCarry => builder.receive_byte_pair( + field_op, + local.shr, + local.shr_carry, + local.b, + local.c, + shard, + channel_f, + mult, + ), + ByteOpcode::LTU => builder.receive_byte( + field_op, local.ltu, local.b, local.c, shard, channel_f, mult, + ), + ByteOpcode::MSB => builder.receive_byte( + field_op, + local.msb, + local.b, + AB::F::zero(), + shard, + channel_f, + mult, + ), + ByteOpcode::U16Range => builder.receive_byte( + field_op, + local.value_u16, + AB::F::zero(), + AB::F::zero(), + shard, + channel_f, + mult, + ), } - ByteOpcode::OR => { - builder.receive_byte(field_op, local.or, local.b, local.c, shard, mult) - } - ByteOpcode::XOR => { - builder.receive_byte(field_op, local.xor, local.b, local.c, shard, mult) - } - ByteOpcode::SLL => { - builder.receive_byte(field_op, local.sll, local.b, local.c, shard, mult) - } - ByteOpcode::U8Range => { - builder.receive_byte(field_op, AB::F::zero(), local.b, local.c, shard, mult) - } - ByteOpcode::ShrCarry => builder.receive_byte_pair( - field_op, - local.shr, - local.shr_carry, - local.b, - local.c, - shard, - mult, - ), - ByteOpcode::LTU => { - builder.receive_byte(field_op, local.ltu, local.b, local.c, shard, mult) - } - ByteOpcode::MSB => { - builder.receive_byte(field_op, local.msb, local.b, AB::F::zero(), shard, mult) - } - ByteOpcode::U16Range => builder.receive_byte( - field_op, - local.value_u16, - AB::F::zero(), - AB::F::zero(), - shard, - mult, - ), } } } diff --git a/core/src/bytes/columns.rs b/core/src/bytes/columns.rs index 4524bec8bf..7134331f63 100644 --- a/core/src/bytes/columns.rs +++ b/core/src/bytes/columns.rs @@ -1,7 +1,7 @@ use sp1_derive::AlignedBorrow; use std::mem::size_of; -use super::NUM_BYTE_OPS; +use super::{NUM_BYTE_LOOKUP_CHANNELS, NUM_BYTE_OPS}; /// The number of main trace columns for `ByteChip`. pub const NUM_BYTE_PREPROCESSED_COLS: usize = size_of::>(); @@ -44,6 +44,14 @@ pub struct BytePreprocessedCols { pub value_u16: T, } +/// For each byte operation in the preprocessed table, a corresponding ByteMultCols row tracks the +/// number of times the operation is used. +#[derive(Debug, Clone, Copy, AlignedBorrow)] +#[repr(C)] +pub struct MultiplicitiesCols { + pub multiplicities: [T; NUM_BYTE_OPS], +} + /// For each byte operation in the preprocessed table, a corresponding ByteMultCols row tracks the /// number of times the operation is used. #[derive(Debug, Clone, Copy, AlignedBorrow)] @@ -53,5 +61,5 @@ pub struct ByteMultCols { pub shard: T, /// The multiplicites of each byte operation. - pub multiplicities: [T; NUM_BYTE_OPS], + pub mult_channels: [MultiplicitiesCols; NUM_BYTE_LOOKUP_CHANNELS as usize], } diff --git a/core/src/bytes/event.rs b/core/src/bytes/event.rs index 719b4542a4..f45c80cfe8 100644 --- a/core/src/bytes/event.rs +++ b/core/src/bytes/event.rs @@ -11,6 +11,9 @@ pub struct ByteLookupEvent { /// The shard number, used for byte lookup table. pub shard: u32, + // The channel multiplicity identifier. + pub channel: u32, + /// The opcode of the operation. pub opcode: ByteOpcode, @@ -40,9 +43,10 @@ pub trait ByteRecord { } /// Adds a `ByteLookupEvent` to verify `a` and `b are indeed bytes to the shard. - fn add_u8_range_check(&mut self, shard: u32, a: u8, b: u8) { + fn add_u8_range_check(&mut self, shard: u32, channel: u32, a: u8, b: u8) { self.add_byte_lookup_event(ByteLookupEvent { shard, + channel, opcode: ByteOpcode::U8Range, a1: 0, a2: 0, @@ -52,9 +56,10 @@ pub trait ByteRecord { } /// Adds a `ByteLookupEvent` to verify `a` is indeed u16. - fn add_u16_range_check(&mut self, shard: u32, a: u32) { + fn add_u16_range_check(&mut self, shard: u32, channel: u32, a: u32) { self.add_byte_lookup_event(ByteLookupEvent { shard, + channel, opcode: ByteOpcode::U16Range, a1: a, a2: 0, @@ -64,23 +69,29 @@ pub trait ByteRecord { } /// Adds `ByteLookupEvent`s to verify that all the bytes in the input slice are indeed bytes. - fn add_u8_range_checks(&mut self, shard: u32, bytes: &[u8]) { + fn add_u8_range_checks(&mut self, shard: u32, channel: u32, bytes: &[u8]) { let mut index = 0; while index + 1 < bytes.len() { - self.add_u8_range_check(shard, bytes[index], bytes[index + 1]); + self.add_u8_range_check(shard, channel, bytes[index], bytes[index + 1]); index += 2; } if index < bytes.len() { // If the input slice's length is odd, we need to add a check for the last byte. - self.add_u8_range_check(shard, bytes[index], 0); + self.add_u8_range_check(shard, channel, bytes[index], 0); } } /// Adds `ByteLookupEvent`s to verify that all the field elements in the input slice are indeed /// bytes. - fn add_u8_range_checks_field(&mut self, shard: u32, field_values: &[F]) { + fn add_u8_range_checks_field( + &mut self, + shard: u32, + channel: u32, + field_values: &[F], + ) { self.add_u8_range_checks( shard, + channel, &field_values .iter() .map(|x| x.as_canonical_u32() as u8) @@ -89,14 +100,16 @@ pub trait ByteRecord { } /// Adds `ByteLookupEvent`s to verify that all the bytes in the input slice are indeed bytes. - fn add_u16_range_checks(&mut self, shard: u32, ls: &[u32]) { - ls.iter().for_each(|x| self.add_u16_range_check(shard, *x)); + fn add_u16_range_checks(&mut self, shard: u32, channel: u32, ls: &[u32]) { + ls.iter() + .for_each(|x| self.add_u16_range_check(shard, channel, *x)); } /// Adds a `ByteLookupEvent` to compute the bitwise OR of the two input values. - fn lookup_or(&mut self, shard: u32, b: u8, c: u8) { + fn lookup_or(&mut self, shard: u32, channel: u32, b: u8, c: u8) { self.add_byte_lookup_event(ByteLookupEvent { shard, + channel, opcode: ByteOpcode::OR, a1: (b | c) as u32, a2: 0, @@ -108,9 +121,18 @@ pub trait ByteRecord { impl ByteLookupEvent { /// Creates a new `ByteLookupEvent`. - pub fn new(shard: u32, opcode: ByteOpcode, a1: u32, a2: u32, b: u32, c: u32) -> Self { + pub fn new( + shard: u32, + channel: u32, + opcode: ByteOpcode, + a1: u32, + a2: u32, + b: u32, + c: u32, + ) -> Self { Self { shard, + channel, opcode, a1, a2, diff --git a/core/src/bytes/mod.rs b/core/src/bytes/mod.rs index 411b065d1a..f6d5bc482c 100644 --- a/core/src/bytes/mod.rs +++ b/core/src/bytes/mod.rs @@ -23,6 +23,9 @@ use crate::bytes::trace::NUM_ROWS; /// The number of different byte operations. pub const NUM_BYTE_OPS: usize = 9; +/// The number of different byte lookup channels. +pub const NUM_BYTE_LOOKUP_CHANNELS: u32 = 4; + /// A chip for computing byte operations. /// /// The chip contains a preprocessed table of all possible byte operations. Other chips can then @@ -64,61 +67,76 @@ impl ByteChip { col.c = F::from_canonical_u8(c); // Iterate over all operations for results and updating the table map. - for (i, opcode) in opcodes.iter().enumerate() { - let event = match opcode { - ByteOpcode::AND => { - let and = b & c; - col.and = F::from_canonical_u8(and); - ByteLookupEvent::new(shard, *opcode, and as u32, 0, b as u32, c as u32) - } - ByteOpcode::OR => { - let or = b | c; - col.or = F::from_canonical_u8(or); - ByteLookupEvent::new(shard, *opcode, or as u32, 0, b as u32, c as u32) - } - ByteOpcode::XOR => { - let xor = b ^ c; - col.xor = F::from_canonical_u8(xor); - ByteLookupEvent::new(shard, *opcode, xor as u32, 0, b as u32, c as u32) - } - ByteOpcode::SLL => { - let sll = b << (c & 7); - col.sll = F::from_canonical_u8(sll); - ByteLookupEvent::new(shard, *opcode, sll as u32, 0, b as u32, c as u32) - } - ByteOpcode::U8Range => { - ByteLookupEvent::new(shard, *opcode, 0, 0, b as u32, c as u32) - } - ByteOpcode::ShrCarry => { - let (res, carry) = shr_carry(b, c); - col.shr = F::from_canonical_u8(res); - col.shr_carry = F::from_canonical_u8(carry); - ByteLookupEvent::new( - shard, - *opcode, - res as u32, - carry as u32, - b as u32, - c as u32, - ) - } - ByteOpcode::LTU => { - let ltu = b < c; - col.ltu = F::from_bool(ltu); - ByteLookupEvent::new(shard, *opcode, ltu as u32, 0, b as u32, c as u32) - } - ByteOpcode::MSB => { - let msb = (b & 0b1000_0000) != 0; - col.msb = F::from_bool(msb); - ByteLookupEvent::new(shard, *opcode, msb as u32, 0, b as u32, 0 as u32) - } - ByteOpcode::U16Range => { - let v = ((b as u32) << 8) + c as u32; - col.value_u16 = F::from_canonical_u32(v); - ByteLookupEvent::new(shard, *opcode, v, 0, 0, 0) - } - }; - event_map.insert(event, (row_index, i)); + for channel in 0..NUM_BYTE_LOOKUP_CHANNELS { + for (i, opcode) in opcodes.iter().enumerate() { + let event = match opcode { + ByteOpcode::AND => { + let and = b & c; + col.and = F::from_canonical_u8(and); + ByteLookupEvent::new( + shard, channel, *opcode, and as u32, 0, b as u32, c as u32, + ) + } + ByteOpcode::OR => { + let or = b | c; + col.or = F::from_canonical_u8(or); + ByteLookupEvent::new( + shard, channel, *opcode, or as u32, 0, b as u32, c as u32, + ) + } + ByteOpcode::XOR => { + let xor = b ^ c; + col.xor = F::from_canonical_u8(xor); + ByteLookupEvent::new( + shard, channel, *opcode, xor as u32, 0, b as u32, c as u32, + ) + } + ByteOpcode::SLL => { + let sll = b << (c & 7); + col.sll = F::from_canonical_u8(sll); + ByteLookupEvent::new( + shard, channel, *opcode, sll as u32, 0, b as u32, c as u32, + ) + } + ByteOpcode::U8Range => { + ByteLookupEvent::new(shard, channel, *opcode, 0, 0, b as u32, c as u32) + } + ByteOpcode::ShrCarry => { + let (res, carry) = shr_carry(b, c); + col.shr = F::from_canonical_u8(res); + col.shr_carry = F::from_canonical_u8(carry); + ByteLookupEvent::new( + shard, + channel, + *opcode, + res as u32, + carry as u32, + b as u32, + c as u32, + ) + } + ByteOpcode::LTU => { + let ltu = b < c; + col.ltu = F::from_bool(ltu); + ByteLookupEvent::new( + shard, channel, *opcode, ltu as u32, 0, b as u32, c as u32, + ) + } + ByteOpcode::MSB => { + let msb = (b & 0b1000_0000) != 0; + col.msb = F::from_bool(msb); + ByteLookupEvent::new( + shard, channel, *opcode, msb as u32, 0, b as u32, 0 as u32, + ) + } + ByteOpcode::U16Range => { + let v = ((b as u32) << 8) + c as u32; + col.value_u16 = F::from_canonical_u32(v); + ByteLookupEvent::new(shard, channel, *opcode, v, 0, 0, 0) + } + }; + event_map.insert(event, (row_index, i)); + } } } diff --git a/core/src/bytes/trace.rs b/core/src/bytes/trace.rs index 22b8204208..39f2b72ff5 100644 --- a/core/src/bytes/trace.rs +++ b/core/src/bytes/trace.rs @@ -54,10 +54,11 @@ impl MachineAir for ByteChip { for (lookup, mult) in input.byte_lookups[&shard].iter() { let (row, index) = event_map[lookup]; + let channel = lookup.channel as usize; let cols: &mut ByteMultCols = trace.row_mut(row).borrow_mut(); // Update the trace multiplicity - cols.multiplicities[index] += F::from_canonical_usize(*mult); + cols.mult_channels[channel].multiplicities[index] += F::from_canonical_usize(*mult); // Set the shard column as the current shard. cols.shard = F::from_canonical_u32(shard); diff --git a/core/src/cpu/air/branch.rs b/core/src/cpu/air/branch.rs index 56d5faf5ef..fad654de35 100644 --- a/core/src/cpu/air/branch.rs +++ b/core/src/cpu/air/branch.rs @@ -64,6 +64,7 @@ impl CpuChip { branch_cols.pc, local.op_c_val(), local.shard, + local.channel, local.branching, ); @@ -155,6 +156,7 @@ impl CpuChip { local.op_a_val(), local.op_b_val(), local.shard, + local.channel, is_branch_instruction.clone(), ); @@ -166,6 +168,7 @@ impl CpuChip { local.op_b_val(), local.op_a_val(), local.shard, + local.channel, is_branch_instruction.clone(), ); } diff --git a/core/src/cpu/air/ecall.rs b/core/src/cpu/air/ecall.rs index 32c2d8a47f..506b2c7b75 100644 --- a/core/src/cpu/air/ecall.rs +++ b/core/src/cpu/air/ecall.rs @@ -41,6 +41,7 @@ impl CpuChip { .assert_eq(send_to_table, local.ecall_mul_send_to_table); builder.send_syscall( local.shard, + local.channel, local.clk, syscall_id, local.op_b_val().reduce::(), diff --git a/core/src/cpu/air/memory.rs b/core/src/cpu/air/memory.rs index eb4404828e..6ac1a07c11 100644 --- a/core/src/cpu/air/memory.rs +++ b/core/src/cpu/air/memory.rs @@ -65,6 +65,7 @@ impl CpuChip { local.op_b_val(), local.op_c_val(), local.shard, + local.channel, is_memory_instruction.clone(), ); @@ -72,6 +73,7 @@ impl CpuChip { builder.slice_range_check_u8( &memory_columns.addr_word.0, local.shard, + local.channel, is_memory_instruction.clone(), ); @@ -90,6 +92,7 @@ impl CpuChip { // value into the memory columns. builder.eval_memory_access( local.shard, + local.channel, local.clk + AB::F::from_canonical_u32(MemoryAccessPosition::Memory as u32), memory_columns.addr_aligned, &memory_columns.memory_access, @@ -139,6 +142,7 @@ impl CpuChip { local.unsigned_mem_val, signed_value, local.shard, + local.channel, local.mem_value_is_neg, ); diff --git a/core/src/cpu/air/mod.rs b/core/src/cpu/air/mod.rs index 75742f8616..11a985bb5e 100644 --- a/core/src/cpu/air/mod.rs +++ b/core/src/cpu/air/mod.rs @@ -24,6 +24,8 @@ use crate::cpu::columns::{CpuCols, NUM_CPU_COLS}; use crate::cpu::CpuChip; use crate::runtime::Opcode; +use super::columns::eval_channel_selectors; + impl Air for CpuChip where AB: SP1AirBuilder + AirBuilderWithPublicValues, @@ -64,6 +66,16 @@ where self.eval_memory_load::(builder, local); self.eval_memory_store::(builder, local); + // Channel constraints. + eval_channel_selectors( + builder, + &local.channel_selectors, + &next.channel_selectors, + local.channel, + local.is_real, + next.is_real, + ); + // ALU instructions. builder.send_alu( local.instruction.opcode, @@ -71,6 +83,7 @@ where local.op_b_val(), local.op_c_val(), local.shard, + local.channel, is_alu_instruction, ); @@ -169,6 +182,7 @@ impl CpuChip { jump_columns.pc, local.op_b_val(), local.shard, + local.channel, local.selectors.is_jal, ); @@ -179,6 +193,7 @@ impl CpuChip { local.op_b_val(), local.op_c_val(), local.shard, + local.channel, local.selectors.is_jalr, ); } @@ -200,6 +215,7 @@ impl CpuChip { auipc_columns.pc, local.op_b_val(), local.shard, + local.channel, local.selectors.is_auipc, ); } @@ -229,6 +245,7 @@ impl CpuChip { AB::Expr::zero(), AB::Expr::zero(), local.shard, + local.channel, local.is_real, ); @@ -255,6 +272,7 @@ impl CpuChip { local.clk_16bit_limb, local.clk_8bit_limb, local.shard, + local.channel, local.is_real, ); } diff --git a/core/src/cpu/air/register.rs b/core/src/cpu/air/register.rs index 14541c48b9..e0b989c2bc 100644 --- a/core/src/cpu/air/register.rs +++ b/core/src/cpu/air/register.rs @@ -25,6 +25,7 @@ impl CpuChip { // If they are not immediates, read `b` and `c` from memory. builder.eval_memory_access( local.shard, + local.channel, local.clk + AB::F::from_canonical_u32(MemoryAccessPosition::B as u32), local.instruction.op_b[0], &local.op_b_access, @@ -33,6 +34,7 @@ impl CpuChip { builder.eval_memory_access( local.shard, + local.channel, local.clk + AB::F::from_canonical_u32(MemoryAccessPosition::C as u32), local.instruction.op_c[0], &local.op_c_access, @@ -48,6 +50,7 @@ impl CpuChip { // we are performing a branch or a store. builder.eval_memory_access( local.shard, + local.channel, local.clk + AB::F::from_canonical_u32(MemoryAccessPosition::A as u32), local.instruction.op_a[0], &local.op_a_access, diff --git a/core/src/cpu/columns/channel.rs b/core/src/cpu/columns/channel.rs new file mode 100644 index 0000000000..9bd6a4ef78 --- /dev/null +++ b/core/src/cpu/columns/channel.rs @@ -0,0 +1,65 @@ +use p3_air::AirBuilder; +use p3_field::AbstractField; +use p3_field::Field; +use sp1_derive::AlignedBorrow; + +use crate::{bytes::NUM_BYTE_LOOKUP_CHANNELS, stark::SP1AirBuilder}; + +#[derive(AlignedBorrow, Default, Debug, Clone, Copy)] +#[repr(C)] +pub struct ChannelSelectorCols { + pub channel_selectors: [T; NUM_BYTE_LOOKUP_CHANNELS as usize], +} + +impl ChannelSelectorCols { + pub fn populate(&mut self, channel: u32) { + self.channel_selectors = [F::zero(); NUM_BYTE_LOOKUP_CHANNELS as usize]; + self.channel_selectors[channel as usize] = F::one(); + } +} + +pub fn eval_channel_selectors( + builder: &mut AB, + local: &ChannelSelectorCols, + next: &ChannelSelectorCols, + channel: impl Into + Clone, + local_is_real: impl Into + Clone, + next_is_real: impl Into + Clone, +) { + // Constrain: + // - the value of the channel is given by the channel selectors. + // - all selectors are boolean and disjoint. + let mut sum = AB::Expr::zero(); + let mut reconstruct_channel = AB::Expr::zero(); + for (i, selector) in local.channel_selectors.into_iter().enumerate() { + // Constrain that the selector is boolean. + builder.assert_bool(selector); + // Accumulate the sum of the selectors. + sum += selector.into(); + // Accumulate the reconstructed channel. + reconstruct_channel += selector.into() * AB::Expr::from_canonical_u32(i as u32); + } + // Assert that the reconstructed channel is the same as the channel. + builder.assert_eq(reconstruct_channel, channel.clone()); + // For disjointness, assert the sum of the selectors is 1. + builder + .when(local_is_real.clone()) + .assert_eq(sum, AB::Expr::one()); + + // Constrain the first row by asserting that the first selector on the first line is true. + builder + .when_first_row() + .assert_one(local.channel_selectors[0]); + + // Constrain the transition by asserting that the selectors satisfy the recursion relation: + // selectors_next[(i + 1) % NUM_BYTE_LOOKUP_CHANNELS] = selectors[i] + for i in 0..NUM_BYTE_LOOKUP_CHANNELS as usize { + builder + .when_transition() + .when(next_is_real.clone()) + .assert_eq( + local.channel_selectors[i], + next.channel_selectors[(i + 1) % NUM_BYTE_LOOKUP_CHANNELS as usize], + ); + } +} diff --git a/core/src/cpu/columns/mod.rs b/core/src/cpu/columns/mod.rs index e40f30518e..d81bd806fc 100644 --- a/core/src/cpu/columns/mod.rs +++ b/core/src/cpu/columns/mod.rs @@ -1,5 +1,6 @@ mod auipc; mod branch; +mod channel; mod ecall; mod instruction; mod jump; @@ -9,6 +10,7 @@ mod opcode_specific; pub use auipc::*; pub use branch::*; +pub use channel::*; pub use ecall::*; pub use instruction::*; pub use jump::*; @@ -35,6 +37,8 @@ pub const CPU_COL_MAP: CpuCols = make_col_map(); pub struct CpuCols { /// The current shard. pub shard: T, + /// The channel value, used for byte lookup multiplicity. + pub channel: T, /// The clock cycle value. This should be within 24 bits. pub clk: T, @@ -52,6 +56,9 @@ pub struct CpuCols { /// Columns related to the instruction. pub instruction: InstructionCols, + /// Columns related to the byte lookup channel. + pub channel_selectors: ChannelSelectorCols, + /// Selectors for the opcode. pub selectors: OpcodeSelectorCols, diff --git a/core/src/cpu/event.rs b/core/src/cpu/event.rs index 8baa8fb730..2170d91d5d 100644 --- a/core/src/cpu/event.rs +++ b/core/src/cpu/event.rs @@ -9,6 +9,9 @@ pub struct CpuEvent { /// The current shard. pub shard: u32, + /// The current channel. + pub channel: u32, + /// The current clock. pub clk: u32, diff --git a/core/src/cpu/trace.rs b/core/src/cpu/trace.rs index 7000fe0624..aa71f130f5 100644 --- a/core/src/cpu/trace.rs +++ b/core/src/cpu/trace.rs @@ -149,13 +149,16 @@ impl CpuChip { // Populate memory accesses for a, b, and c. if let Some(record) = event.a_record { - cols.op_a_access.populate(record, &mut new_blu_events) + cols.op_a_access + .populate(event.channel, record, &mut new_blu_events) } if let Some(MemoryRecordEnum::Read(record)) = event.b_record { - cols.op_b_access.populate(record, &mut new_blu_events) + cols.op_b_access + .populate(event.channel, record, &mut new_blu_events) } if let Some(MemoryRecordEnum::Read(record)) = event.c_record { - cols.op_c_access.populate(record, &mut new_blu_events) + cols.op_c_access + .populate(event.channel, record, &mut new_blu_events) } // Populate memory accesses for reading from memory. @@ -164,7 +167,7 @@ impl CpuChip { if let Some(record) = event.memory_record { memory_columns .memory_access - .populate(record, &mut new_blu_events) + .populate(event.channel, record, &mut new_blu_events) } // Populate memory, branch, jump, and auipc specific fields. @@ -188,7 +191,7 @@ impl CpuChip { (row, new_alu_events, new_blu_events) } - /// Populates the shard and clk related rows. + /// Populates the shard, channel, and clk related rows. fn populate_shard_clk( &self, cols: &mut CpuCols, @@ -196,8 +199,11 @@ impl CpuChip { new_blu_events: &mut Vec, ) { cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); + cols.channel_selectors.populate(event.channel); new_blu_events.push(ByteLookupEvent::new( event.shard, + event.channel, U16Range, event.shard, 0, @@ -212,6 +218,7 @@ impl CpuChip { cols.clk_8bit_limb = F::from_canonical_u32(clk_8bit_limb); new_blu_events.push(ByteLookupEvent::new( event.shard, + event.channel, U16Range, clk_16bit_limb, 0, @@ -220,6 +227,7 @@ impl CpuChip { )); new_blu_events.push(ByteLookupEvent::new( event.shard, + event.channel, U8Range, 0, 0, @@ -260,6 +268,7 @@ impl CpuChip { // Add event to ALU check to check that addr == b + c let add_event = AluEvent { shard: event.shard, + channel: event.channel, clk: event.clk, opcode: Opcode::ADD, a: memory_addr, @@ -323,6 +332,7 @@ impl CpuChip { if memory_columns.most_sig_byte_decomp[7] == F::one() { cols.mem_value_is_neg = F::one(); let sub_event = AluEvent { + channel: event.channel, shard: event.shard, clk: event.clk, opcode: Opcode::SUB, @@ -344,6 +354,7 @@ impl CpuChip { for byte_pair in addr_bytes.chunks_exact(2) { new_blu_events.push(ByteLookupEvent { shard: event.shard, + channel: event.channel, opcode: ByteOpcode::U8Range, a1: 0, a2: 0, @@ -387,6 +398,7 @@ impl CpuChip { // Add the ALU events for the comparisons let lt_comp_event = AluEvent { shard: event.shard, + channel: event.channel, clk: event.clk, opcode: alu_op_code, a: a_lt_b as u32, @@ -401,6 +413,7 @@ impl CpuChip { let gt_comp_event = AluEvent { shard: event.shard, + channel: event.channel, clk: event.clk, opcode: alu_op_code, a: a_gt_b as u32, @@ -434,6 +447,7 @@ impl CpuChip { let add_event = AluEvent { shard: event.shard, + channel: event.channel, clk: event.clk, opcode: Opcode::ADD, a: next_pc, @@ -469,6 +483,7 @@ impl CpuChip { let add_event = AluEvent { shard: event.shard, + channel: event.channel, clk: event.clk, opcode: Opcode::ADD, a: next_pc, @@ -487,6 +502,7 @@ impl CpuChip { let add_event = AluEvent { shard: event.shard, + channel: event.channel, clk: event.clk, opcode: Opcode::ADD, a: next_pc, @@ -518,6 +534,7 @@ impl CpuChip { let add_event = AluEvent { shard: event.shard, + channel: event.channel, clk: event.clk, opcode: Opcode::ADD, a: event.a, @@ -631,6 +648,7 @@ mod tests { let mut shard = ExecutionRecord::default(); shard.cpu_events = vec![CpuEvent { shard: 1, + channel: 0, clk: 6, pc: 1, next_pc: 5, diff --git a/core/src/memory/trace.rs b/core/src/memory/trace.rs index e7593d0134..678dfcf7bc 100644 --- a/core/src/memory/trace.rs +++ b/core/src/memory/trace.rs @@ -5,7 +5,12 @@ use crate::bytes::event::ByteRecord; use crate::runtime::{MemoryReadRecord, MemoryRecord, MemoryRecordEnum, MemoryWriteRecord}; impl MemoryWriteCols { - pub fn populate(&mut self, record: MemoryWriteRecord, output: &mut impl ByteRecord) { + pub fn populate( + &mut self, + channel: u32, + record: MemoryWriteRecord, + output: &mut impl ByteRecord, + ) { let current_record = MemoryRecord { value: record.value, shard: record.shard, @@ -18,12 +23,17 @@ impl MemoryWriteCols { }; self.prev_value = prev_record.value.into(); self.access - .populate_access(current_record, prev_record, output); + .populate_access(channel, current_record, prev_record, output); } } impl MemoryReadCols { - pub fn populate(&mut self, record: MemoryReadRecord, output: &mut impl ByteRecord) { + pub fn populate( + &mut self, + channel: u32, + record: MemoryReadRecord, + output: &mut impl ByteRecord, + ) { let current_record = MemoryRecord { value: record.value, shard: record.shard, @@ -35,19 +45,31 @@ impl MemoryReadCols { timestamp: record.prev_timestamp, }; self.access - .populate_access(current_record, prev_record, output); + .populate_access(channel, current_record, prev_record, output); } } impl MemoryReadWriteCols { - pub fn populate(&mut self, record: MemoryRecordEnum, output: &mut impl ByteRecord) { + pub fn populate( + &mut self, + channel: u32, + record: MemoryRecordEnum, + output: &mut impl ByteRecord, + ) { match record { - MemoryRecordEnum::Read(read_record) => self.populate_read(read_record, output), - MemoryRecordEnum::Write(write_record) => self.populate_write(write_record, output), + MemoryRecordEnum::Read(read_record) => self.populate_read(channel, read_record, output), + MemoryRecordEnum::Write(write_record) => { + self.populate_write(channel, write_record, output) + } } } - pub fn populate_write(&mut self, record: MemoryWriteRecord, output: &mut impl ByteRecord) { + pub fn populate_write( + &mut self, + channel: u32, + record: MemoryWriteRecord, + output: &mut impl ByteRecord, + ) { let current_record = MemoryRecord { value: record.value, shard: record.shard, @@ -60,10 +82,15 @@ impl MemoryReadWriteCols { }; self.prev_value = prev_record.value.into(); self.access - .populate_access(current_record, prev_record, output); + .populate_access(channel, current_record, prev_record, output); } - pub fn populate_read(&mut self, record: MemoryReadRecord, output: &mut impl ByteRecord) { + pub fn populate_read( + &mut self, + channel: u32, + record: MemoryReadRecord, + output: &mut impl ByteRecord, + ) { let current_record = MemoryRecord { value: record.value, shard: record.shard, @@ -76,13 +103,14 @@ impl MemoryReadWriteCols { }; self.prev_value = prev_record.value.into(); self.access - .populate_access(current_record, prev_record, output); + .populate_access(channel, current_record, prev_record, output); } } impl MemoryAccessCols { pub(crate) fn populate_access( &mut self, + channel: u32, current_record: MemoryRecord, prev_record: MemoryRecord, output: &mut impl ByteRecord, @@ -115,9 +143,9 @@ impl MemoryAccessCols { let shard = current_record.shard; // Add a byte table lookup with the 16Range op. - output.add_u16_range_check(shard, diff_16bit_limb); + output.add_u16_range_check(shard, channel, diff_16bit_limb); // Add a byte table lookup with the U8Range op. - output.add_u8_range_check(shard, 0, diff_8bit_limb as u8); + output.add_u8_range_check(shard, channel, 0, diff_8bit_limb as u8); } } diff --git a/core/src/operations/add.rs b/core/src/operations/add.rs index 78e8dc1826..27f002db3f 100644 --- a/core/src/operations/add.rs +++ b/core/src/operations/add.rs @@ -24,6 +24,7 @@ impl AddOperation { &mut self, record: &mut ExecutionRecord, shard: u32, + channel: u32, a_u32: u32, b_u32: u32, ) -> u32 { @@ -54,9 +55,9 @@ impl AddOperation { // Range check { - record.add_u8_range_checks(shard, &a); - record.add_u8_range_checks(shard, &b); - record.add_u8_range_checks(shard, &expected.to_le_bytes()); + record.add_u8_range_checks(shard, channel, &a); + record.add_u8_range_checks(shard, channel, &b); + record.add_u8_range_checks(shard, channel, &expected.to_le_bytes()); } expected } @@ -67,6 +68,7 @@ impl AddOperation { b: Word, cols: AddOperation, shard: AB::Var, + channel: impl Into + Clone, is_real: AB::Expr, ) { let one = AB::Expr::one(); @@ -103,9 +105,9 @@ impl AddOperation { // Range check each byte. { - builder.slice_range_check_u8(&a.0, shard, is_real.clone()); - builder.slice_range_check_u8(&b.0, shard, is_real.clone()); - builder.slice_range_check_u8(&cols.value.0, shard, is_real); + builder.slice_range_check_u8(&a.0, shard, channel.clone(), is_real.clone()); + builder.slice_range_check_u8(&b.0, shard, channel.clone(), is_real.clone()); + builder.slice_range_check_u8(&cols.value.0, shard, channel.clone(), is_real); } } } diff --git a/core/src/operations/add4.rs b/core/src/operations/add4.rs index 10e1f95774..f3066a3851 100644 --- a/core/src/operations/add4.rs +++ b/core/src/operations/add4.rs @@ -33,10 +33,12 @@ pub struct Add4Operation { } impl Add4Operation { + #[allow(clippy::too_many_arguments)] pub fn populate( &mut self, record: &mut ExecutionRecord, shard: u32, + channel: u32, a_u32: u32, b_u32: u32, c_u32: u32, @@ -71,11 +73,11 @@ impl Add4Operation { // Range check. { - record.add_u8_range_checks(shard, &a); - record.add_u8_range_checks(shard, &b); - record.add_u8_range_checks(shard, &c); - record.add_u8_range_checks(shard, &d); - record.add_u8_range_checks(shard, &expected.to_le_bytes()); + record.add_u8_range_checks(shard, channel, &a); + record.add_u8_range_checks(shard, channel, &b); + record.add_u8_range_checks(shard, channel, &c); + record.add_u8_range_checks(shard, channel, &d); + record.add_u8_range_checks(shard, channel, &expected.to_le_bytes()); } expected } @@ -88,16 +90,17 @@ impl Add4Operation { c: Word, d: Word, shard: AB::Var, + channel: impl Into + Copy, is_real: AB::Var, cols: Add4Operation, ) { // Range check each byte. { - builder.slice_range_check_u8(&a.0, shard, is_real); - builder.slice_range_check_u8(&b.0, shard, is_real); - builder.slice_range_check_u8(&c.0, shard, is_real); - builder.slice_range_check_u8(&d.0, shard, is_real); - builder.slice_range_check_u8(&cols.value.0, shard, is_real); + builder.slice_range_check_u8(&a.0, shard, channel, is_real); + builder.slice_range_check_u8(&b.0, shard, channel, is_real); + builder.slice_range_check_u8(&c.0, shard, channel, is_real); + builder.slice_range_check_u8(&d.0, shard, channel, is_real); + builder.slice_range_check_u8(&cols.value.0, shard, channel, is_real); } builder.assert_bool(is_real); diff --git a/core/src/operations/add5.rs b/core/src/operations/add5.rs index 67421f8aa8..00da26bf84 100644 --- a/core/src/operations/add5.rs +++ b/core/src/operations/add5.rs @@ -41,6 +41,7 @@ impl Add5Operation { &mut self, record: &mut ExecutionRecord, shard: u32, + channel: u32, a_u32: u32, b_u32: u32, c_u32: u32, @@ -81,12 +82,12 @@ impl Add5Operation { // Range check. { - record.add_u8_range_checks(shard, &a); - record.add_u8_range_checks(shard, &b); - record.add_u8_range_checks(shard, &c); - record.add_u8_range_checks(shard, &d); - record.add_u8_range_checks(shard, &e); - record.add_u8_range_checks(shard, &expected.to_le_bytes()); + record.add_u8_range_checks(shard, channel, &a); + record.add_u8_range_checks(shard, channel, &b); + record.add_u8_range_checks(shard, channel, &c); + record.add_u8_range_checks(shard, channel, &d); + record.add_u8_range_checks(shard, channel, &e); + record.add_u8_range_checks(shard, channel, &expected.to_le_bytes()); } expected @@ -96,6 +97,7 @@ impl Add5Operation { builder: &mut AB, words: &[Word; 5], shard: AB::Var, + channel: impl Into + Copy, is_real: AB::Var, cols: Add5Operation, ) { @@ -104,8 +106,8 @@ impl Add5Operation { { words .iter() - .for_each(|word| builder.slice_range_check_u8(&word.0, shard, is_real)); - builder.slice_range_check_u8(&cols.value.0, shard, is_real); + .for_each(|word| builder.slice_range_check_u8(&word.0, shard, channel, is_real)); + builder.slice_range_check_u8(&cols.value.0, shard, channel, is_real); } let mut builder_is_real = builder.when(is_real); diff --git a/core/src/operations/and.rs b/core/src/operations/and.rs index 9bb27a14a0..adeade4190 100644 --- a/core/src/operations/and.rs +++ b/core/src/operations/and.rs @@ -19,7 +19,14 @@ pub struct AndOperation { } impl AndOperation { - pub fn populate(&mut self, record: &mut ExecutionRecord, shard: u32, x: u32, y: u32) -> u32 { + pub fn populate( + &mut self, + record: &mut ExecutionRecord, + shard: u32, + channel: u32, + x: u32, + y: u32, + ) -> u32 { let expected = x & y; let x_bytes = x.to_le_bytes(); let y_bytes = y.to_le_bytes(); @@ -29,6 +36,7 @@ impl AndOperation { let byte_event = ByteLookupEvent { shard, + channel, opcode: ByteOpcode::AND, a1: and as u32, a2: 0, @@ -47,6 +55,7 @@ impl AndOperation { b: Word, cols: AndOperation, shard: AB::Var, + channel: impl Into + Copy, is_real: AB::Var, ) { for i in 0..WORD_SIZE { @@ -56,6 +65,7 @@ impl AndOperation { a[i], b[i], shard, + channel, is_real, ); } diff --git a/core/src/operations/field/field_den.rs b/core/src/operations/field/field_den.rs index eab87631ca..7940d8a0c5 100644 --- a/core/src/operations/field/field_den.rs +++ b/core/src/operations/field/field_den.rs @@ -33,6 +33,7 @@ impl FieldDenCols { &mut self, record: &mut impl ByteRecord, shard: u32, + channel: u32, a: &BigUint, b: &BigUint, sign: bool, @@ -84,10 +85,10 @@ impl FieldDenCols { self.witness_high = Limbs(p_witness_high.try_into().unwrap()); // Range checks - record.add_u8_range_checks_field(shard, &self.result.0); - record.add_u8_range_checks_field(shard, &self.carry.0); - record.add_u8_range_checks_field(shard, &self.witness_low.0); - record.add_u8_range_checks_field(shard, &self.witness_high.0); + record.add_u8_range_checks_field(shard, channel, &self.result.0); + record.add_u8_range_checks_field(shard, channel, &self.carry.0); + record.add_u8_range_checks_field(shard, channel, &self.witness_low.0); + record.add_u8_range_checks_field(shard, channel, &self.witness_high.0); result } @@ -97,18 +98,16 @@ impl FieldDenCols where Limbs: Copy, { - pub fn eval< - AB: SP1AirBuilder, - EShard: Into + Clone, - ER: Into + Clone, - >( + #[allow(clippy::too_many_arguments)] + pub fn eval>( &self, builder: &mut AB, a: &Limbs, b: &Limbs, sign: bool, - shard: EShard, - is_real: ER, + shard: impl Into + Clone, + channel: impl Into + Clone, + is_real: impl Into + Clone, ) where V: Into, { @@ -139,10 +138,25 @@ where eval_field_operation::(builder, &p_vanishing, &p_witness_low, &p_witness_high); // Range checks for the result, carry, and witness columns. - builder.slice_range_check_u8(&self.result.0, shard.clone(), is_real.clone()); - builder.slice_range_check_u8(&self.carry.0, shard.clone(), is_real.clone()); - builder.slice_range_check_u8(&self.witness_low.0, shard.clone(), is_real.clone()); - builder.slice_range_check_u8(&self.witness_high.0, shard, is_real); + builder.slice_range_check_u8( + &self.result.0, + shard.clone(), + channel.clone(), + is_real.clone(), + ); + builder.slice_range_check_u8( + &self.carry.0, + shard.clone(), + channel.clone(), + is_real.clone(), + ); + builder.slice_range_check_u8( + &self.witness_low.0, + shard.clone(), + channel.clone(), + is_real.clone(), + ); + builder.slice_range_check_u8(&self.witness_high.0, shard, channel.clone(), is_real); } } @@ -238,7 +252,7 @@ mod tests { let cols: &mut TestCols = row.as_mut_slice().borrow_mut(); cols.a = P::to_limbs_field::(a); cols.b = P::to_limbs_field::(b); - cols.a_den_b.populate(output, 1, a, b, self.sign); + cols.a_den_b.populate(output, 1, 0, a, b, self.sign); row }) .collect::>(); @@ -278,6 +292,7 @@ mod tests { &local.b, self.sign, AB::F::one(), + AB::F::zero(), AB::F::one(), ); } diff --git a/core/src/operations/field/field_inner_product.rs b/core/src/operations/field/field_inner_product.rs index 070b174bd1..2b259f2f7e 100644 --- a/core/src/operations/field/field_inner_product.rs +++ b/core/src/operations/field/field_inner_product.rs @@ -34,6 +34,7 @@ impl FieldInnerProductCols { &mut self, record: &mut impl ByteRecord, shard: u32, + channel: u32, a: &[BigUint], b: &[BigUint], ) -> BigUint { @@ -86,10 +87,10 @@ impl FieldInnerProductCols { self.witness_high = Limbs(p_witness_high.try_into().unwrap()); // Range checks - record.add_u8_range_checks_field(shard, &self.result.0); - record.add_u8_range_checks_field(shard, &self.carry.0); - record.add_u8_range_checks_field(shard, &self.witness_low.0); - record.add_u8_range_checks_field(shard, &self.witness_high.0); + record.add_u8_range_checks_field(shard, channel, &self.result.0); + record.add_u8_range_checks_field(shard, channel, &self.carry.0); + record.add_u8_range_checks_field(shard, channel, &self.witness_low.0); + record.add_u8_range_checks_field(shard, channel, &self.witness_high.0); result.clone() } @@ -99,17 +100,14 @@ impl FieldInnerProductCols where Limbs: Copy, { - pub fn eval< - AB: SP1AirBuilder, - EShard: Into + Clone, - ER: Into + Clone, - >( + pub fn eval>( &self, builder: &mut AB, a: &[Limbs], b: &[Limbs], - shard: EShard, - is_real: ER, + shard: impl Into + Clone, + channel: impl Into + Clone, + is_real: impl Into + Clone, ) where V: Into, { @@ -138,10 +136,25 @@ where eval_field_operation::(builder, &p_vanishing, &p_witness_low, &p_witness_high); // Range checks for the result, carry, and witness columns. - builder.slice_range_check_u8(&self.result.0, shard.clone(), is_real.clone()); - builder.slice_range_check_u8(&self.carry.0, shard.clone(), is_real.clone()); - builder.slice_range_check_u8(&self.witness_low.0, shard.clone(), is_real.clone()); - builder.slice_range_check_u8(&self.witness_high.0, shard, is_real); + builder.slice_range_check_u8( + &self.result.0, + shard.clone(), + channel.clone(), + is_real.clone(), + ); + builder.slice_range_check_u8( + &self.carry.0, + shard.clone(), + channel.clone(), + is_real.clone(), + ); + builder.slice_range_check_u8( + &self.witness_low.0, + shard.clone(), + channel.clone(), + is_real.clone(), + ); + builder.slice_range_check_u8(&self.witness_high.0, shard, channel.clone(), is_real); } } @@ -231,7 +244,7 @@ mod tests { let cols: &mut TestCols = row.as_mut_slice().borrow_mut(); cols.a[0] = P::to_limbs_field::(&a[0]); cols.b[0] = P::to_limbs_field::(&b[0]); - cols.a_ip_b.populate(output, 1, a, b); + cols.a_ip_b.populate(output, 1, 0, a, b); row }) .collect::>(); @@ -267,9 +280,14 @@ mod tests { let main = builder.main(); let local = main.row_slice(0); let local: &TestCols = (*local).borrow(); - local - .a_ip_b - .eval(builder, &local.a, &local.b, AB::F::one(), AB::F::one()); + local.a_ip_b.eval( + builder, + &local.a, + &local.b, + AB::F::one(), + AB::F::zero(), + AB::F::one(), + ); } } diff --git a/core/src/operations/field/field_op.rs b/core/src/operations/field/field_op.rs index 9c8943d0ce..59bb85f2a2 100644 --- a/core/src/operations/field/field_op.rs +++ b/core/src/operations/field/field_op.rs @@ -108,10 +108,12 @@ impl FieldOpCols { /// Populate these columns with a specified modulus. This is useful in the `mulmod` precompile /// as an example. + #[allow(clippy::too_many_arguments)] pub fn populate_with_modulus( &mut self, record: &mut impl ByteRecord, shard: u32, + channel: u32, a: &BigUint, b: &BigUint, modulus: &BigUint, @@ -159,10 +161,10 @@ impl FieldOpCols { }; // Range checks - record.add_u8_range_checks_field(shard, &self.result.0); - record.add_u8_range_checks_field(shard, &self.carry.0); - record.add_u8_range_checks_field(shard, &self.witness_low.0); - record.add_u8_range_checks_field(shard, &self.witness_high.0); + record.add_u8_range_checks_field(shard, channel, &self.result.0); + record.add_u8_range_checks_field(shard, channel, &self.carry.0); + record.add_u8_range_checks_field(shard, channel, &self.witness_low.0); + record.add_u8_range_checks_field(shard, channel, &self.witness_high.0); result } @@ -172,11 +174,12 @@ impl FieldOpCols { &mut self, record: &mut impl ByteRecord, shard: u32, + channel: u32, a: &BigUint, b: &BigUint, op: FieldOperation, ) -> BigUint { - self.populate_with_modulus(record, shard, a, b, &P::modulus(), op) + self.populate_with_modulus(record, shard, channel, a, b, &P::modulus(), op) } } @@ -190,6 +193,7 @@ impl FieldOpCols { modulus: &(impl Into> + Clone), op: FieldOperation, shard: impl Into + Clone, + channel: impl Into + Clone, is_real: impl Into + Clone, ) where V: Into, @@ -215,12 +219,33 @@ impl FieldOpCols { eval_field_operation::(builder, &p_vanishing, &p_witness_low, &p_witness_high); // Range checks for the result, carry, and witness columns. - builder.slice_range_check_u8(&self.result.0, shard.clone(), is_real.clone()); - builder.slice_range_check_u8(&self.carry.0, shard.clone(), is_real.clone()); - builder.slice_range_check_u8(p_witness_low.coefficients(), shard.clone(), is_real.clone()); - builder.slice_range_check_u8(p_witness_high.coefficients(), shard.clone(), is_real); + builder.slice_range_check_u8( + &self.result.0, + shard.clone(), + channel.clone(), + is_real.clone(), + ); + builder.slice_range_check_u8( + &self.carry.0, + shard.clone(), + channel.clone(), + is_real.clone(), + ); + builder.slice_range_check_u8( + p_witness_low.coefficients(), + shard.clone(), + channel.clone(), + is_real.clone(), + ); + builder.slice_range_check_u8( + p_witness_high.coefficients(), + shard.clone(), + channel.clone(), + is_real, + ); } + #[allow(clippy::too_many_arguments)] pub fn eval>( &self, builder: &mut AB, @@ -228,13 +253,14 @@ impl FieldOpCols { b: &(impl Into> + Clone), op: FieldOperation, shard: impl Into + Clone, + channel: impl Into + Clone, is_real: impl Into + Clone, ) where V: Into, Limbs: Copy, { let p_limbs = Polynomial::from_iter(P::modulus_field_iter::().map(AB::Expr::from)); - self.eval_with_modulus::(builder, a, b, &p_limbs, op, shard, is_real); + self.eval_with_modulus::(builder, a, b, &p_limbs, op, shard, channel, is_real); } } @@ -336,7 +362,7 @@ mod tests { cols.a = P::to_limbs_field::(a); cols.b = P::to_limbs_field::(b); cols.a_op_b - .populate(&mut blu_events, 1, a, b, self.operation); + .populate(&mut blu_events, 1, 0, a, b, self.operation); output.add_byte_lookup_events(blu_events); row }) @@ -379,6 +405,7 @@ mod tests { &local.b, self.operation, AB::F::one(), + AB::F::zero(), AB::F::one(), ); } diff --git a/core/src/operations/field/field_sqrt.rs b/core/src/operations/field/field_sqrt.rs index 95f4f55319..6693c2734e 100644 --- a/core/src/operations/field/field_sqrt.rs +++ b/core/src/operations/field/field_sqrt.rs @@ -41,6 +41,7 @@ impl FieldSqrtCols { &mut self, record: &mut impl ByteRecord, shard: u32, + channel: u32, a: &BigUint, sqrt_fn: impl Fn(&BigUint) -> BigUint, ) -> BigUint { @@ -52,6 +53,7 @@ impl FieldSqrtCols { let sqrt_squared = self.multiplication.populate( record, shard, + channel, &sqrt, &sqrt, super::field_op::FieldOperation::Mul, @@ -65,13 +67,14 @@ impl FieldSqrtCols { self.multiplication.result = P::to_limbs_field::(&sqrt); // Populate the range columns. - self.range.populate(record, shard, &sqrt); + self.range.populate(record, shard, channel, &sqrt); let sqrt_bytes = P::to_limbs(&sqrt); self.lsb = F::from_canonical_u8(sqrt_bytes[0] & 1); let and_event = ByteLookupEvent { shard, + channel, opcode: ByteOpcode::AND, a1: self.lsb.as_canonical_u32(), a2: 0, @@ -89,18 +92,14 @@ where Limbs: Copy, { /// Calculates the square root of `a`. - pub fn eval< - AB: SP1AirBuilder, - ER: Into + Clone, - EOdd: Into, - EShard: Into + Clone, - >( + pub fn eval>( &self, builder: &mut AB, a: &Limbs, - is_odd: EOdd, - shard: EShard, - is_real: ER, + is_odd: impl Into, + shard: impl Into + Clone, + channel: impl Into + Clone, + is_real: impl Into + Clone, ) where V: Into, { @@ -118,11 +117,17 @@ where &sqrt, super::field_op::FieldOperation::Mul, shard.clone(), + channel.clone(), is_real.clone(), ); - self.range - .eval(builder, &sqrt, shard.clone(), is_real.clone()); + self.range.eval( + builder, + &sqrt, + shard.clone(), + channel.clone(), + is_real.clone(), + ); // Assert that the square root is the positive one, i.e., with least significant bit 0. // This is done by computing LSB = least_significant_byte & 1. @@ -134,6 +139,7 @@ where sqrt[0], AB::F::one(), shard, + channel, is_real, ); } @@ -224,7 +230,7 @@ mod tests { let mut row = [F::zero(); NUM_TEST_COLS]; let cols: &mut TestCols = row.as_mut_slice().borrow_mut(); cols.a = P::to_limbs_field::(a); - cols.sqrt.populate(&mut blu_events, 1, a, ed25519_sqrt); + cols.sqrt.populate(&mut blu_events, 1, 0, a, ed25519_sqrt); output.add_byte_lookup_events(blu_events); row }) @@ -263,9 +269,14 @@ mod tests { let local: &TestCols = (*local).borrow(); // eval verifies that local.sqrt.result is indeed the square root of local.a. - local - .sqrt - .eval(builder, &local.a, AB::F::zero(), AB::F::one(), AB::F::one()); + local.sqrt.eval( + builder, + &local.a, + AB::F::zero(), + AB::F::one(), + AB::F::zero(), + AB::F::one(), + ); } } diff --git a/core/src/operations/field/range.rs b/core/src/operations/field/range.rs index 484fff6ebe..da2a2de4e8 100644 --- a/core/src/operations/field/range.rs +++ b/core/src/operations/field/range.rs @@ -28,7 +28,13 @@ pub struct FieldRangeCols { } impl FieldRangeCols { - pub fn populate(&mut self, record: &mut impl ByteRecord, shard: u32, value: &BigUint) { + pub fn populate( + &mut self, + record: &mut impl ByteRecord, + shard: u32, + channel: u32, + value: &BigUint, + ) { let value_limbs = P::to_limbs(value); let modulus_limbs = P::to_limbs(&P::modulus()); @@ -46,6 +52,7 @@ impl FieldRangeCols { record.add_byte_lookup_event(ByteLookupEvent { opcode: ByteOpcode::LTU, shard, + channel, a1: 1, a2: 0, b: *byte as u32, @@ -62,17 +69,13 @@ impl FieldRangeCols { } impl FieldRangeCols { - pub fn eval< - AB: SP1AirBuilder, - E: Into> + Clone, - EShard: Into + Clone, - ER: Into + Clone, - >( + pub fn eval, E: Into> + Clone>( &self, builder: &mut AB, element: &E, - shard: EShard, - is_real: ER, + shard: impl Into + Clone, + channel: impl Into + Clone, + is_real: impl Into + Clone, ) where V: Into, Limbs: Copy, @@ -137,6 +140,7 @@ impl FieldRangeCols { self.comparison_byte, modulus_comparison_byte, shard, + channel, is_real, ) } diff --git a/core/src/operations/fixed_rotate_right.rs b/core/src/operations/fixed_rotate_right.rs index 209b1bb045..150626db56 100644 --- a/core/src/operations/fixed_rotate_right.rs +++ b/core/src/operations/fixed_rotate_right.rs @@ -45,6 +45,7 @@ impl FixedRotateRightOperation { &mut self, record: &mut ExecutionRecord, shard: u32, + channel: u32, input: u32, rotation: usize, ) -> u32 { @@ -76,6 +77,7 @@ impl FixedRotateRightOperation { let byte_event = ByteLookupEvent { shard, + channel, opcode: ByteOpcode::ShrCarry, a1: shift as u32, a2: carry as u32, @@ -111,6 +113,7 @@ impl FixedRotateRightOperation { rotation: usize, cols: FixedRotateRightOperation, shard: AB::Var, + channel: impl Into + Clone, is_real: AB::Var, ) { // Compute some constants with respect to the rotation needed for the rotation. @@ -138,6 +141,7 @@ impl FixedRotateRightOperation { input_bytes_rotated[i], AB::F::from_canonical_usize(nb_bits_to_shift), shard, + channel.clone(), is_real, ); diff --git a/core/src/operations/fixed_shift_right.rs b/core/src/operations/fixed_shift_right.rs index 5cadb7acca..19e7f02308 100644 --- a/core/src/operations/fixed_shift_right.rs +++ b/core/src/operations/fixed_shift_right.rs @@ -45,6 +45,7 @@ impl FixedShiftRightOperation { &mut self, record: &mut ExecutionRecord, shard: u32, + channel: u32, input: u32, rotation: usize, ) -> u32 { @@ -75,6 +76,7 @@ impl FixedShiftRightOperation { let (shift, carry) = shr_carry(b, c); let byte_event = ByteLookupEvent { shard, + channel, opcode: ByteOpcode::ShrCarry, a1: shift as u32, a2: carry as u32, @@ -109,7 +111,8 @@ impl FixedShiftRightOperation { input: Word, rotation: usize, cols: FixedShiftRightOperation, - shard: AB::Var, + shard: impl Into + Copy, + channel: impl Into + Copy, is_real: AB::Var, ) { // Compute some constants with respect to the rotation needed for the rotation. @@ -138,6 +141,7 @@ impl FixedShiftRightOperation { input_bytes_rotated[i].clone(), AB::F::from_canonical_usize(nb_bits_to_shift), shard, + channel, is_real, ); diff --git a/core/src/operations/not.rs b/core/src/operations/not.rs index c7a6adad9e..309c630610 100644 --- a/core/src/operations/not.rs +++ b/core/src/operations/not.rs @@ -19,13 +19,19 @@ pub struct NotOperation { } impl NotOperation { - pub fn populate(&mut self, record: &mut ExecutionRecord, shard: u32, x: u32) -> u32 { + pub fn populate( + &mut self, + record: &mut ExecutionRecord, + shard: u32, + channel: u32, + x: u32, + ) -> u32 { let expected = !x; let x_bytes = x.to_le_bytes(); for i in 0..WORD_SIZE { self.value[i] = F::from_canonical_u8(!x_bytes[i]); } - record.add_u8_range_checks(shard, &x_bytes); + record.add_u8_range_checks(shard, channel, &x_bytes); expected } @@ -34,8 +40,9 @@ impl NotOperation { builder: &mut AB, a: Word, cols: NotOperation, - shard: AB::Var, - is_real: AB::Var, + shard: impl Into + Copy, + channel: impl Into + Copy, + is_real: impl Into + Copy, ) { for i in (0..WORD_SIZE).step_by(2) { builder.send_byte_pair( @@ -45,6 +52,7 @@ impl NotOperation { a[i], a[i + 1], shard, + channel, is_real, ); } diff --git a/core/src/operations/or.rs b/core/src/operations/or.rs index f3dd1a1a91..8cb3f00191 100644 --- a/core/src/operations/or.rs +++ b/core/src/operations/or.rs @@ -20,13 +20,20 @@ pub struct OrOperation { } impl OrOperation { - pub fn populate(&mut self, record: &mut ExecutionRecord, shard: u32, x: u32, y: u32) -> u32 { + pub fn populate( + &mut self, + record: &mut ExecutionRecord, + shard: u32, + channel: u32, + x: u32, + y: u32, + ) -> u32 { let expected = x | y; let x_bytes = x.to_le_bytes(); let y_bytes = y.to_le_bytes(); for i in 0..WORD_SIZE { self.value[i] = F::from_canonical_u8(x_bytes[i] | y_bytes[i]); - record.lookup_or(shard, x_bytes[i], y_bytes[i]); + record.lookup_or(shard, channel, x_bytes[i], y_bytes[i]); } expected } @@ -36,7 +43,8 @@ impl OrOperation { a: Word, b: Word, cols: OrOperation, - shard: AB::Var, + shard: impl Into + Copy, + channel: impl Into + Copy, is_real: AB::Var, ) { for i in 0..WORD_SIZE { @@ -46,6 +54,7 @@ impl OrOperation { a[i], b[i], shard, + channel, is_real, ); } diff --git a/core/src/operations/xor.rs b/core/src/operations/xor.rs index 0b6858f6bf..ffb70f6847 100644 --- a/core/src/operations/xor.rs +++ b/core/src/operations/xor.rs @@ -19,7 +19,14 @@ pub struct XorOperation { } impl XorOperation { - pub fn populate(&mut self, record: &mut ExecutionRecord, shard: u32, x: u32, y: u32) -> u32 { + pub fn populate( + &mut self, + record: &mut ExecutionRecord, + shard: u32, + channel: u32, + x: u32, + y: u32, + ) -> u32 { let expected = x ^ y; let x_bytes = x.to_le_bytes(); let y_bytes = y.to_le_bytes(); @@ -29,6 +36,7 @@ impl XorOperation { let byte_event = ByteLookupEvent { shard, + channel, opcode: ByteOpcode::XOR, a1: xor as u32, a2: 0, @@ -47,6 +55,7 @@ impl XorOperation { b: Word, cols: XorOperation, shard: AB::Var, + channel: impl Into + Clone, is_real: AB::Var, ) { for i in 0..WORD_SIZE { @@ -56,6 +65,7 @@ impl XorOperation { a[i], b[i], shard, + channel.clone(), is_real, ); } diff --git a/core/src/runtime/mod.rs b/core/src/runtime/mod.rs index 09b21a88aa..7868098a4d 100644 --- a/core/src/runtime/mod.rs +++ b/core/src/runtime/mod.rs @@ -29,6 +29,7 @@ use std::sync::Arc; use thiserror::Error; +use crate::bytes::NUM_BYTE_LOOKUP_CHANNELS; use crate::memory::MemoryInitializeFinalizeEvent; use crate::utils::env; use crate::{alu::AluEvent, cpu::CpuEvent}; @@ -196,10 +197,16 @@ impl Runtime { } /// Get the current shard. + #[inline] pub fn shard(&self) -> u32 { self.state.current_shard } + #[inline] + pub fn channel(&self) -> u32 { + self.state.channel + } + /// Read a word from memory and create an access record. pub fn mr(&mut self, addr: u32, shard: u32, timestamp: u32) -> MemoryReadRecord { // Get the memory record entry. @@ -377,6 +384,7 @@ impl Runtime { fn emit_cpu( &mut self, shard: u32, + channel: u32, clk: u32, pc: u32, next_pc: u32, @@ -390,6 +398,7 @@ impl Runtime { ) { let cpu_event = CpuEvent { shard, + channel, clk, pc, next_pc, @@ -413,6 +422,7 @@ impl Runtime { let event = AluEvent { shard: self.shard(), clk, + channel: self.channel(), opcode, a, b, @@ -852,10 +862,18 @@ impl Runtime { // Update the clk to the next cycle. self.state.clk += 4; + let channel = self.channel(); + + // Update the channel to the next cycle. + if !self.unconstrained { + self.state.channel = (self.state.channel + 1) % NUM_BYTE_LOOKUP_CHANNELS; + } + // Emit the CPU event for this cycle. if self.emit_events { self.emit_cpu( self.shard(), + channel, clk, pc, next_pc, @@ -868,7 +886,6 @@ impl Runtime { exit_code, ); }; - Ok(()) } @@ -892,6 +909,7 @@ impl Runtime { if !self.unconstrained && self.max_syscall_cycles + self.state.clk >= self.shard_size { self.state.current_shard += 1; self.state.clk = 0; + self.state.channel = 0; } Ok(self.state.pc.wrapping_sub(self.program.pc_base) @@ -915,6 +933,7 @@ impl Runtime { fn initialize(&mut self) { self.state.clk = 0; + self.state.channel = 0; tracing::info!("loading memory image"); for (addr, value) in self.program.memory_image.iter() { diff --git a/core/src/runtime/state.rs b/core/src/runtime/state.rs index 09f6236cc4..8b1c289ee9 100644 --- a/core/src/runtime/state.rs +++ b/core/src/runtime/state.rs @@ -25,6 +25,10 @@ pub struct ExecutionState { /// executed in this shard. pub clk: u32, + /// The channel alternates between 0 and [crate::bytes::NUM_BYTE_LOOKUP_CHANNELS], + /// used to controll byte lookup multiplicity. + pub channel: u32, + /// The program counter. pub pc: u32, @@ -65,6 +69,7 @@ impl ExecutionState { // Start at shard 1 since shard 0 is reserved for memory initialization. current_shard: 1, clk: 0, + channel: 0, pc: pc_start, memory: HashMap::default(), uninitialized_memory: HashMap::default(), diff --git a/core/src/runtime/syscall.rs b/core/src/runtime/syscall.rs index 6f89b374e8..4915f2640f 100644 --- a/core/src/runtime/syscall.rs +++ b/core/src/runtime/syscall.rs @@ -196,6 +196,10 @@ impl<'a> SyscallContext<'a> { self.rt.state.current_shard } + pub fn current_channel(&self) -> u32 { + self.rt.state.channel + } + pub fn mr(&mut self, addr: u32) -> (MemoryReadRecord, u32) { let record = self.rt.mr(addr, self.current_shard, self.clk); (record, record.value) diff --git a/core/src/syscall/precompiles/blake3/compress/air.rs b/core/src/syscall/precompiles/blake3/compress/air.rs index 6037d46791..a5876866e3 100644 --- a/core/src/syscall/precompiles/blake3/compress/air.rs +++ b/core/src/syscall/precompiles/blake3/compress/air.rs @@ -39,6 +39,7 @@ where // TODO: constraint clk column to increment by 1 within same invocation of syscall. builder.receive_syscall( local.shard, + local.channel, local.clk, AB::F::from_canonical_u32(SyscallCode::BLAKE3_COMPRESS_INNER.syscall_id()), local.state_ptr, @@ -145,6 +146,7 @@ impl Blake3CompressInnerChip { for i in 0..NUM_STATE_WORDS_PER_CALL { builder.eval_memory_access( local.shard, + local.channel, local.clk, local.state_ptr + local.state_index[i] * AB::F::from_canonical_usize(WORD_SIZE), &local.state_reads_writes[i], @@ -181,6 +183,7 @@ impl Blake3CompressInnerChip { for i in 0..NUM_MSG_WORDS_PER_CALL { builder.eval_memory_access( local.shard, + local.channel, local.clk, local.message_ptr + local.msg_schedule[i] * AB::F::from_canonical_usize(WORD_SIZE), &local.message_reads[i], @@ -209,7 +212,14 @@ impl Blake3CompressInnerChip { ]; // Call the g function. - GOperation::::eval(builder, input, local.g, local.shard, local.is_real); + GOperation::::eval( + builder, + input, + local.g, + local.shard, + local.channel, + local.is_real, + ); // Finally, the results of the g function should be written to the memory. for i in 0..NUM_STATE_WORDS_PER_CALL { diff --git a/core/src/syscall/precompiles/blake3/compress/columns.rs b/core/src/syscall/precompiles/blake3/compress/columns.rs index 12ea0139c9..bf7bbe4e1e 100644 --- a/core/src/syscall/precompiles/blake3/compress/columns.rs +++ b/core/src/syscall/precompiles/blake3/compress/columns.rs @@ -17,6 +17,7 @@ pub const NUM_BLAKE3_COMPRESS_INNER_COLS: usize = size_of:: { pub shard: T, + pub channel: T, pub clk: T, pub ecall_receive: T, diff --git a/core/src/syscall/precompiles/blake3/compress/execute.rs b/core/src/syscall/precompiles/blake3/compress/execute.rs index 113c126783..35298b0415 100644 --- a/core/src/syscall/precompiles/blake3/compress/execute.rs +++ b/core/src/syscall/precompiles/blake3/compress/execute.rs @@ -57,11 +57,13 @@ impl Syscall for Blake3CompressInnerChip { } let shard = rt.current_shard(); + let channel = rt.current_channel(); rt.record_mut() .blake3_compress_inner_events .push(Blake3CompressInnerEvent { shard, + channel, clk: start_clk, state_ptr, message_reads, diff --git a/core/src/syscall/precompiles/blake3/compress/g.rs b/core/src/syscall/precompiles/blake3/compress/g.rs index 53f93e5ca0..06e8c30348 100644 --- a/core/src/syscall/precompiles/blake3/compress/g.rs +++ b/core/src/syscall/precompiles/blake3/compress/g.rs @@ -49,6 +49,7 @@ impl GOperation { &mut self, record: &mut ExecutionRecord, shard: u32, + channel: u32, input: [u32; 6], ) -> [u32; 4] { let mut a = input[0]; @@ -61,37 +62,41 @@ impl GOperation { // First 4 steps. { // a = a + b + x. - a = self.a_plus_b.populate(record, shard, a, b); - a = self.a_plus_b_plus_x.populate(record, shard, a, x); + a = self.a_plus_b.populate(record, shard, channel, a, b); + a = self.a_plus_b_plus_x.populate(record, shard, channel, a, x); // d = (d ^ a).rotate_right(16). - d = self.d_xor_a.populate(record, shard, d, a); + d = self.d_xor_a.populate(record, shard, channel, d, a); d = d.rotate_right(16); // c = c + d. - c = self.c_plus_d.populate(record, shard, c, d); + c = self.c_plus_d.populate(record, shard, channel, c, d); // b = (b ^ c).rotate_right(12). - b = self.b_xor_c.populate(record, shard, b, c); - b = self.b_xor_c_rotate_right_12.populate(record, shard, b, 12); + b = self.b_xor_c.populate(record, shard, channel, b, c); + b = self + .b_xor_c_rotate_right_12 + .populate(record, shard, channel, b, 12); } // Second 4 steps. { // a = a + b + y. - a = self.a_plus_b_2.populate(record, shard, a, b); - a = self.a_plus_b_2_add_y.populate(record, shard, a, y); + a = self.a_plus_b_2.populate(record, shard, channel, a, b); + a = self.a_plus_b_2_add_y.populate(record, shard, channel, a, y); // d = (d ^ a).rotate_right(8). - d = self.d_xor_a_2.populate(record, shard, d, a); + d = self.d_xor_a_2.populate(record, shard, channel, d, a); d = d.rotate_right(8); // c = c + d. - c = self.c_plus_d_2.populate(record, shard, c, d); + c = self.c_plus_d_2.populate(record, shard, channel, c, d); // b = (b ^ c).rotate_right(7). - b = self.b_xor_c_2.populate(record, shard, b, c); - b = self.b_xor_c_2_rotate_right_7.populate(record, shard, b, 7); + b = self.b_xor_c_2.populate(record, shard, channel, b, c); + b = self + .b_xor_c_2_rotate_right_7 + .populate(record, shard, channel, b, 7); } let result = [a, b, c, d]; @@ -105,6 +110,7 @@ impl GOperation { input: [Word; 6], cols: GOperation, shard: AB::Var, + channel: impl Into + Clone, is_real: AB::Var, ) { builder.assert_bool(is_real); @@ -118,23 +124,63 @@ impl GOperation { // First 4 steps. { // a = a + b + x. - AddOperation::::eval(builder, a, b, cols.a_plus_b, shard, is_real.into()); + AddOperation::::eval( + builder, + a, + b, + cols.a_plus_b, + shard, + channel.clone(), + is_real.into(), + ); a = cols.a_plus_b.value; - AddOperation::::eval(builder, a, x, cols.a_plus_b_plus_x, shard, is_real.into()); + AddOperation::::eval( + builder, + a, + x, + cols.a_plus_b_plus_x, + shard, + channel.clone(), + is_real.into(), + ); a = cols.a_plus_b_plus_x.value; // d = (d ^ a).rotate_right(16). - XorOperation::::eval(builder, d, a, cols.d_xor_a, shard, is_real); + XorOperation::::eval( + builder, + d, + a, + cols.d_xor_a, + shard, + channel.clone(), + is_real, + ); d = cols.d_xor_a.value; // Rotate right by 16 bits. d = Word([d[2], d[3], d[0], d[1]]); // c = c + d. - AddOperation::::eval(builder, c, d, cols.c_plus_d, shard, is_real.into()); + AddOperation::::eval( + builder, + c, + d, + cols.c_plus_d, + shard, + channel.clone(), + is_real.into(), + ); c = cols.c_plus_d.value; // b = (b ^ c).rotate_right(12). - XorOperation::::eval(builder, b, c, cols.b_xor_c, shard, is_real); + XorOperation::::eval( + builder, + b, + c, + cols.b_xor_c, + shard, + channel.clone(), + is_real, + ); b = cols.b_xor_c.value; FixedRotateRightOperation::::eval( builder, @@ -142,6 +188,7 @@ impl GOperation { 12, cols.b_xor_c_rotate_right_12, shard, + channel.clone(), is_real, ); b = cols.b_xor_c_rotate_right_12.value; @@ -150,7 +197,15 @@ impl GOperation { // Second 4 steps. { // a = a + b + y. - AddOperation::::eval(builder, a, b, cols.a_plus_b_2, shard, is_real.into()); + AddOperation::::eval( + builder, + a, + b, + cols.a_plus_b_2, + shard, + channel.clone(), + is_real.into(), + ); a = cols.a_plus_b_2.value; AddOperation::::eval( builder, @@ -158,22 +213,47 @@ impl GOperation { y, cols.a_plus_b_2_add_y, shard, + channel.clone(), is_real.into(), ); a = cols.a_plus_b_2_add_y.value; // d = (d ^ a).rotate_right(8). - XorOperation::::eval(builder, d, a, cols.d_xor_a_2, shard, is_real); + XorOperation::::eval( + builder, + d, + a, + cols.d_xor_a_2, + shard, + channel.clone(), + is_real, + ); d = cols.d_xor_a_2.value; // Rotate right by 8 bits. d = Word([d[1], d[2], d[3], d[0]]); // c = c + d. - AddOperation::::eval(builder, c, d, cols.c_plus_d_2, shard, is_real.into()); + AddOperation::::eval( + builder, + c, + d, + cols.c_plus_d_2, + shard, + channel.clone(), + is_real.into(), + ); c = cols.c_plus_d_2.value; // b = (b ^ c).rotate_right(7). - XorOperation::::eval(builder, b, c, cols.b_xor_c_2, shard, is_real); + XorOperation::::eval( + builder, + b, + c, + cols.b_xor_c_2, + shard, + channel.clone(), + is_real, + ); b = cols.b_xor_c_2.value; FixedRotateRightOperation::::eval( builder, @@ -181,6 +261,7 @@ impl GOperation { 7, cols.b_xor_c_2_rotate_right_7, shard, + channel.clone(), is_real, ); b = cols.b_xor_c_2_rotate_right_7.value; diff --git a/core/src/syscall/precompiles/blake3/compress/mod.rs b/core/src/syscall/precompiles/blake3/compress/mod.rs index e8c1f8c3e1..e8d800d0df 100644 --- a/core/src/syscall/precompiles/blake3/compress/mod.rs +++ b/core/src/syscall/precompiles/blake3/compress/mod.rs @@ -94,6 +94,7 @@ pub(crate) fn g_func(input: [u32; 6]) -> [u32; 4] { pub struct Blake3CompressInnerEvent { pub clk: u32, pub shard: u32, + pub channel: u32, pub state_ptr: u32, pub message_ptr: u32, pub message_reads: [[[MemoryReadRecord; NUM_MSG_WORDS_PER_CALL]; OPERATION_COUNT]; ROUND_COUNT], diff --git a/core/src/syscall/precompiles/blake3/compress/trace.rs b/core/src/syscall/precompiles/blake3/compress/trace.rs index dec27f7939..14994cb031 100644 --- a/core/src/syscall/precompiles/blake3/compress/trace.rs +++ b/core/src/syscall/precompiles/blake3/compress/trace.rs @@ -37,6 +37,7 @@ impl MachineAir for Blake3CompressInnerChip { for i in 0..input.blake3_compress_inner_events.len() { let event = input.blake3_compress_inner_events[i].clone(); let shard = event.shard; + let channel = event.channel; let mut clk = event.clk; for round in 0..ROUND_COUNT { for operation in 0..OPERATION_COUNT { @@ -46,6 +47,7 @@ impl MachineAir for Blake3CompressInnerChip { // Assign basic values to the columns. { cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); cols.clk = F::from_canonical_u32(clk); cols.round_index = F::from_canonical_u32(round as u32); @@ -73,6 +75,7 @@ impl MachineAir for Blake3CompressInnerChip { cols.message_ptr = F::from_canonical_u32(event.message_ptr); for i in 0..NUM_MSG_WORDS_PER_CALL { cols.message_reads[i].populate( + channel, event.message_reads[round][operation][i], &mut new_byte_lookup_events, ); @@ -81,6 +84,7 @@ impl MachineAir for Blake3CompressInnerChip { cols.state_ptr = F::from_canonical_u32(event.state_ptr); for i in 0..NUM_STATE_WORDS_PER_CALL { cols.state_reads_writes[i].populate( + channel, MemoryRecordEnum::Write(event.state_writes[round][operation][i]), &mut new_byte_lookup_events, ); @@ -98,7 +102,7 @@ impl MachineAir for Blake3CompressInnerChip { event.message_reads[round][operation][1].value, ]; - cols.g.populate(output, shard, input); + cols.g.populate(output, shard, channel, input); } clk += 1; diff --git a/core/src/syscall/precompiles/edwards/ed_add.rs b/core/src/syscall/precompiles/edwards/ed_add.rs index db820faac6..4e215a0df0 100644 --- a/core/src/syscall/precompiles/edwards/ed_add.rs +++ b/core/src/syscall/precompiles/edwards/ed_add.rs @@ -52,6 +52,7 @@ pub const NUM_ED_ADD_COLS: usize = size_of::>(); pub struct EdAddAssignCols { pub is_real: T, pub shard: T, + pub channel: T, pub clk: T, pub p_ptr: T, pub q_ptr: T, @@ -78,9 +79,12 @@ impl EdAddAssignChip { _marker: PhantomData, } } + + #[allow(clippy::too_many_arguments)] fn populate_field_ops( record: &mut impl ByteRecord, shard: u32, + channel: u32, cols: &mut EdAddAssignCols, p_x: BigUint, p_y: BigUint, @@ -90,34 +94,41 @@ impl EdAddAssignChip { let x3_numerator = cols.x3_numerator.populate( record, shard, + channel, &[p_x.clone(), q_x.clone()], &[q_y.clone(), p_y.clone()], ); let y3_numerator = cols.y3_numerator.populate( record, shard, + channel, &[p_y.clone(), p_x.clone()], &[q_y.clone(), q_x.clone()], ); - let x1_mul_y1 = cols - .x1_mul_y1 - .populate(record, shard, &p_x, &p_y, FieldOperation::Mul); - let x2_mul_y2 = cols - .x2_mul_y2 - .populate(record, shard, &q_x, &q_y, FieldOperation::Mul); - let f = cols - .f - .populate(record, shard, &x1_mul_y1, &x2_mul_y2, FieldOperation::Mul); + let x1_mul_y1 = + cols.x1_mul_y1 + .populate(record, shard, channel, &p_x, &p_y, FieldOperation::Mul); + let x2_mul_y2 = + cols.x2_mul_y2 + .populate(record, shard, channel, &q_x, &q_y, FieldOperation::Mul); + let f = cols.f.populate( + record, + shard, + channel, + &x1_mul_y1, + &x2_mul_y2, + FieldOperation::Mul, + ); let d = E::d_biguint(); let d_mul_f = cols .d_mul_f - .populate(record, shard, &f, &d, FieldOperation::Mul); + .populate(record, shard, channel, &f, &d, FieldOperation::Mul); cols.x3_ins - .populate(record, shard, &x3_numerator, &d_mul_f, true); + .populate(record, shard, channel, &x3_numerator, &d_mul_f, true); cols.y3_ins - .populate(record, shard, &y3_numerator, &d_mul_f, false); + .populate(record, shard, channel, &y3_numerator, &d_mul_f, false); } } @@ -168,6 +179,7 @@ impl MachineAir for Ed // Populate basic columns. cols.is_real = F::one(); cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.p_ptr = F::from_canonical_u32(event.p_ptr); cols.q_ptr = F::from_canonical_u32(event.q_ptr); @@ -176,6 +188,7 @@ impl MachineAir for Ed Self::populate_field_ops( &mut new_byte_lookup_events, event.shard, + event.channel, cols, p_x, p_y, @@ -185,12 +198,18 @@ impl MachineAir for Ed // Populate the memory access columns. for i in 0..WORDS_CURVE_POINT { - cols.q_access[i] - .populate(event.q_memory_records[i], &mut new_byte_lookup_events); + cols.q_access[i].populate( + event.channel, + event.q_memory_records[i], + &mut new_byte_lookup_events, + ); } for i in 0..WORDS_CURVE_POINT { - cols.p_access[i] - .populate(event.p_memory_records[i], &mut new_byte_lookup_events); + cols.p_access[i].populate( + event.channel, + event.p_memory_records[i], + &mut new_byte_lookup_events, + ); } (row, new_byte_lookup_events) @@ -208,6 +227,7 @@ impl MachineAir for Ed Self::populate_field_ops( &mut vec![], 0, + 0, cols, zero.clone(), zero.clone(), @@ -250,12 +270,24 @@ where let y2 = limbs_from_prev_access(&row.q_access[8..16]); // x3_numerator = x1 * y2 + x2 * y1. - row.x3_numerator - .eval(builder, &[x1, x2], &[y2, y1], row.shard, row.is_real); + row.x3_numerator.eval( + builder, + &[x1, x2], + &[y2, y1], + row.shard, + row.channel, + row.is_real, + ); // y3_numerator = y1 * y2 + x1 * x2. - row.y3_numerator - .eval(builder, &[y1, x1], &[y2, x2], row.shard, row.is_real); + row.y3_numerator.eval( + builder, + &[y1, x1], + &[y2, x2], + row.shard, + row.channel, + row.is_real, + ); // f = x1 * x2 * y1 * y2. row.x1_mul_y1.eval( @@ -264,6 +296,7 @@ where &y1, FieldOperation::Mul, row.shard, + row.channel, row.is_real, ); row.x2_mul_y2.eval( @@ -272,6 +305,7 @@ where &y2, FieldOperation::Mul, row.shard, + row.channel, row.is_real, ); @@ -283,6 +317,7 @@ where &x2_mul_y2, FieldOperation::Mul, row.shard, + row.channel, row.is_real, ); @@ -296,6 +331,7 @@ where &d_const, FieldOperation::Mul, row.shard, + row.channel, row.is_real, ); @@ -308,6 +344,7 @@ where &d_mul_f, true, row.shard, + row.channel, row.is_real, ); @@ -318,6 +355,7 @@ where &d_mul_f, false, row.shard, + row.channel, row.is_real, ); @@ -334,6 +372,7 @@ where builder.eval_memory_access_slice( row.shard, + row.channel, row.clk.into(), row.q_ptr, &row.q_access, @@ -342,6 +381,7 @@ where builder.eval_memory_access_slice( row.shard, + row.channel, row.clk + AB::F::from_canonical_u32(1), row.p_ptr, &row.p_access, @@ -350,6 +390,7 @@ where builder.receive_syscall( row.shard, + row.channel, row.clk, AB::F::from_canonical_u32(SyscallCode::ED_ADD.syscall_id()), row.p_ptr, diff --git a/core/src/syscall/precompiles/edwards/ed_decompress.rs b/core/src/syscall/precompiles/edwards/ed_decompress.rs index 62da4f9c3e..3833e21e93 100644 --- a/core/src/syscall/precompiles/edwards/ed_decompress.rs +++ b/core/src/syscall/precompiles/edwards/ed_decompress.rs @@ -54,6 +54,7 @@ use super::{WordsFieldElement, WORDS_FIELD_ELEMENT}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct EdDecompressEvent { pub shard: u32, + pub channel: u32, pub clk: u32, pub ptr: u32, pub sign: bool, @@ -75,6 +76,7 @@ pub const NUM_ED_DECOMPRESS_COLS: usize = size_of::>(); pub struct EdDecompressCols { pub is_real: T, pub shard: T, + pub channel: T, pub clk: T, pub ptr: T, pub sign: T, @@ -99,16 +101,25 @@ impl EdDecompressCols { let mut new_byte_lookup_events = Vec::new(); self.is_real = F::from_bool(true); self.shard = F::from_canonical_u32(event.shard); + self.channel = F::from_canonical_u32(event.channel); self.clk = F::from_canonical_u32(event.clk); self.ptr = F::from_canonical_u32(event.ptr); self.sign = F::from_bool(event.sign); for i in 0..8 { - self.x_access[i].populate(event.x_memory_records[i], &mut new_byte_lookup_events); - self.y_access[i].populate(event.y_memory_records[i], &mut new_byte_lookup_events); + self.x_access[i].populate( + event.channel, + event.x_memory_records[i], + &mut new_byte_lookup_events, + ); + self.y_access[i].populate( + event.channel, + event.y_memory_records[i], + &mut new_byte_lookup_events, + ); } let y = &BigUint::from_bytes_le(&event.y_bytes); - self.populate_field_ops::(&mut new_byte_lookup_events, event.shard, y); + self.populate_field_ops::(&mut new_byte_lookup_events, event.shard, event.channel, y); record.add_byte_lookup_events(new_byte_lookup_events); } @@ -117,28 +128,42 @@ impl EdDecompressCols { &mut self, blu_events: &mut Vec, shard: u32, + channel: u32, y: &BigUint, ) { let one = BigUint::one(); - self.y_range.populate(blu_events, shard, y); + self.y_range.populate(blu_events, shard, channel, y); let yy = self .yy - .populate(blu_events, shard, y, y, FieldOperation::Mul); + .populate(blu_events, shard, channel, y, y, FieldOperation::Mul); let u = self .u - .populate(blu_events, shard, &yy, &one, FieldOperation::Sub); - let dyy = self - .dyy - .populate(blu_events, shard, &E::d_biguint(), &yy, FieldOperation::Mul); + .populate(blu_events, shard, channel, &yy, &one, FieldOperation::Sub); + let dyy = self.dyy.populate( + blu_events, + shard, + channel, + &E::d_biguint(), + &yy, + FieldOperation::Mul, + ); let v = self .v - .populate(blu_events, shard, &one, &dyy, FieldOperation::Add); - let u_div_v = self - .u_div_v - .populate(blu_events, shard, &u, &v, FieldOperation::Div); - let x = self.x.populate(blu_events, shard, &u_div_v, ed25519_sqrt); - self.neg_x - .populate(blu_events, shard, &BigUint::zero(), &x, FieldOperation::Sub); + .populate(blu_events, shard, channel, &one, &dyy, FieldOperation::Add); + let u_div_v = + self.u_div_v + .populate(blu_events, shard, channel, &u, &v, FieldOperation::Div); + let x = self + .x + .populate(blu_events, shard, channel, &u_div_v, ed25519_sqrt); + self.neg_x.populate( + blu_events, + shard, + channel, + &BigUint::zero(), + &x, + FieldOperation::Sub, + ); } } @@ -152,13 +177,15 @@ impl EdDecompressCols { builder.assert_bool(self.sign); let y: Limbs = limbs_from_prev_access(&self.y_access); - self.y_range.eval(builder, &y, self.shard, self.is_real); + self.y_range + .eval(builder, &y, self.shard, self.channel, self.is_real); self.yy.eval( builder, &y, &y, FieldOperation::Mul, self.shard, + self.channel, self.is_real, ); self.u.eval( @@ -167,6 +194,7 @@ impl EdDecompressCols { &[AB::Expr::one()].iter(), FieldOperation::Sub, self.shard, + self.channel, self.is_real, ); let d_biguint = E::d_biguint(); @@ -177,6 +205,7 @@ impl EdDecompressCols { &self.yy.result, FieldOperation::Mul, self.shard, + self.channel, self.is_real, ); self.v.eval( @@ -185,6 +214,7 @@ impl EdDecompressCols { &self.dyy.result, FieldOperation::Add, self.shard, + self.channel, self.is_real, ); self.u_div_v.eval( @@ -193,6 +223,7 @@ impl EdDecompressCols { &self.v.result, FieldOperation::Div, self.shard, + self.channel, self.is_real, ); self.x.eval( @@ -200,6 +231,7 @@ impl EdDecompressCols { &self.u_div_v.result, AB::F::zero(), self.shard, + self.channel, self.is_real, ); self.neg_x.eval( @@ -208,11 +240,13 @@ impl EdDecompressCols { &self.x.multiplication.result, FieldOperation::Sub, self.shard, + self.channel, self.is_real, ); builder.eval_memory_access_slice( self.shard, + self.channel, self.clk, self.ptr, &self.x_access, @@ -220,6 +254,7 @@ impl EdDecompressCols { ); builder.eval_memory_access_slice( self.shard, + self.channel, self.clk, self.ptr.into() + AB::F::from_canonical_u32(32), &self.y_access, @@ -239,6 +274,7 @@ impl EdDecompressCols { builder.receive_syscall( self.shard, + self.channel, self.clk, AB::F::from_canonical_u32(SyscallCode::ED_DECOMPRESS.syscall_id()), self.ptr, @@ -291,10 +327,12 @@ impl Syscall for EdDecompressChip { let x_memory_records: [MemoryWriteRecord; 8] = x_memory_records_vec.try_into().unwrap(); let shard = rt.current_shard(); + let channel = rt.current_channel(); rt.record_mut() .ed_decompress_events .push(EdDecompressEvent { shard, + channel, clk: start_clk, ptr: slice_ptr, sign: sign_bool, @@ -348,7 +386,7 @@ impl MachineAir for EdDecompressChip = row.as_mut_slice().borrow_mut(); let zero = BigUint::zero(); - cols.populate_field_ops::(&mut vec![], 0, &zero); + cols.populate_field_ops::(&mut vec![], 0, 0, &zero); row }); diff --git a/core/src/syscall/precompiles/keccak256/air.rs b/core/src/syscall/precompiles/keccak256/air.rs index ceda18305c..8be89ce65b 100644 --- a/core/src/syscall/precompiles/keccak256/air.rs +++ b/core/src/syscall/precompiles/keccak256/air.rs @@ -54,6 +54,7 @@ where builder.eval_memory_access( local.shard, + local.channel, local.clk + final_step, // The clk increments by 1 after a final step local.state_addr + AB::Expr::from_canonical_u32(i * 4), &local.state_mem[i as usize], @@ -65,6 +66,7 @@ where builder.assert_eq(local.receive_ecall, first_step * local.is_real); builder.receive_syscall( local.shard, + local.channel, local.clk, AB::F::from_canonical_u32(SyscallCode::KECCAK_PERMUTE.syscall_id()), local.state_addr, diff --git a/core/src/syscall/precompiles/keccak256/columns.rs b/core/src/syscall/precompiles/keccak256/columns.rs index 68e4035d18..a3e2dd3044 100644 --- a/core/src/syscall/precompiles/keccak256/columns.rs +++ b/core/src/syscall/precompiles/keccak256/columns.rs @@ -18,6 +18,7 @@ pub(crate) struct KeccakMemCols { pub keccak: KeccakCols, pub shard: T, + pub channel: T, pub clk: T, pub state_addr: T, diff --git a/core/src/syscall/precompiles/keccak256/execute.rs b/core/src/syscall/precompiles/keccak256/execute.rs index bf30c43a9f..d6c306c45f 100644 --- a/core/src/syscall/precompiles/keccak256/execute.rs +++ b/core/src/syscall/precompiles/keccak256/execute.rs @@ -98,10 +98,12 @@ impl Syscall for KeccakPermuteChip { // Push the Keccak permute event. let shard = rt.current_shard(); + let channel = rt.current_channel(); rt.record_mut() .keccak_permute_events .push(KeccakPermuteEvent { shard, + channel, clk: start_clk, pre_state: saved_state.as_slice().try_into().unwrap(), post_state: state.as_slice().try_into().unwrap(), diff --git a/core/src/syscall/precompiles/keccak256/mod.rs b/core/src/syscall/precompiles/keccak256/mod.rs index b44ce53f05..67f733bba0 100644 --- a/core/src/syscall/precompiles/keccak256/mod.rs +++ b/core/src/syscall/precompiles/keccak256/mod.rs @@ -16,6 +16,7 @@ const STATE_NUM_WORDS: usize = STATE_SIZE * 2; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct KeccakPermuteEvent { pub shard: u32, + pub channel: u32, pub clk: u32, pub pre_state: [u64; STATE_SIZE], pub post_state: [u64; STATE_SIZE], diff --git a/core/src/syscall/precompiles/keccak256/trace.rs b/core/src/syscall/precompiles/keccak256/trace.rs index bad43967df..01b07fb743 100644 --- a/core/src/syscall/precompiles/keccak256/trace.rs +++ b/core/src/syscall/precompiles/keccak256/trace.rs @@ -56,6 +56,7 @@ impl MachineAir for KeccakPermuteChip { let event = &input.keccak_permute_events[*event_index]; let start_clk = event.clk; let shard = event.shard; + let channel = event.channel; // Create all the rows for the permutation. for i in 0..NUM_ROUNDS { @@ -68,6 +69,7 @@ impl MachineAir for KeccakPermuteChip { let cols: &mut KeccakMemCols = row.as_mut_slice().borrow_mut(); cols.shard = F::from_canonical_u32(shard); + cols.channel = F::from_canonical_u32(channel); cols.clk = F::from_canonical_u32(start_clk); cols.state_addr = F::from_canonical_u32(event.state_addr); cols.is_real = F::one(); @@ -76,8 +78,11 @@ impl MachineAir for KeccakPermuteChip { if i == 0 { for (j, read_record) in event.state_read_records.iter().enumerate() { - cols.state_mem[j] - .populate_read(*read_record, &mut new_byte_lookup_events); + cols.state_mem[j].populate_read( + channel, + *read_record, + &mut new_byte_lookup_events, + ); } cols.do_memory_check = F::one(); @@ -89,8 +94,11 @@ impl MachineAir for KeccakPermuteChip { for (j, write_record) in event.state_write_records.iter().enumerate() { - cols.state_mem[j] - .populate_write(*write_record, &mut new_byte_lookup_events); + cols.state_mem[j].populate_write( + channel, + *write_record, + &mut new_byte_lookup_events, + ); } cols.do_memory_check = F::one(); diff --git a/core/src/syscall/precompiles/mod.rs b/core/src/syscall/precompiles/mod.rs index f33626e7b1..7b107e2d5b 100644 --- a/core/src/syscall/precompiles/mod.rs +++ b/core/src/syscall/precompiles/mod.rs @@ -21,6 +21,7 @@ use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ECAddEvent { pub shard: u32, + pub channel: u32, pub clk: u32, pub p_ptr: u32, pub p: Vec, @@ -68,6 +69,7 @@ pub fn create_ec_add_event( ECAddEvent { shard: rt.current_shard(), + channel: rt.current_channel(), clk: start_clk, p_ptr, p, @@ -82,6 +84,7 @@ pub fn create_ec_add_event( #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ECDoubleEvent { pub shard: u32, + pub channel: u32, pub clk: u32, pub p_ptr: u32, pub p: Vec, @@ -117,6 +120,7 @@ pub fn create_ec_double_event( ECDoubleEvent { shard: rt.current_shard(), + channel: rt.current_channel(), clk: start_clk, p_ptr, p, @@ -128,6 +132,7 @@ pub fn create_ec_double_event( #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ECDecompressEvent { pub shard: u32, + pub channel: u32, pub clk: u32, pub ptr: u32, pub is_odd: bool, @@ -172,6 +177,7 @@ pub fn create_ec_decompress_event( ECDecompressEvent { shard: rt.current_shard(), + channel: rt.current_channel(), clk: start_clk, ptr: slice_ptr, is_odd: is_odd != 0, diff --git a/core/src/syscall/precompiles/sha256/compress/air.rs b/core/src/syscall/precompiles/sha256/compress/air.rs index 031b08a308..2f4bd5000a 100644 --- a/core/src/syscall/precompiles/sha256/compress/air.rs +++ b/core/src/syscall/precompiles/sha256/compress/air.rs @@ -44,6 +44,7 @@ where ); builder.receive_syscall( local.shard, + local.channel, local.clk, AB::F::from_canonical_u32(SyscallCode::SHA_COMPRESS.syscall_id()), local.w_ptr, @@ -203,6 +204,7 @@ impl ShaCompressChip { let is_finalize = local.octet_num[9]; builder.eval_memory_access( local.shard, + local.channel, local.clk + is_finalize, local.mem_addr, &local.mem, @@ -292,6 +294,7 @@ impl ShaCompressChip { 6, local.e_rr_6, local.shard, + local.channel, local.is_compression, ); // Calculate e rightrotate 11. @@ -301,6 +304,7 @@ impl ShaCompressChip { 11, local.e_rr_11, local.shard, + local.channel, local.is_compression, ); // Calculate e rightrotate 25. @@ -310,6 +314,7 @@ impl ShaCompressChip { 25, local.e_rr_25, local.shard, + local.channel, local.is_compression, ); // Calculate (e rightrotate 6) xor (e rightrotate 11). @@ -319,6 +324,7 @@ impl ShaCompressChip { local.e_rr_11.value, local.s1_intermediate, local.shard, + local.channel, local.is_compression, ); // Calculate S1 := ((e rightrotate 6) xor (e rightrotate 11)) xor (e rightrotate 25). @@ -328,6 +334,7 @@ impl ShaCompressChip { local.e_rr_25.value, local.s1, local.shard, + local.channel, local.is_compression, ); @@ -339,6 +346,7 @@ impl ShaCompressChip { local.f, local.e_and_f, local.shard, + local.channel, local.is_compression, ); // Calculate not e. @@ -347,6 +355,7 @@ impl ShaCompressChip { local.e, local.e_not, local.shard, + local.channel, local.is_compression, ); // Calculate (not e) and g. @@ -356,6 +365,7 @@ impl ShaCompressChip { local.g, local.e_not_and_g, local.shard, + local.channel, local.is_compression, ); // Calculate ch := (e and f) xor ((not e) and g). @@ -365,6 +375,7 @@ impl ShaCompressChip { local.e_not_and_g.value, local.ch, local.shard, + local.channel, local.is_compression, ); @@ -379,6 +390,7 @@ impl ShaCompressChip { local.mem.access.value, ], local.shard, + local.channel, local.is_compression, local.temp1, ); @@ -391,6 +403,7 @@ impl ShaCompressChip { 2, local.a_rr_2, local.shard, + local.channel, local.is_compression, ); // Calculate a rightrotate 13. @@ -400,6 +413,7 @@ impl ShaCompressChip { 13, local.a_rr_13, local.shard, + local.channel, local.is_compression, ); // Calculate a rightrotate 22. @@ -409,6 +423,7 @@ impl ShaCompressChip { 22, local.a_rr_22, local.shard, + local.channel, local.is_compression, ); // Calculate (a rightrotate 2) xor (a rightrotate 13). @@ -418,6 +433,7 @@ impl ShaCompressChip { local.a_rr_13.value, local.s0_intermediate, local.shard, + local.channel, local.is_compression, ); // Calculate S0 := ((a rightrotate 2) xor (a rightrotate 13)) xor (a rightrotate 22). @@ -427,6 +443,7 @@ impl ShaCompressChip { local.a_rr_22.value, local.s0, local.shard, + local.channel, local.is_compression, ); @@ -438,6 +455,7 @@ impl ShaCompressChip { local.b, local.a_and_b, local.shard, + local.channel, local.is_compression, ); // Calculate a and c. @@ -447,6 +465,7 @@ impl ShaCompressChip { local.c, local.a_and_c, local.shard, + local.channel, local.is_compression, ); // Calculate b and c. @@ -456,6 +475,7 @@ impl ShaCompressChip { local.c, local.b_and_c, local.shard, + local.channel, local.is_compression, ); // Calculate (a and b) xor (a and c). @@ -465,6 +485,7 @@ impl ShaCompressChip { local.a_and_c.value, local.maj_intermediate, local.shard, + local.channel, local.is_compression, ); // Calculate maj := ((a and b) xor (a and c)) xor (b and c). @@ -474,6 +495,7 @@ impl ShaCompressChip { local.b_and_c.value, local.maj, local.shard, + local.channel, local.is_compression, ); @@ -484,6 +506,7 @@ impl ShaCompressChip { local.maj.value, local.temp2, local.shard, + local.channel, local.is_compression.into(), ); @@ -494,6 +517,7 @@ impl ShaCompressChip { local.temp1.value, local.d_add_temp1, local.shard, + local.channel, local.is_compression.into(), ); @@ -504,6 +528,7 @@ impl ShaCompressChip { local.temp2.value, local.temp1_add_temp2, local.shard, + local.channel, local.is_compression.into(), ); @@ -581,6 +606,7 @@ impl ShaCompressChip { local.finalized_operand, local.finalize_add, local.shard, + local.channel, is_finalize.into(), ); diff --git a/core/src/syscall/precompiles/sha256/compress/columns.rs b/core/src/syscall/precompiles/sha256/compress/columns.rs index cf990e0385..94a200aedd 100644 --- a/core/src/syscall/precompiles/sha256/compress/columns.rs +++ b/core/src/syscall/precompiles/sha256/compress/columns.rs @@ -25,6 +25,7 @@ pub const NUM_SHA_COMPRESS_COLS: usize = size_of::>(); pub struct ShaCompressCols { /// Inputs. pub shard: T, + pub channel: T, pub clk: T, pub w_ptr: T, pub h_ptr: T, diff --git a/core/src/syscall/precompiles/sha256/compress/execute.rs b/core/src/syscall/precompiles/sha256/compress/execute.rs index 72ee312a5e..a019abbd4c 100644 --- a/core/src/syscall/precompiles/sha256/compress/execute.rs +++ b/core/src/syscall/precompiles/sha256/compress/execute.rs @@ -77,8 +77,10 @@ impl Syscall for ShaCompressChip { // Push the SHA extend event. let shard = rt.current_shard(); + let channel = rt.current_channel(); rt.record_mut().sha_compress_events.push(ShaCompressEvent { shard, + channel, clk: start_clk, w_ptr, h_ptr, diff --git a/core/src/syscall/precompiles/sha256/compress/mod.rs b/core/src/syscall/precompiles/sha256/compress/mod.rs index e95669cee4..5d209b4a97 100644 --- a/core/src/syscall/precompiles/sha256/compress/mod.rs +++ b/core/src/syscall/precompiles/sha256/compress/mod.rs @@ -21,6 +21,7 @@ pub const SHA_COMPRESS_K: [u32; 64] = [ #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ShaCompressEvent { pub shard: u32, + pub channel: u32, pub clk: u32, pub w_ptr: u32, pub h_ptr: u32, diff --git a/core/src/syscall/precompiles/sha256/compress/trace.rs b/core/src/syscall/precompiles/sha256/compress/trace.rs index 9f877fd874..bd0b8f8177 100644 --- a/core/src/syscall/precompiles/sha256/compress/trace.rs +++ b/core/src/syscall/precompiles/sha256/compress/trace.rs @@ -34,6 +34,7 @@ impl MachineAir for ShaCompressChip { for i in 0..input.sha_compress_events.len() { let mut event = input.sha_compress_events[i].clone(); let shard = event.shard; + let channel = event.channel; let og_h = event.h; @@ -45,6 +46,7 @@ impl MachineAir for ShaCompressChip { let cols: &mut ShaCompressCols = row.as_mut_slice().borrow_mut(); cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.w_ptr = F::from_canonical_u32(event.w_ptr); cols.h_ptr = F::from_canonical_u32(event.h_ptr); @@ -52,8 +54,11 @@ impl MachineAir for ShaCompressChip { cols.octet[j] = F::one(); cols.octet_num[octet_num_idx] = F::one(); - cols.mem - .populate_read(event.h_read_records[j], &mut new_byte_lookup_events); + cols.mem.populate_read( + channel, + event.h_read_records[j], + &mut new_byte_lookup_events, + ); cols.mem_addr = F::from_canonical_u32(event.h_ptr + (j * 4) as u32); cols.a = Word::from(event.h_read_records[0].value); @@ -84,11 +89,15 @@ impl MachineAir for ShaCompressChip { cols.octet_num[octet_num_idx] = F::one(); cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.w_ptr = F::from_canonical_u32(event.w_ptr); cols.h_ptr = F::from_canonical_u32(event.h_ptr); - cols.mem - .populate_read(event.w_i_read_records[j], &mut new_byte_lookup_events); + cols.mem.populate_read( + channel, + event.w_i_read_records[j], + &mut new_byte_lookup_events, + ); cols.mem_addr = F::from_canonical_u32(event.w_ptr + (j * 4) as u32); let a = event.h[0]; @@ -108,43 +117,60 @@ impl MachineAir for ShaCompressChip { cols.g = Word::from(g); cols.h = Word::from(h); - let e_rr_6 = cols.e_rr_6.populate(output, shard, e, 6); - let e_rr_11 = cols.e_rr_11.populate(output, shard, e, 11); - let e_rr_25 = cols.e_rr_25.populate(output, shard, e, 25); + let e_rr_6 = cols.e_rr_6.populate(output, shard, channel, e, 6); + let e_rr_11 = cols.e_rr_11.populate(output, shard, channel, e, 11); + let e_rr_25 = cols.e_rr_25.populate(output, shard, channel, e, 25); let s1_intermediate = cols .s1_intermediate - .populate(output, shard, e_rr_6, e_rr_11); - let s1 = cols.s1.populate(output, shard, s1_intermediate, e_rr_25); - - let e_and_f = cols.e_and_f.populate(output, shard, e, f); - let e_not = cols.e_not.populate(output, shard, e); - let e_not_and_g = cols.e_not_and_g.populate(output, shard, e_not, g); - let ch = cols.ch.populate(output, shard, e_and_f, e_not_and_g); - - let temp1 = - cols.temp1 - .populate(output, shard, h, s1, ch, event.w[j], SHA_COMPRESS_K[j]); - - let a_rr_2 = cols.a_rr_2.populate(output, shard, a, 2); - let a_rr_13 = cols.a_rr_13.populate(output, shard, a, 13); - let a_rr_22 = cols.a_rr_22.populate(output, shard, a, 22); + .populate(output, shard, channel, e_rr_6, e_rr_11); + let s1 = cols + .s1 + .populate(output, shard, channel, s1_intermediate, e_rr_25); + + let e_and_f = cols.e_and_f.populate(output, shard, channel, e, f); + let e_not = cols.e_not.populate(output, shard, channel, e); + let e_not_and_g = cols.e_not_and_g.populate(output, shard, channel, e_not, g); + let ch = cols + .ch + .populate(output, shard, channel, e_and_f, e_not_and_g); + + let temp1 = cols.temp1.populate( + output, + shard, + channel, + h, + s1, + ch, + event.w[j], + SHA_COMPRESS_K[j], + ); + + let a_rr_2 = cols.a_rr_2.populate(output, shard, channel, a, 2); + let a_rr_13 = cols.a_rr_13.populate(output, shard, channel, a, 13); + let a_rr_22 = cols.a_rr_22.populate(output, shard, channel, a, 22); let s0_intermediate = cols .s0_intermediate - .populate(output, shard, a_rr_2, a_rr_13); - let s0 = cols.s0.populate(output, shard, s0_intermediate, a_rr_22); - - let a_and_b = cols.a_and_b.populate(output, shard, a, b); - let a_and_c = cols.a_and_c.populate(output, shard, a, c); - let b_and_c = cols.b_and_c.populate(output, shard, b, c); + .populate(output, shard, channel, a_rr_2, a_rr_13); + let s0 = cols + .s0 + .populate(output, shard, channel, s0_intermediate, a_rr_22); + + let a_and_b = cols.a_and_b.populate(output, shard, channel, a, b); + let a_and_c = cols.a_and_c.populate(output, shard, channel, a, c); + let b_and_c = cols.b_and_c.populate(output, shard, channel, b, c); let maj_intermediate = cols .maj_intermediate - .populate(output, shard, a_and_b, a_and_c); - let maj = cols.maj.populate(output, shard, maj_intermediate, b_and_c); + .populate(output, shard, channel, a_and_b, a_and_c); + let maj = cols + .maj + .populate(output, shard, channel, maj_intermediate, b_and_c); - let temp2 = cols.temp2.populate(output, shard, s0, maj); + let temp2 = cols.temp2.populate(output, shard, channel, s0, maj); - let d_add_temp1 = cols.d_add_temp1.populate(output, shard, d, temp1); - let temp1_add_temp2 = cols.temp1_add_temp2.populate(output, shard, temp1, temp2); + let d_add_temp1 = cols.d_add_temp1.populate(output, shard, channel, d, temp1); + let temp1_add_temp2 = cols + .temp1_add_temp2 + .populate(output, shard, channel, temp1, temp2); event.h[7] = g; event.h[6] = f; @@ -174,6 +200,7 @@ impl MachineAir for ShaCompressChip { let cols: &mut ShaCompressCols = row.as_mut_slice().borrow_mut(); cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.w_ptr = F::from_canonical_u32(event.w_ptr); cols.h_ptr = F::from_canonical_u32(event.h_ptr); @@ -182,9 +209,12 @@ impl MachineAir for ShaCompressChip { cols.octet_num[octet_num_idx] = F::one(); cols.finalize_add - .populate(output, shard, og_h[j], event.h[j]); - cols.mem - .populate_write(event.h_write_records[j], &mut new_byte_lookup_events); + .populate(output, shard, channel, og_h[j], event.h[j]); + cols.mem.populate_write( + channel, + event.h_write_records[j], + &mut new_byte_lookup_events, + ); cols.mem_addr = F::from_canonical_u32(event.h_ptr + (j * 4) as u32); v[j] = event.h[j]; diff --git a/core/src/syscall/precompiles/sha256/extend/air.rs b/core/src/syscall/precompiles/sha256/extend/air.rs index 6058afd3d3..9da6048048 100644 --- a/core/src/syscall/precompiles/sha256/extend/air.rs +++ b/core/src/syscall/precompiles/sha256/extend/air.rs @@ -50,6 +50,7 @@ where // Read w[i-15]. builder.eval_memory_access( local.shard, + local.channel, local.clk + (local.i - i_start), local.w_ptr + (local.i - AB::F::from_canonical_u32(15)) * nb_bytes_in_word, &local.w_i_minus_15, @@ -59,6 +60,7 @@ where // Read w[i-2]. builder.eval_memory_access( local.shard, + local.channel, local.clk + (local.i - i_start), local.w_ptr + (local.i - AB::F::from_canonical_u32(2)) * nb_bytes_in_word, &local.w_i_minus_2, @@ -68,6 +70,7 @@ where // Read w[i-16]. builder.eval_memory_access( local.shard, + local.channel, local.clk + (local.i - i_start), local.w_ptr + (local.i - AB::F::from_canonical_u32(16)) * nb_bytes_in_word, &local.w_i_minus_16, @@ -77,6 +80,7 @@ where // Read w[i-7]. builder.eval_memory_access( local.shard, + local.channel, local.clk + (local.i - i_start), local.w_ptr + (local.i - AB::F::from_canonical_u32(7)) * nb_bytes_in_word, &local.w_i_minus_7, @@ -91,6 +95,7 @@ where 7, local.w_i_minus_15_rr_7, local.shard, + local.channel, local.is_real, ); // w[i-15] rightrotate 18. @@ -100,6 +105,7 @@ where 18, local.w_i_minus_15_rr_18, local.shard, + local.channel, local.is_real, ); // w[i-15] rightshift 3. @@ -109,6 +115,7 @@ where 3, local.w_i_minus_15_rs_3, local.shard, + local.channel, local.is_real, ); // (w[i-15] rightrotate 7) xor (w[i-15] rightrotate 18) @@ -118,6 +125,7 @@ where local.w_i_minus_15_rr_18.value, local.s0_intermediate, local.shard, + local.channel, local.is_real, ); // s0 := (w[i-15] rightrotate 7) xor (w[i-15] rightrotate 18) xor (w[i-15] rightshift 3) @@ -127,6 +135,7 @@ where local.w_i_minus_15_rs_3.value, local.s0, local.shard, + local.channel, local.is_real, ); @@ -138,6 +147,7 @@ where 17, local.w_i_minus_2_rr_17, local.shard, + local.channel, local.is_real, ); // w[i-2] rightrotate 19. @@ -147,6 +157,7 @@ where 19, local.w_i_minus_2_rr_19, local.shard, + local.channel, local.is_real, ); // w[i-2] rightshift 10. @@ -156,6 +167,7 @@ where 10, local.w_i_minus_2_rs_10, local.shard, + local.channel, local.is_real, ); // (w[i-2] rightrotate 17) xor (w[i-2] rightrotate 19) @@ -165,6 +177,7 @@ where local.w_i_minus_2_rr_19.value, local.s1_intermediate, local.shard, + local.channel, local.is_real, ); // s1 := (w[i-2] rightrotate 17) xor (w[i-2] rightrotate 19) xor (w[i-2] rightshift 10) @@ -174,6 +187,7 @@ where local.w_i_minus_2_rs_10.value, local.s1, local.shard, + local.channel, local.is_real, ); @@ -185,6 +199,7 @@ where *local.w_i_minus_7.value(), local.s1.value, local.shard, + local.channel, local.is_real, local.s2, ); @@ -192,6 +207,7 @@ where // Write `s2` to `w[i]`. builder.eval_memory_access( local.shard, + local.channel, local.clk + (local.i - i_start), local.w_ptr + local.i * nb_bytes_in_word, &local.w_i, @@ -201,6 +217,7 @@ where // Receive syscall event in first row of 48-cycle. builder.receive_syscall( local.shard, + local.channel, local.clk, AB::F::from_canonical_u32(SyscallCode::SHA_EXTEND.syscall_id()), local.w_ptr, diff --git a/core/src/syscall/precompiles/sha256/extend/columns.rs b/core/src/syscall/precompiles/sha256/extend/columns.rs index a4197ce7f5..5eb99e1f4d 100644 --- a/core/src/syscall/precompiles/sha256/extend/columns.rs +++ b/core/src/syscall/precompiles/sha256/extend/columns.rs @@ -17,6 +17,7 @@ pub const NUM_SHA_EXTEND_COLS: usize = size_of::>(); pub struct ShaExtendCols { /// Inputs. pub shard: T, + pub channel: T, pub clk: T, pub w_ptr: T, diff --git a/core/src/syscall/precompiles/sha256/extend/execute.rs b/core/src/syscall/precompiles/sha256/extend/execute.rs index 467029bd9d..bd163c26c9 100644 --- a/core/src/syscall/precompiles/sha256/extend/execute.rs +++ b/core/src/syscall/precompiles/sha256/extend/execute.rs @@ -61,8 +61,10 @@ impl Syscall for ShaExtendChip { // Push the SHA extend event. let shard = rt.current_shard(); + let channel = rt.current_channel(); rt.record_mut().sha_extend_events.push(ShaExtendEvent { shard, + channel, clk: clk_init, w_ptr: w_ptr_init, w_i_minus_15_reads, diff --git a/core/src/syscall/precompiles/sha256/extend/mod.rs b/core/src/syscall/precompiles/sha256/extend/mod.rs index 529e7c2687..873e3c2fa1 100644 --- a/core/src/syscall/precompiles/sha256/extend/mod.rs +++ b/core/src/syscall/precompiles/sha256/extend/mod.rs @@ -12,6 +12,7 @@ use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ShaExtendEvent { pub shard: u32, + pub channel: u32, pub clk: u32, pub w_ptr: u32, pub w_i_minus_15_reads: Vec, @@ -90,7 +91,7 @@ pub mod extend_tests { #[test] fn generate_trace() { let mut shard = ExecutionRecord::default(); - shard.add_events = vec![AluEvent::new(0, 0, Opcode::ADD, 14, 8, 6)]; + shard.add_events = vec![AluEvent::new(0, 0, 0, Opcode::ADD, 14, 8, 6)]; let chip = ShaExtendChip::new(); let trace: RowMajorMatrix = chip.generate_trace(&shard, &mut ExecutionRecord::default()); diff --git a/core/src/syscall/precompiles/sha256/extend/trace.rs b/core/src/syscall/precompiles/sha256/extend/trace.rs index 819b0d6146..2a976ef0d6 100644 --- a/core/src/syscall/precompiles/sha256/extend/trace.rs +++ b/core/src/syscall/precompiles/sha256/extend/trace.rs @@ -37,68 +37,105 @@ impl MachineAir for ShaExtendChip { cols.is_real = F::one(); cols.populate_flags(j); cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.w_ptr = F::from_canonical_u32(event.w_ptr); - cols.w_i_minus_15 - .populate(event.w_i_minus_15_reads[j], &mut new_byte_lookup_events); - cols.w_i_minus_2 - .populate(event.w_i_minus_2_reads[j], &mut new_byte_lookup_events); - cols.w_i_minus_16 - .populate(event.w_i_minus_16_reads[j], &mut new_byte_lookup_events); - cols.w_i_minus_7 - .populate(event.w_i_minus_7_reads[j], &mut new_byte_lookup_events); + cols.w_i_minus_15.populate( + event.channel, + event.w_i_minus_15_reads[j], + &mut new_byte_lookup_events, + ); + cols.w_i_minus_2.populate( + event.channel, + event.w_i_minus_2_reads[j], + &mut new_byte_lookup_events, + ); + cols.w_i_minus_16.populate( + event.channel, + event.w_i_minus_16_reads[j], + &mut new_byte_lookup_events, + ); + cols.w_i_minus_7.populate( + event.channel, + event.w_i_minus_7_reads[j], + &mut new_byte_lookup_events, + ); // `s0 := (w[i-15] rightrotate 7) xor (w[i-15] rightrotate 18) xor (w[i-15] rightshift 3)`. let w_i_minus_15 = event.w_i_minus_15_reads[j].value; let w_i_minus_15_rr_7 = cols.w_i_minus_15_rr_7 - .populate(output, shard, w_i_minus_15, 7); - let w_i_minus_15_rr_18 = - cols.w_i_minus_15_rr_18 - .populate(output, shard, w_i_minus_15, 18); + .populate(output, shard, event.channel, w_i_minus_15, 7); + let w_i_minus_15_rr_18 = cols.w_i_minus_15_rr_18.populate( + output, + shard, + event.channel, + w_i_minus_15, + 18, + ); let w_i_minus_15_rs_3 = cols.w_i_minus_15_rs_3 - .populate(output, shard, w_i_minus_15, 3); + .populate(output, shard, event.channel, w_i_minus_15, 3); let s0_intermediate = cols.s0_intermediate.populate( output, shard, + event.channel, w_i_minus_15_rr_7, w_i_minus_15_rr_18, ); - let s0 = cols - .s0 - .populate(output, shard, s0_intermediate, w_i_minus_15_rs_3); + let s0 = cols.s0.populate( + output, + shard, + event.channel, + s0_intermediate, + w_i_minus_15_rs_3, + ); // `s1 := (w[i-2] rightrotate 17) xor (w[i-2] rightrotate 19) xor (w[i-2] rightshift 10)`. let w_i_minus_2 = event.w_i_minus_2_reads[j].value; let w_i_minus_2_rr_17 = cols.w_i_minus_2_rr_17 - .populate(output, shard, w_i_minus_2, 17); + .populate(output, shard, event.channel, w_i_minus_2, 17); let w_i_minus_2_rr_19 = cols.w_i_minus_2_rr_19 - .populate(output, shard, w_i_minus_2, 19); + .populate(output, shard, event.channel, w_i_minus_2, 19); let w_i_minus_2_rs_10 = cols.w_i_minus_2_rs_10 - .populate(output, shard, w_i_minus_2, 10); + .populate(output, shard, event.channel, w_i_minus_2, 10); let s1_intermediate = cols.s1_intermediate.populate( output, shard, + event.channel, w_i_minus_2_rr_17, w_i_minus_2_rr_19, ); - let s1 = cols - .s1 - .populate(output, shard, s1_intermediate, w_i_minus_2_rs_10); + let s1 = cols.s1.populate( + output, + shard, + event.channel, + s1_intermediate, + w_i_minus_2_rs_10, + ); // Compute `s2`. let w_i_minus_7 = event.w_i_minus_7_reads[j].value; let w_i_minus_16 = event.w_i_minus_16_reads[j].value; - cols.s2 - .populate(output, shard, w_i_minus_16, s0, w_i_minus_7, s1); + cols.s2.populate( + output, + shard, + event.channel, + w_i_minus_16, + s0, + w_i_minus_7, + s1, + ); - cols.w_i - .populate(event.w_i_writes[j], &mut new_byte_lookup_events); + cols.w_i.populate( + event.channel, + event.w_i_writes[j], + &mut new_byte_lookup_events, + ); rows.push(row); } diff --git a/core/src/syscall/precompiles/uint256/air.rs b/core/src/syscall/precompiles/uint256/air.rs index aa422afc7e..2117d75d40 100644 --- a/core/src/syscall/precompiles/uint256/air.rs +++ b/core/src/syscall/precompiles/uint256/air.rs @@ -34,6 +34,7 @@ const NUM_COLS: usize = size_of::>(); #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Uint256MulEvent { pub shard: u32, + pub channel: u32, pub clk: u32, pub x_ptr: u32, pub x: Vec, @@ -64,6 +65,9 @@ pub struct Uint256MulCols { /// The shard number of the syscall. pub shard: T, + /// The byte lookup channel. + pub channel: T, + /// The clock cycle of the syscall. pub clk: T, @@ -124,17 +128,25 @@ impl MachineAir for Uint256MulChip { // Assign basic values to the columns. cols.is_real = F::one(); cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.x_ptr = F::from_canonical_u32(event.x_ptr); cols.y_ptr = F::from_canonical_u32(event.y_ptr); // Populate memory columns. for i in 0..WORDS_FIELD_ELEMENT { - cols.x_memory[i] - .populate(event.x_memory_records[i], &mut new_byte_lookup_events); - cols.y_memory[i] - .populate(event.y_memory_records[i], &mut new_byte_lookup_events); + cols.x_memory[i].populate( + event.channel, + event.x_memory_records[i], + &mut new_byte_lookup_events, + ); + cols.y_memory[i].populate( + event.channel, + event.y_memory_records[i], + &mut new_byte_lookup_events, + ); cols.modulus_memory[i].populate( + event.channel, event.modulus_memory_records[i], &mut new_byte_lookup_events, ); @@ -153,6 +165,7 @@ impl MachineAir for Uint256MulChip { cols.output.populate_with_modulus( &mut new_byte_lookup_events, event.shard, + event.channel, &x, &y, &effective_modulus, @@ -182,7 +195,7 @@ impl MachineAir for Uint256MulChip { let x = BigUint::zero(); let y = BigUint::zero(); cols.output - .populate(&mut vec![], 0, &x, &y, FieldOperation::Mul); + .populate(&mut vec![], 0, 0, &x, &y, FieldOperation::Mul); row }); @@ -245,9 +258,11 @@ impl Syscall for Uint256MulChip { let x_memory_records = rt.mw_slice(x_ptr, &result); let shard = rt.current_shard(); + let channel = rt.current_channel(); let clk = rt.clk; rt.record_mut().uint256_mul_events.push(Uint256MulEvent { shard, + channel, clk, x_ptr, x, @@ -316,9 +331,9 @@ where &x_limbs, &y_limbs, &p_modulus, - // &modulus_limbs, FieldOperation::Mul, local.shard, + local.channel, local.is_real, ); @@ -330,6 +345,7 @@ where // Read and write x. builder.eval_memory_access_slice( local.shard, + local.channel, local.clk.into(), local.x_ptr, &local.x_memory, @@ -340,6 +356,7 @@ where // we read it contiguously from the y_ptr memory location. builder.eval_memory_access_slice( local.shard, + local.channel, local.clk.into(), local.y_ptr, &[local.y_memory, local.modulus_memory].concat(), @@ -349,6 +366,7 @@ where // Receive the arguments. builder.receive_syscall( local.shard, + local.channel, local.clk, AB::F::from_canonical_u32(SyscallCode::UINT256_MUL.syscall_id()), local.x_ptr, diff --git a/core/src/syscall/precompiles/weierstrass/weierstrass_add.rs b/core/src/syscall/precompiles/weierstrass/weierstrass_add.rs index f2282632b8..85a6e9d140 100644 --- a/core/src/syscall/precompiles/weierstrass/weierstrass_add.rs +++ b/core/src/syscall/precompiles/weierstrass/weierstrass_add.rs @@ -52,6 +52,7 @@ pub const fn num_weierstrass_add_cols() -> usize pub struct WeierstrassAddAssignCols { pub is_real: T, pub shard: T, + pub channel: T, pub clk: T, pub p_ptr: T, pub q_ptr: T, @@ -97,9 +98,11 @@ impl WeierstrassAddAssignChip { } } + #[allow(clippy::too_many_arguments)] fn populate_field_ops( blu_events: &mut Vec, shard: u32, + channel: u32, cols: &mut WeierstrassAddAssignCols, p_x: BigUint, p_y: BigUint, @@ -111,17 +114,28 @@ impl WeierstrassAddAssignChip { // slope = (q.y - p.y) / (q.x - p.x). let slope = { - let slope_numerator = - cols.slope_numerator - .populate(blu_events, shard, &q_y, &p_y, FieldOperation::Sub); + let slope_numerator = cols.slope_numerator.populate( + blu_events, + shard, + channel, + &q_y, + &p_y, + FieldOperation::Sub, + ); - let slope_denominator = - cols.slope_denominator - .populate(blu_events, shard, &q_x, &p_x, FieldOperation::Sub); + let slope_denominator = cols.slope_denominator.populate( + blu_events, + shard, + channel, + &q_x, + &p_x, + FieldOperation::Sub, + ); cols.slope.populate( blu_events, shard, + channel, &slope_numerator, &slope_denominator, FieldOperation::Div, @@ -130,15 +144,26 @@ impl WeierstrassAddAssignChip { // x = slope * slope - (p.x + q.x). let x = { - let slope_squared = - cols.slope_squared - .populate(blu_events, shard, &slope, &slope, FieldOperation::Mul); - let p_x_plus_q_x = - cols.p_x_plus_q_x - .populate(blu_events, shard, &p_x, &q_x, FieldOperation::Add); + let slope_squared = cols.slope_squared.populate( + blu_events, + shard, + channel, + &slope, + &slope, + FieldOperation::Mul, + ); + let p_x_plus_q_x = cols.p_x_plus_q_x.populate( + blu_events, + shard, + channel, + &p_x, + &q_x, + FieldOperation::Add, + ); cols.x3_ins.populate( blu_events, shard, + channel, &slope_squared, &p_x_plus_q_x, FieldOperation::Sub, @@ -147,12 +172,18 @@ impl WeierstrassAddAssignChip { // y = slope * (p.x - x_3n) - p.y. { - let p_x_minus_x = - cols.p_x_minus_x - .populate(blu_events, shard, &p_x, &x, FieldOperation::Sub); + let p_x_minus_x = cols.p_x_minus_x.populate( + blu_events, + shard, + channel, + &p_x, + &x, + FieldOperation::Sub, + ); let slope_times_p_x_minus_x = cols.slope_times_p_x_minus_x.populate( blu_events, shard, + channel, &slope, &p_x_minus_x, FieldOperation::Mul, @@ -160,6 +191,7 @@ impl WeierstrassAddAssignChip { cols.y3_ins.populate( blu_events, shard, + channel, &slope_times_p_x_minus_x, &p_y, FieldOperation::Sub, @@ -218,6 +250,7 @@ where // Populate basic columns. cols.is_real = F::one(); cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.p_ptr = F::from_canonical_u32(event.p_ptr); cols.q_ptr = F::from_canonical_u32(event.q_ptr); @@ -225,6 +258,7 @@ where Self::populate_field_ops( &mut new_byte_lookup_events, event.shard, + event.channel, cols, p_x, p_y, @@ -234,10 +268,18 @@ where // Populate the memory access columns. for i in 0..cols.q_access.len() { - cols.q_access[i].populate(event.q_memory_records[i], &mut new_byte_lookup_events); + cols.q_access[i].populate( + event.channel, + event.q_memory_records[i], + &mut new_byte_lookup_events, + ); } for i in 0..cols.p_access.len() { - cols.p_access[i].populate(event.p_memory_records[i], &mut new_byte_lookup_events); + cols.p_access[i].populate( + event.channel, + event.p_memory_records[i], + &mut new_byte_lookup_events, + ); } rows.push(row); @@ -252,6 +294,7 @@ where Self::populate_field_ops( &mut vec![], 0, + 0, cols, zero.clone(), zero.clone(), @@ -310,6 +353,7 @@ where &p_y, FieldOperation::Sub, row.shard, + row.channel, row.is_real, ); @@ -319,6 +363,7 @@ where &p_x, FieldOperation::Sub, row.shard, + row.channel, row.is_real, ); @@ -328,6 +373,7 @@ where &row.slope_denominator.result, FieldOperation::Div, row.shard, + row.channel, row.is_real, ); @@ -342,6 +388,7 @@ where slope, FieldOperation::Mul, row.shard, + row.channel, row.is_real, ); @@ -351,6 +398,7 @@ where &q_x, FieldOperation::Add, row.shard, + row.channel, row.is_real, ); @@ -360,6 +408,7 @@ where &row.p_x_plus_q_x.result, FieldOperation::Sub, row.shard, + row.channel, row.is_real, ); @@ -374,6 +423,7 @@ where x, FieldOperation::Sub, row.shard, + row.channel, row.is_real, ); @@ -383,6 +433,7 @@ where &row.p_x_minus_x.result, FieldOperation::Mul, row.shard, + row.channel, row.is_real, ); @@ -392,6 +443,7 @@ where &p_y, FieldOperation::Sub, row.shard, + row.channel, row.is_real, ); } @@ -410,6 +462,7 @@ where builder.eval_memory_access_slice( row.shard, + row.channel, row.clk.into(), row.q_ptr, &row.q_access, @@ -417,6 +470,7 @@ where ); builder.eval_memory_access_slice( row.shard, + row.channel, row.clk + AB::F::from_canonical_u32(1), // We read p at +1 since p, q could be the same. row.p_ptr, &row.p_access, @@ -437,6 +491,7 @@ where builder.receive_syscall( row.shard, + row.channel, row.clk, syscall_id_felt, row.p_ptr, diff --git a/core/src/syscall/precompiles/weierstrass/weierstrass_decompress.rs b/core/src/syscall/precompiles/weierstrass/weierstrass_decompress.rs index 04e3e125dd..ec0f4cee54 100644 --- a/core/src/syscall/precompiles/weierstrass/weierstrass_decompress.rs +++ b/core/src/syscall/precompiles/weierstrass/weierstrass_decompress.rs @@ -53,6 +53,7 @@ pub const fn num_weierstrass_decompress_cols() -> pub struct WeierstrassDecompressCols { pub is_real: T, pub shard: T, + pub channel: T, pub clk: T, pub ptr: T, pub is_odd: T, @@ -97,32 +98,40 @@ impl WeierstrassDecompressChip { fn populate_field_ops( record: &mut impl ByteRecord, shard: u32, + channel: u32, cols: &mut WeierstrassDecompressCols, x: BigUint, ) { // Y = sqrt(x^3 + b) - cols.range_x.populate(record, shard, &x); - let x_2 = cols - .x_2 - .populate(record, shard, &x.clone(), &x.clone(), FieldOperation::Mul); + cols.range_x.populate(record, shard, channel, &x); + let x_2 = cols.x_2.populate( + record, + shard, + channel, + &x.clone(), + &x.clone(), + FieldOperation::Mul, + ); let x_3 = cols .x_3 - .populate(record, shard, &x_2, &x, FieldOperation::Mul); + .populate(record, shard, channel, &x_2, &x, FieldOperation::Mul); let b = E::b_int(); - let x_3_plus_b = cols - .x_3_plus_b - .populate(record, shard, &x_3, &b, FieldOperation::Add); + let x_3_plus_b = + cols.x_3_plus_b + .populate(record, shard, channel, &x_3, &b, FieldOperation::Add); let sqrt_fn = match E::CURVE_TYPE { CurveType::Secp256k1 => secp256k1_sqrt, CurveType::Bls12381 => bls12381_sqrt, _ => panic!("Unsupported curve"), }; - let y = cols.y.populate(record, shard, &x_3_plus_b, sqrt_fn); + let y = cols + .y + .populate(record, shard, channel, &x_3_plus_b, sqrt_fn); let zero = BigUint::zero(); cols.neg_y - .populate(record, shard, &zero, &y, FieldOperation::Sub); + .populate(record, shard, channel, &zero, &y, FieldOperation::Sub); } } @@ -165,19 +174,34 @@ where cols.is_real = F::from_bool(true); cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); + cols.channel = F::from_canonical_u32(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.ptr = F::from_canonical_u32(event.ptr); cols.is_odd = F::from_canonical_u32(event.is_odd as u32); let x = BigUint::from_bytes_le(&event.x_bytes); - Self::populate_field_ops(&mut new_byte_lookup_events, event.shard, cols, x); + Self::populate_field_ops( + &mut new_byte_lookup_events, + event.shard, + event.channel, + cols, + x, + ); for i in 0..cols.x_access.len() { - cols.x_access[i].populate(event.x_memory_records[i], &mut new_byte_lookup_events); + cols.x_access[i].populate( + event.channel, + event.x_memory_records[i], + &mut new_byte_lookup_events, + ); } for i in 0..cols.y_access.len() { - cols.y_access[i] - .populate_write(event.y_memory_records[i], &mut new_byte_lookup_events); + cols.y_access[i].populate_write( + event.channel, + event.y_memory_records[i], + &mut new_byte_lookup_events, + ); } rows.push(row); @@ -197,7 +221,7 @@ where cols.x_access[i].access.value = words[i].into(); } - Self::populate_field_ops(&mut vec![], 0, cols, dummy_value); + Self::populate_field_ops(&mut vec![], 0, 0, cols, dummy_value); row }); @@ -239,15 +263,24 @@ where let x: Limbs::Limbs> = limbs_from_prev_access(&row.x_access); - row.range_x.eval(builder, &x, row.shard, row.is_real); - row.x_2 - .eval(builder, &x, &x, FieldOperation::Mul, row.shard, row.is_real); + row.range_x + .eval(builder, &x, row.shard, row.channel, row.is_real); + row.x_2.eval( + builder, + &x, + &x, + FieldOperation::Mul, + row.shard, + row.channel, + row.is_real, + ); row.x_3.eval( builder, &row.x_2.result, &x, FieldOperation::Mul, row.shard, + row.channel, row.is_real, ); let b = E::b_int(); @@ -258,6 +291,7 @@ where &b_const, FieldOperation::Add, row.shard, + row.channel, row.is_real, ); @@ -267,6 +301,7 @@ where &row.y.multiplication.result, FieldOperation::Sub, row.shard, + row.channel, row.is_real, ); @@ -278,6 +313,7 @@ where &row.x_3_plus_b.result, row.y.lsb, row.shard, + row.channel, row.is_real, ); @@ -295,6 +331,7 @@ where for i in 0..num_words_field_element { builder.eval_memory_access( row.shard, + row.channel, row.clk, row.ptr.into() + AB::F::from_canonical_u32((i as u32) * 4 + num_limbs as u32), &row.x_access[i], @@ -304,6 +341,7 @@ where for i in 0..num_words_field_element { builder.eval_memory_access( row.shard, + row.channel, row.clk, row.ptr.into() + AB::F::from_canonical_u32((i as u32) * 4), &row.y_access[i], @@ -323,6 +361,7 @@ where builder.receive_syscall( row.shard, + row.channel, row.clk, syscall_id, row.ptr, diff --git a/core/src/syscall/precompiles/weierstrass/weierstrass_double.rs b/core/src/syscall/precompiles/weierstrass/weierstrass_double.rs index 2730c4924e..d94e5366b1 100644 --- a/core/src/syscall/precompiles/weierstrass/weierstrass_double.rs +++ b/core/src/syscall/precompiles/weierstrass/weierstrass_double.rs @@ -53,6 +53,7 @@ pub const fn num_weierstrass_double_cols() -> usi pub struct WeierstrassDoubleAssignCols { pub is_real: T, pub shard: T, + pub channel: T, pub clk: T, pub p_ptr: T, pub p_access: GenericArray, P::WordsCurvePoint>, @@ -101,6 +102,7 @@ impl WeierstrassDoubleAssignChip { fn populate_field_ops( blu_events: &mut Vec, shard: u32, + channel: u32, cols: &mut WeierstrassDoubleAssignCols, p_x: BigUint, p_y: BigUint, @@ -113,12 +115,18 @@ impl WeierstrassDoubleAssignChip { let slope = { // slope_numerator = a + (p.x * p.x) * 3. let slope_numerator = { - let p_x_squared = - cols.p_x_squared - .populate(blu_events, shard, &p_x, &p_x, FieldOperation::Mul); + let p_x_squared = cols.p_x_squared.populate( + blu_events, + shard, + channel, + &p_x, + &p_x, + FieldOperation::Mul, + ); let p_x_squared_times_3 = cols.p_x_squared_times_3.populate( blu_events, shard, + channel, &p_x_squared, &BigUint::from(3u32), FieldOperation::Mul, @@ -126,6 +134,7 @@ impl WeierstrassDoubleAssignChip { cols.slope_numerator.populate( blu_events, shard, + channel, &a, &p_x_squared_times_3, FieldOperation::Add, @@ -136,6 +145,7 @@ impl WeierstrassDoubleAssignChip { let slope_denominator = cols.slope_denominator.populate( blu_events, shard, + channel, &BigUint::from(2u32), &p_y, FieldOperation::Mul, @@ -144,6 +154,7 @@ impl WeierstrassDoubleAssignChip { cols.slope.populate( blu_events, shard, + channel, &slope_numerator, &slope_denominator, FieldOperation::Div, @@ -152,15 +163,26 @@ impl WeierstrassDoubleAssignChip { // x = slope * slope - (p.x + p.x). let x = { - let slope_squared = - cols.slope_squared - .populate(blu_events, shard, &slope, &slope, FieldOperation::Mul); - let p_x_plus_p_x = - cols.p_x_plus_p_x - .populate(blu_events, shard, &p_x, &p_x, FieldOperation::Add); + let slope_squared = cols.slope_squared.populate( + blu_events, + shard, + channel, + &slope, + &slope, + FieldOperation::Mul, + ); + let p_x_plus_p_x = cols.p_x_plus_p_x.populate( + blu_events, + shard, + channel, + &p_x, + &p_x, + FieldOperation::Add, + ); cols.x3_ins.populate( blu_events, shard, + channel, &slope_squared, &p_x_plus_p_x, FieldOperation::Sub, @@ -169,12 +191,18 @@ impl WeierstrassDoubleAssignChip { // y = slope * (p.x - x) - p.y. { - let p_x_minus_x = - cols.p_x_minus_x - .populate(blu_events, shard, &p_x, &x, FieldOperation::Sub); + let p_x_minus_x = cols.p_x_minus_x.populate( + blu_events, + shard, + channel, + &p_x, + &x, + FieldOperation::Sub, + ); let slope_times_p_x_minus_x = cols.slope_times_p_x_minus_x.populate( blu_events, shard, + channel, &slope, &p_x_minus_x, FieldOperation::Mul, @@ -182,6 +210,7 @@ impl WeierstrassDoubleAssignChip { cols.y3_ins.populate( blu_events, shard, + channel, &slope_times_p_x_minus_x, &p_y, FieldOperation::Sub, @@ -244,12 +273,14 @@ where // Populate basic columns. cols.is_real = F::one(); cols.shard = F::from_canonical_u32(event.shard); + cols.channel = F::from_canonical_u32(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.p_ptr = F::from_canonical_u32(event.p_ptr); Self::populate_field_ops( &mut new_byte_lookup_events, event.shard, + event.channel, cols, p_x, p_y, @@ -257,8 +288,11 @@ where // Populate the memory access columns. for i in 0..cols.p_access.len() { - cols.p_access[i] - .populate(event.p_memory_records[i], &mut new_byte_lookup_events); + cols.p_access[i].populate( + event.channel, + event.p_memory_records[i], + &mut new_byte_lookup_events, + ); } row }) @@ -280,7 +314,7 @@ where let cols: &mut WeierstrassDoubleAssignCols = row.as_mut_slice().borrow_mut(); let zero = BigUint::zero(); - Self::populate_field_ops(&mut vec![], 0, cols, zero.clone(), zero.clone()); + Self::populate_field_ops(&mut vec![], 0, 0, cols, zero.clone(), zero.clone()); row }); @@ -335,6 +369,7 @@ where &p_x, FieldOperation::Mul, row.shard, + row.channel, row.is_real, ); @@ -344,6 +379,7 @@ where &E::BaseField::to_limbs_field::(&BigUint::from(3u32)), FieldOperation::Mul, row.shard, + row.channel, row.is_real, ); @@ -353,6 +389,7 @@ where &row.p_x_squared_times_3.result, FieldOperation::Add, row.shard, + row.channel, row.is_real, ); }; @@ -364,6 +401,7 @@ where &p_y, FieldOperation::Mul, row.shard, + row.channel, row.is_real, ); @@ -373,6 +411,7 @@ where &row.slope_denominator.result, FieldOperation::Div, row.shard, + row.channel, row.is_real, ); @@ -387,6 +426,7 @@ where slope, FieldOperation::Mul, row.shard, + row.channel, row.is_real, ); row.p_x_plus_p_x.eval( @@ -395,6 +435,7 @@ where &p_x, FieldOperation::Add, row.shard, + row.channel, row.is_real, ); row.x3_ins.eval( @@ -403,6 +444,7 @@ where &row.p_x_plus_p_x.result, FieldOperation::Sub, row.shard, + row.channel, row.is_real, ); &row.x3_ins.result @@ -416,6 +458,7 @@ where x, FieldOperation::Sub, row.shard, + row.channel, row.is_real, ); row.slope_times_p_x_minus_x.eval( @@ -424,6 +467,7 @@ where &row.p_x_minus_x.result, FieldOperation::Mul, row.shard, + row.channel, row.is_real, ); row.y3_ins.eval( @@ -432,6 +476,7 @@ where &p_y, FieldOperation::Sub, row.shard, + row.channel, row.is_real, ); } @@ -450,6 +495,7 @@ where builder.eval_memory_access_slice( row.shard, + row.channel, row.clk.into(), row.p_ptr, &row.p_access, @@ -470,6 +516,7 @@ where builder.receive_syscall( row.shard, + row.channel, row.clk, syscall_id_felt, row.p_ptr, From f85b0a5bc835e3e52d58f3693f4558bc22368d95 Mon Sep 17 00:00:00 2001 From: Robin Salen <30937548+Nashtare@users.noreply.github.com> Date: Thu, 23 May 2024 17:24:35 -0400 Subject: [PATCH 14/42] fix(core): Fix benches warning for unstable features (#763) --- core/benches/main.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/benches/main.rs b/core/benches/main.rs index ca63a750fc..ee8094ecc3 100644 --- a/core/benches/main.rs +++ b/core/benches/main.rs @@ -1,3 +1,6 @@ +#![allow(incomplete_features)] +#![feature(generic_const_exprs)] + use criterion::{black_box, criterion_group, criterion_main, Criterion}; use sp1_core::io::SP1Stdin; use sp1_core::runtime::{Program, Runtime}; From a45bd4f29accba3e5378f691e70dd3a917063b7d Mon Sep 17 00:00:00 2001 From: Robin Salen <30937548+Nashtare@users.noreply.github.com> Date: Thu, 23 May 2024 17:25:05 -0400 Subject: [PATCH 15/42] fix(core): Remove dummy constraint (#783) --- core/src/alu/sr/mod.rs | 4 ---- core/src/lib.rs | 1 - 2 files changed, 5 deletions(-) diff --git a/core/src/alu/sr/mod.rs b/core/src/alu/sr/mod.rs index 892ad7a8ab..8f9ea721e5 100644 --- a/core/src/alu/sr/mod.rs +++ b/core/src/alu/sr/mod.rs @@ -480,10 +480,6 @@ where } } - builder.assert_zero( - local.a[0] * local.b[0] * local.c[0] - local.a[0] * local.b[0] * local.c[0], - ); - // Check that the operation flags are boolean. builder.assert_bool(local.is_srl); builder.assert_bool(local.is_sra); diff --git a/core/src/lib.rs b/core/src/lib.rs index 8669dd1694..3fb0786a03 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -1,5 +1,4 @@ #![allow( - clippy::eq_op, clippy::new_without_default, clippy::field_reassign_with_default, clippy::unnecessary_cast, From 10ffa32c4deb82a5330a0ed89de8ecc57e17e4e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20G=C3=B6rgens?= Date: Fri, 24 May 2024 05:25:26 +0800 Subject: [PATCH 16/42] chore: Clean up TOML files (#796) --- book.toml | 2 +- cli/Cargo.toml | 16 +++++++--------- cli/src/commands/config-ci.toml | 2 +- cli/src/commands/config.toml | 2 +- core/Cargo.toml | 2 +- derive/Cargo.toml | 2 -- .../programs/aggregation/Cargo.toml | 6 ++++-- .../aggregation/programs/fibonacci/Cargo.toml | 2 +- examples/chess/program/Cargo.toml | 2 +- examples/cycle-tracking/program/Cargo.toml | 2 +- examples/fibonacci/program/Cargo.toml | 2 +- examples/io/program/Cargo.toml | 2 +- examples/is-prime/program/Cargo.toml | 2 +- examples/json/lib/Cargo.toml | 2 -- examples/rsa/program/Cargo.toml | 6 +++--- examples/ssz-withdrawals/program/Cargo.toml | 2 +- examples/tendermint/program/Cargo.toml | 4 ++-- examples/tendermint/script/Cargo.toml | 4 ++-- helper/Cargo.toml | 2 -- primitives/Cargo.toml | 2 -- prover/Cargo.toml | 8 +++----- recursion/circuit/Cargo.toml | 2 -- recursion/compiler/Cargo.toml | 2 -- recursion/core/Cargo.toml | 2 +- recursion/derive/Cargo.toml | 2 -- recursion/program/Cargo.toml | 2 -- sdk/Cargo.toml | 18 ++++++++---------- tests/blake3-compress/Cargo.toml | 2 +- tests/bls12381-add/Cargo.toml | 2 +- tests/bls12381-double/Cargo.toml | 2 +- tests/bls12381-mul/Cargo.toml | 2 +- tests/bn254-add/Cargo.toml | 2 +- tests/bn254-double/Cargo.toml | 2 +- tests/bn254-mul/Cargo.toml | 2 +- tests/cycle-tracker/Cargo.toml | 2 +- tests/ed-add/Cargo.toml | 2 +- tests/ed-decompress/Cargo.toml | 2 +- tests/ed25519/Cargo.toml | 1 - tests/fibonacci/Cargo.toml | 2 +- tests/keccak-permute/Cargo.toml | 2 +- tests/keccak256/Cargo.toml | 4 +++- tests/secp256k1-add/Cargo.toml | 2 +- tests/secp256k1-decompress/Cargo.toml | 2 +- tests/secp256k1-double/Cargo.toml | 2 +- tests/secp256k1-mul/Cargo.toml | 2 +- tests/sha-compress/Cargo.toml | 2 +- tests/sha-extend/Cargo.toml | 2 +- tests/sha2/Cargo.toml | 2 +- tests/tendermint-benchmark/Cargo.toml | 4 ++-- tests/uint256-arith/Cargo.toml | 2 +- tests/uint256-div/Cargo.toml | 2 +- zkvm/entrypoint/Cargo.toml | 8 ++++---- zkvm/precompiles/Cargo.toml | 2 +- 53 files changed, 72 insertions(+), 91 deletions(-) diff --git a/book.toml b/book.toml index a3b4a79e6c..e30b6057d5 100644 --- a/book.toml +++ b/book.toml @@ -27,4 +27,4 @@ before = ["links"] [preprocessor.index] -[preprocessor.links] \ No newline at end of file +[preprocessor.links] diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 05ccf8cd93..68968e38a7 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -3,13 +3,11 @@ name = "sp1-cli" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [build-dependencies] vergen = { version = "8", default-features = false, features = [ - "build", - "git", - "git2", + "build", + "git", + "git2", ] } [dependencies] @@ -20,9 +18,9 @@ sp1-prover = { path = "../prover" } sp1-sdk = { path = "../sdk" } sp1-core = { path = "../core" } reqwest = { version = "0.12.4", features = [ - "stream", - "json", - "rustls-tls", + "stream", + "json", + "rustls-tls", ], default-features = false } futures-util = "0.3.30" indicatif = "0.17.8" @@ -33,7 +31,7 @@ dirs = "5.0" serde = { version = "1", features = ["derive"] } rand = "0.8" downloader = { version = "0.2", default-features = false, features = [ - "rustls-tls", + "rustls-tls", ] } serde_json = "1.0.117" yansi = "1.0.1" diff --git a/cli/src/commands/config-ci.toml b/cli/src/commands/config-ci.toml index c63e41aa95..29e6ce2f41 100644 --- a/cli/src/commands/config-ci.toml +++ b/cli/src/commands/config-ci.toml @@ -13,4 +13,4 @@ llvm-tools = true channel = "nightly" [llvm] -download-ci-llvm = false \ No newline at end of file +download-ci-llvm = false diff --git a/cli/src/commands/config.toml b/cli/src/commands/config.toml index e6f55259e1..bfb56db6d0 100644 --- a/cli/src/commands/config.toml +++ b/cli/src/commands/config.toml @@ -12,4 +12,4 @@ llvm-tools = true channel = "nightly" [llvm] -download-ci-llvm = false \ No newline at end of file +download-ci-llvm = false diff --git a/core/Cargo.toml b/core/Cargo.toml index 60f98dc7cb..682d0639d9 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -34,7 +34,7 @@ sp1-primitives = { path = "../primitives" } anyhow = "1.0.83" amcl = { package = "snowbridge-amcl", version = "1.0.2", default-features = false, features = [ - "bls381", + "bls381", ] } arrayref = "0.3.7" blake3 = "1.5" diff --git a/derive/Cargo.toml b/derive/Cargo.toml index b479cf8b38..cd09114d95 100644 --- a/derive/Cargo.toml +++ b/derive/Cargo.toml @@ -3,8 +3,6 @@ name = "sp1-derive" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [lib] proc-macro = true diff --git a/examples/aggregation/programs/aggregation/Cargo.toml b/examples/aggregation/programs/aggregation/Cargo.toml index 0e25eec36d..78b81178f4 100644 --- a/examples/aggregation/programs/aggregation/Cargo.toml +++ b/examples/aggregation/programs/aggregation/Cargo.toml @@ -7,7 +7,9 @@ edition = "2021" [dependencies] hex = "0.4.3" sha2 = "0.10.8" -sp1-zkvm = { git = "https://github.com/succinctlabs/sp1.git", features = ["verify"], rev = "v1.0.0-testnet" } +sp1-zkvm = { git = "https://github.com/succinctlabs/sp1.git", features = [ + "verify", +], rev = "v1.0.0-testnet" } [patch.crates-io] -sha2-v0-10-8 = { git = "https://github.com/sp1-patches/RustCrypto-hashes.git", package = "sha2", branch = "patch-v0.10.8" } \ No newline at end of file +sha2-v0-10-8 = { git = "https://github.com/sp1-patches/RustCrypto-hashes.git", package = "sha2", branch = "patch-v0.10.8" } diff --git a/examples/aggregation/programs/fibonacci/Cargo.toml b/examples/aggregation/programs/fibonacci/Cargo.toml index af7da6cac7..87bb1d214f 100644 --- a/examples/aggregation/programs/fibonacci/Cargo.toml +++ b/examples/aggregation/programs/fibonacci/Cargo.toml @@ -5,4 +5,4 @@ name = "fibonacci-program" edition = "2021" [dependencies] -sp1-zkvm = { git = "https://github.com/succinctlabs/sp1.git", rev = "v1.0.0-testnet" } \ No newline at end of file +sp1-zkvm = { git = "https://github.com/succinctlabs/sp1.git", rev = "v1.0.0-testnet" } diff --git a/examples/chess/program/Cargo.toml b/examples/chess/program/Cargo.toml index 9e5e95c3bc..fe588f0185 100644 --- a/examples/chess/program/Cargo.toml +++ b/examples/chess/program/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" [dependencies] chess = "3.2.0" -sp1-zkvm = { path = "../../../zkvm/entrypoint" } \ No newline at end of file +sp1-zkvm = { path = "../../../zkvm/entrypoint" } diff --git a/examples/cycle-tracking/program/Cargo.toml b/examples/cycle-tracking/program/Cargo.toml index b002de02b3..d00b69640c 100644 --- a/examples/cycle-tracking/program/Cargo.toml +++ b/examples/cycle-tracking/program/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" [dependencies] sp1-zkvm = { path = "../../../zkvm/entrypoint" } -sp1-derive = { path = "../../../derive" } \ No newline at end of file +sp1-derive = { path = "../../../derive" } diff --git a/examples/fibonacci/program/Cargo.toml b/examples/fibonacci/program/Cargo.toml index 6b3514197b..7d92da05d9 100644 --- a/examples/fibonacci/program/Cargo.toml +++ b/examples/fibonacci/program/Cargo.toml @@ -5,4 +5,4 @@ name = "fibonacci-program" edition = "2021" [dependencies] -sp1-zkvm = { path = "../../../zkvm/entrypoint" } \ No newline at end of file +sp1-zkvm = { path = "../../../zkvm/entrypoint" } diff --git a/examples/io/program/Cargo.toml b/examples/io/program/Cargo.toml index 06a7935a71..c85b94b968 100644 --- a/examples/io/program/Cargo.toml +++ b/examples/io/program/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" [dependencies] sp1-zkvm = { path = "../../../zkvm/entrypoint" } -serde = { version = "1.0.195", features = ["derive"] } \ No newline at end of file +serde = { version = "1.0.195", features = ["derive"] } diff --git a/examples/is-prime/program/Cargo.toml b/examples/is-prime/program/Cargo.toml index 25f550f2da..e4a4d11a19 100644 --- a/examples/is-prime/program/Cargo.toml +++ b/examples/is-prime/program/Cargo.toml @@ -5,4 +5,4 @@ name = "is-prime-program" edition = "2021" [dependencies] -sp1-zkvm = { git = "https://github.com/succinctlabs/sp1.git" } \ No newline at end of file +sp1-zkvm = { git = "https://github.com/succinctlabs/sp1.git" } diff --git a/examples/json/lib/Cargo.toml b/examples/json/lib/Cargo.toml index d85ca839f7..8ac755b6df 100644 --- a/examples/json/lib/Cargo.toml +++ b/examples/json/lib/Cargo.toml @@ -3,7 +3,5 @@ name = "lib" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] serde = "1.0.196" diff --git a/examples/rsa/program/Cargo.toml b/examples/rsa/program/Cargo.toml index 2e423767b6..a9c166d789 100644 --- a/examples/rsa/program/Cargo.toml +++ b/examples/rsa/program/Cargo.toml @@ -8,9 +8,9 @@ edition = "2021" sp1-zkvm = { path = "../../../zkvm/entrypoint" } digest = "0.10.7" rand = "0.8.5" -rsa = "0.6" # Check for the latest version -sha2 = "0.9.8" # Check for the latest version +rsa = "0.6" # Check for the latest version +sha2 = "0.9.8" # Check for the latest version [patch.crates-io] # Patch sha2 so we can use sha precompiles -sha2 = { git = "https://github.com/succinctbot/RustCrypto-hashes.git", package = "sha2", branch = "v0.9.8" } \ No newline at end of file +sha2 = { git = "https://github.com/succinctbot/RustCrypto-hashes.git", package = "sha2", branch = "v0.9.8" } diff --git a/examples/ssz-withdrawals/program/Cargo.toml b/examples/ssz-withdrawals/program/Cargo.toml index 1c01ef3398..4ed30cec1d 100644 --- a/examples/ssz-withdrawals/program/Cargo.toml +++ b/examples/ssz-withdrawals/program/Cargo.toml @@ -17,4 +17,4 @@ sha2 = { git = "https://github.com/sp1-patches/RustCrypto-hashes.git", package = [patch.crates-io] # Patch sha2 so we can use sha precompiles -sha2-v0-10-8 = { git = "https://github.com/sp1-patches/RustCrypto-hashes.git", package = "sha2", branch = "patch-v0.10.8" } \ No newline at end of file +sha2-v0-10-8 = { git = "https://github.com/sp1-patches/RustCrypto-hashes.git", package = "sha2", branch = "patch-v0.10.8" } diff --git a/examples/tendermint/program/Cargo.toml b/examples/tendermint/program/Cargo.toml index 942997b993..5ed14c87f5 100644 --- a/examples/tendermint/program/Cargo.toml +++ b/examples/tendermint/program/Cargo.toml @@ -8,8 +8,8 @@ edition = "2021" sp1-zkvm = { path = "../../../zkvm/entrypoint" } serde_json = { version = "1.0", default-features = false, features = ["alloc"] } serde = { version = "1.0", default-features = false, features = ["derive"] } -tendermint-light-client-verifier = { git = "https://github.com/i-m-aditya/tendermint-rs.git", branch = "i-m-aditya/break-loop-on-having-enough-voting-power", default-features = false, features = [ - "rust-crypto", +tendermint-light-client-verifier = { git = "https://github.com/i-m-aditya/tendermint-rs.git", branch = "i-m-aditya/break-loop-on-having-enough-voting-power", default-features = false, features = [ + "rust-crypto", ] } # tendermint-light-client-verifier = { version = "0.34.0", default-features = false, features = [ # "rust-crypto", diff --git a/examples/tendermint/script/Cargo.toml b/examples/tendermint/script/Cargo.toml index 4c494a9562..dd43f10dbe 100644 --- a/examples/tendermint/script/Cargo.toml +++ b/examples/tendermint/script/Cargo.toml @@ -4,7 +4,7 @@ name = "tendermint-script" edition = "2021" [dependencies] -sp1-core = { path = "../../../core", features = ["neon"] } +sp1-core = { path = "../../../core", features = ["neon"] } sp1-sdk = { path = "../../../sdk" } reqwest = { version = "0.11", features = ["json"] } tokio = { version = "1", features = ["full"] } @@ -12,7 +12,7 @@ serde_json = { version = "1.0", default-features = false, features = ["alloc"] } serde = { version = "1.0", default-features = false, features = ["derive"] } tendermint = { version = "0.34.0", default-features = false } tendermint-light-client-verifier = { version = "0.34.0", default-features = false, features = [ - "rust-crypto", + "rust-crypto", ] } bincode = "1.3.3" itertools = "0.12.1" diff --git a/helper/Cargo.toml b/helper/Cargo.toml index 169cf9bf1b..1c03ce433f 100644 --- a/helper/Cargo.toml +++ b/helper/Cargo.toml @@ -3,8 +3,6 @@ name = "sp1-helper" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] cargo_metadata = "0.18.1" chrono = { version = "0.4.38", default-features = false, features = ["clock"] } diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index 6c629b9985..1f48703fb2 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -3,8 +3,6 @@ name = "sp1-primitives" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] lazy_static = "1.4.0" p3-field = { workspace = true } diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 09360aa84c..2876adee09 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -3,8 +3,6 @@ name = "sp1-prover" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] sp1-recursion-program = { path = "../recursion/program" } sp1-recursion-circuit = { path = "../recursion/circuit" } @@ -36,9 +34,9 @@ dirs = "5.0.1" tempfile = "3.10.1" tokio = { version = "1.37.0", features = ["full"] } reqwest = { version = "0.12.4", features = [ - "rustls-tls", - "trust-dns", - "stream", + "rustls-tls", + "trust-dns", + "stream", ] } indicatif = "0.17.8" futures = "0.3.30" diff --git a/recursion/circuit/Cargo.toml b/recursion/circuit/Cargo.toml index faedfe5686..8843d11859 100644 --- a/recursion/circuit/Cargo.toml +++ b/recursion/circuit/Cargo.toml @@ -3,8 +3,6 @@ name = "sp1-recursion-circuit" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] p3-air = { workspace = true } p3-field = { workspace = true } diff --git a/recursion/compiler/Cargo.toml b/recursion/compiler/Cargo.toml index 23a17e796e..179906f091 100644 --- a/recursion/compiler/Cargo.toml +++ b/recursion/compiler/Cargo.toml @@ -3,8 +3,6 @@ name = "sp1-recursion-compiler" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] p3-air = { workspace = true } p3-field = { workspace = true } diff --git a/recursion/core/Cargo.toml b/recursion/core/Cargo.toml index adc4cfb976..4a227deb2a 100644 --- a/recursion/core/Cargo.toml +++ b/recursion/core/Cargo.toml @@ -32,4 +32,4 @@ arrayref = "0.3.7" static_assertions = "1.1.0" [dev-dependencies] -rand = "0.8.5" \ No newline at end of file +rand = "0.8.5" diff --git a/recursion/derive/Cargo.toml b/recursion/derive/Cargo.toml index d566c4a121..410e544ce0 100644 --- a/recursion/derive/Cargo.toml +++ b/recursion/derive/Cargo.toml @@ -3,8 +3,6 @@ name = "sp1-recursion-derive" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [lib] proc-macro = true diff --git a/recursion/program/Cargo.toml b/recursion/program/Cargo.toml index b564ba7ebf..80ed1c9d2e 100644 --- a/recursion/program/Cargo.toml +++ b/recursion/program/Cargo.toml @@ -3,8 +3,6 @@ name = "sp1-recursion-program" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] p3-air = { workspace = true } p3-field = { workspace = true } diff --git a/sdk/Cargo.toml b/sdk/Cargo.toml index 12e8cfbf37..0bdb17e5e7 100644 --- a/sdk/Cargo.toml +++ b/sdk/Cargo.toml @@ -3,8 +3,6 @@ name = "sp1-sdk" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] prost = "0.12" prost-types = "0.12" @@ -14,9 +12,9 @@ twirp = { git = "https://github.com/github/twirp-rs.git", rev = "c85f31f9c549573 async-trait = "0.1.80" reqwest-middleware = "0.3.1" reqwest = { version = "0.12.4", features = [ - "rustls-tls", - "trust-dns", - "stream", + "rustls-tls", + "trust-dns", + "stream", ] } anyhow = "1.0.83" sp1-prover = { path = "../prover", default-features = false } @@ -33,8 +31,8 @@ hex = "0.4.3" log = "0.4.21" axum = "=0.7.5" alloy = { git = "https://github.com/alloy-rs/alloy", rev = "bfd0fda", features = [ - "contract", - "signer-wallet", + "contract", + "signer-wallet", ] } dotenv = "0.15.0" sha2 = "0.10.8" @@ -49,7 +47,7 @@ groth16 = ["sp1-prover/groth16"] [build-dependencies] vergen = { version = "8", default-features = false, features = [ - "build", - "git", - "git2", + "build", + "git", + "git2", ] } diff --git a/tests/blake3-compress/Cargo.toml b/tests/blake3-compress/Cargo.toml index 2e22055ff2..e5987407cc 100644 --- a/tests/blake3-compress/Cargo.toml +++ b/tests/blake3-compress/Cargo.toml @@ -5,4 +5,4 @@ name = "blake3-compress-test" edition = "2021" [dependencies] -sp1-zkvm = { path = "../../zkvm/entrypoint" } \ No newline at end of file +sp1-zkvm = { path = "../../zkvm/entrypoint" } diff --git a/tests/bls12381-add/Cargo.toml b/tests/bls12381-add/Cargo.toml index 02c91d4cbd..16e8468311 100644 --- a/tests/bls12381-add/Cargo.toml +++ b/tests/bls12381-add/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" [dependencies] sp1-zkvm = { path = "../../zkvm/entrypoint" } -num = { version = "0.4.1", default-features = false } \ No newline at end of file +num = { version = "0.4.1", default-features = false } diff --git a/tests/bls12381-double/Cargo.toml b/tests/bls12381-double/Cargo.toml index 1d4a5c6b19..196c93ab2e 100644 --- a/tests/bls12381-double/Cargo.toml +++ b/tests/bls12381-double/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" [dependencies] sp1-zkvm = { path = "../../zkvm/entrypoint" } -num = { version = "0.4.1", default-features = false } \ No newline at end of file +num = { version = "0.4.1", default-features = false } diff --git a/tests/bls12381-mul/Cargo.toml b/tests/bls12381-mul/Cargo.toml index c0e8d41e2f..3ba324ce9a 100644 --- a/tests/bls12381-mul/Cargo.toml +++ b/tests/bls12381-mul/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" [dependencies] sp1-zkvm = { path = "../../zkvm/entrypoint" } -sp1-derive = { path = "../../derive" } \ No newline at end of file +sp1-derive = { path = "../../derive" } diff --git a/tests/bn254-add/Cargo.toml b/tests/bn254-add/Cargo.toml index 17ab4f68ab..4d07db91e7 100644 --- a/tests/bn254-add/Cargo.toml +++ b/tests/bn254-add/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" [dependencies] sp1-zkvm = { path = "../../zkvm/entrypoint" } -num = { version = "0.4.1", default-features = false } \ No newline at end of file +num = { version = "0.4.1", default-features = false } diff --git a/tests/bn254-double/Cargo.toml b/tests/bn254-double/Cargo.toml index 5c3ad8cb38..d0d3f75d34 100644 --- a/tests/bn254-double/Cargo.toml +++ b/tests/bn254-double/Cargo.toml @@ -7,4 +7,4 @@ edition = "2021" [dependencies] sp1-zkvm = { path = "../../zkvm/entrypoint" } hex-literal = "0.4.1" -num = { version = "0.4.1", default-features = false } \ No newline at end of file +num = { version = "0.4.1", default-features = false } diff --git a/tests/bn254-mul/Cargo.toml b/tests/bn254-mul/Cargo.toml index a60b87bcbe..fdf493b3f8 100644 --- a/tests/bn254-mul/Cargo.toml +++ b/tests/bn254-mul/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" [dependencies] sp1-zkvm = { path = "../../zkvm/entrypoint" } -sp1-derive = { path = "../../derive" } \ No newline at end of file +sp1-derive = { path = "../../derive" } diff --git a/tests/cycle-tracker/Cargo.toml b/tests/cycle-tracker/Cargo.toml index c8f7979246..b9c2ebf69d 100644 --- a/tests/cycle-tracker/Cargo.toml +++ b/tests/cycle-tracker/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" [dependencies] sp1-zkvm = { path = "../../zkvm/entrypoint" } -sp1-derive = { path = "../../derive" } \ No newline at end of file +sp1-derive = { path = "../../derive" } diff --git a/tests/ed-add/Cargo.toml b/tests/ed-add/Cargo.toml index 6aade74516..2b4b819bfd 100644 --- a/tests/ed-add/Cargo.toml +++ b/tests/ed-add/Cargo.toml @@ -7,4 +7,4 @@ edition = "2021" [dependencies] sp1-zkvm = { path = "../../zkvm/entrypoint" } hex-literal = "0.4.1" -num = { version = "0.4.1", default-features = false } \ No newline at end of file +num = { version = "0.4.1", default-features = false } diff --git a/tests/ed-decompress/Cargo.toml b/tests/ed-decompress/Cargo.toml index 18089ae207..676a808cbb 100644 --- a/tests/ed-decompress/Cargo.toml +++ b/tests/ed-decompress/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" [dependencies] sp1-zkvm = { path = "../../zkvm/entrypoint" } -hex-literal = "0.4.1" \ No newline at end of file +hex-literal = "0.4.1" diff --git a/tests/ed25519/Cargo.toml b/tests/ed25519/Cargo.toml index 884da0db08..412f7f58ac 100644 --- a/tests/ed25519/Cargo.toml +++ b/tests/ed25519/Cargo.toml @@ -8,4 +8,3 @@ edition = "2021" sp1-zkvm = { path = "../../zkvm/entrypoint" } ed25519-dalek = { git = "https://github.com/sp1-patches/curve25519-dalek", branch = "patch-v4.1.1" } hex-literal = "0.4.1" - diff --git a/tests/fibonacci/Cargo.toml b/tests/fibonacci/Cargo.toml index 7d2b49c5e2..31f8878487 100644 --- a/tests/fibonacci/Cargo.toml +++ b/tests/fibonacci/Cargo.toml @@ -5,4 +5,4 @@ name = "fibonacci-program" edition = "2021" [dependencies] -sp1-zkvm = { path = "../../zkvm/entrypoint" } \ No newline at end of file +sp1-zkvm = { path = "../../zkvm/entrypoint" } diff --git a/tests/keccak-permute/Cargo.toml b/tests/keccak-permute/Cargo.toml index 29ddca726e..ce764242b5 100644 --- a/tests/keccak-permute/Cargo.toml +++ b/tests/keccak-permute/Cargo.toml @@ -5,4 +5,4 @@ name = "keccak-permute-test" edition = "2021" [dependencies] -sp1-zkvm = { path = "../../zkvm/entrypoint" } \ No newline at end of file +sp1-zkvm = { path = "../../zkvm/entrypoint" } diff --git a/tests/keccak256/Cargo.toml b/tests/keccak256/Cargo.toml index 734352bd0b..679b2a6581 100644 --- a/tests/keccak256/Cargo.toml +++ b/tests/keccak256/Cargo.toml @@ -6,4 +6,6 @@ edition = "2021" [dependencies] sp1-zkvm = { path = "../../zkvm/entrypoint" } -tiny-keccak = { git = "https://github.com/sp1-patches/tiny-keccak", branch="patch-v2.0.2", features = ["keccak"] } +tiny-keccak = { git = "https://github.com/sp1-patches/tiny-keccak", branch = "patch-v2.0.2", features = [ + "keccak", +] } diff --git a/tests/secp256k1-add/Cargo.toml b/tests/secp256k1-add/Cargo.toml index 368813533d..49c0b03008 100644 --- a/tests/secp256k1-add/Cargo.toml +++ b/tests/secp256k1-add/Cargo.toml @@ -7,4 +7,4 @@ edition = "2021" [dependencies] sp1-zkvm = { path = "../../zkvm/entrypoint" } hex-literal = "0.4.1" -num = { version = "0.4.1", default-features = false } \ No newline at end of file +num = { version = "0.4.1", default-features = false } diff --git a/tests/secp256k1-decompress/Cargo.toml b/tests/secp256k1-decompress/Cargo.toml index 2ae86ed3a0..bd80d18ab3 100644 --- a/tests/secp256k1-decompress/Cargo.toml +++ b/tests/secp256k1-decompress/Cargo.toml @@ -5,4 +5,4 @@ name = "secp256k1-decompress-test" edition = "2021" [dependencies] -sp1-zkvm = { path = "../../zkvm/entrypoint" } \ No newline at end of file +sp1-zkvm = { path = "../../zkvm/entrypoint" } diff --git a/tests/secp256k1-double/Cargo.toml b/tests/secp256k1-double/Cargo.toml index 3a0d0a546f..dc8f3f3592 100644 --- a/tests/secp256k1-double/Cargo.toml +++ b/tests/secp256k1-double/Cargo.toml @@ -7,4 +7,4 @@ edition = "2021" [dependencies] sp1-zkvm = { path = "../../zkvm/entrypoint" } hex-literal = "0.4.1" -num = { version = "0.4.1", default-features = false } \ No newline at end of file +num = { version = "0.4.1", default-features = false } diff --git a/tests/secp256k1-mul/Cargo.toml b/tests/secp256k1-mul/Cargo.toml index 0ed92ad12c..79774d01f8 100644 --- a/tests/secp256k1-mul/Cargo.toml +++ b/tests/secp256k1-mul/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" [dependencies] sp1-zkvm = { path = "../../zkvm/entrypoint" } -sp1-derive = { path = "../../derive" } \ No newline at end of file +sp1-derive = { path = "../../derive" } diff --git a/tests/sha-compress/Cargo.toml b/tests/sha-compress/Cargo.toml index ed4e6de43b..0e6422b80b 100644 --- a/tests/sha-compress/Cargo.toml +++ b/tests/sha-compress/Cargo.toml @@ -5,4 +5,4 @@ name = "sha-compress-test" edition = "2021" [dependencies] -sp1-zkvm = { path = "../../zkvm/entrypoint" } \ No newline at end of file +sp1-zkvm = { path = "../../zkvm/entrypoint" } diff --git a/tests/sha-extend/Cargo.toml b/tests/sha-extend/Cargo.toml index db44d581cd..576dd8b680 100644 --- a/tests/sha-extend/Cargo.toml +++ b/tests/sha-extend/Cargo.toml @@ -5,4 +5,4 @@ name = "sha-extend-test" edition = "2021" [dependencies] -sp1-zkvm = { path = "../../zkvm/entrypoint" } \ No newline at end of file +sp1-zkvm = { path = "../../zkvm/entrypoint" } diff --git a/tests/sha2/Cargo.toml b/tests/sha2/Cargo.toml index 8c7095d276..0db676e24a 100644 --- a/tests/sha2/Cargo.toml +++ b/tests/sha2/Cargo.toml @@ -8,4 +8,4 @@ edition = "2021" sp1-zkvm = { path = "../../zkvm/entrypoint" } hex-literal = "0.4.1" sha2 = { git = "https://github.com/succinctbot/RustCrypto-hashes.git" } -hex = "0.4.3" \ No newline at end of file +hex = "0.4.3" diff --git a/tests/tendermint-benchmark/Cargo.toml b/tests/tendermint-benchmark/Cargo.toml index c64fc40a4a..944d94bbd3 100644 --- a/tests/tendermint-benchmark/Cargo.toml +++ b/tests/tendermint-benchmark/Cargo.toml @@ -10,9 +10,9 @@ serde_json = { version = "1.0", default-features = false, features = ["alloc"] } serde = { version = "1.0", default-features = false, features = ["derive"] } tendermint = { version = "0.34.0", default-features = false } tendermint-light-client-verifier = { version = "0.34.0", default-features = false, features = [ - "rust-crypto", + "rust-crypto", ] } [patch.crates-io] sha2-v0-9-8 = { git = "https://github.com/sp1-patches/RustCrypto-hashes", package = "sha2", branch = "patch-v0.9.8" } -ed25519-consensus = { git = "https://github.com/sp1-patches/ed25519-consensus", branch = "patch-v2.1.0" } \ No newline at end of file +ed25519-consensus = { git = "https://github.com/sp1-patches/ed25519-consensus", branch = "patch-v2.1.0" } diff --git a/tests/uint256-arith/Cargo.toml b/tests/uint256-arith/Cargo.toml index d92b54abf1..54cca58f13 100644 --- a/tests/uint256-arith/Cargo.toml +++ b/tests/uint256-arith/Cargo.toml @@ -7,4 +7,4 @@ edition = "2021" [dependencies] sp1-zkvm = { path = "../../zkvm/entrypoint" } sp1-derive = { git = "https://github.com/succinctlabs/sp1.git" } -crypto-bigint = "0.6.0-pre.12" \ No newline at end of file +crypto-bigint = "0.6.0-pre.12" diff --git a/tests/uint256-div/Cargo.toml b/tests/uint256-div/Cargo.toml index 2ec1c772c1..495c8bc9a6 100644 --- a/tests/uint256-div/Cargo.toml +++ b/tests/uint256-div/Cargo.toml @@ -8,4 +8,4 @@ edition = "2021" rand = "0.8" num = { version = "0.4.1" } sp1-zkvm = { path = "../../zkvm/entrypoint" } -sp1-derive = { path = "../../derive" } \ No newline at end of file +sp1-derive = { path = "../../derive" } diff --git a/zkvm/entrypoint/Cargo.toml b/zkvm/entrypoint/Cargo.toml index 422a49dade..1c69b11628 100644 --- a/zkvm/entrypoint/Cargo.toml +++ b/zkvm/entrypoint/Cargo.toml @@ -22,8 +22,8 @@ sha2 = { version = "0.10.8" } default = ["libm"] libm = ["dep:libm"] verify = [ - "dep:sp1-primitives", - "dep:p3-baby-bear", - "dep:p3-field", - "sp1-precompiles/verify", + "dep:sp1-primitives", + "dep:p3-baby-bear", + "dep:p3-field", + "sp1-precompiles/verify", ] diff --git a/zkvm/precompiles/Cargo.toml b/zkvm/precompiles/Cargo.toml index cbd3c254ed..5b1fbd73ff 100644 --- a/zkvm/precompiles/Cargo.toml +++ b/zkvm/precompiles/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" [dependencies] amcl = { package = "snowbridge-amcl", version = "1.0.2", default-features = false, features = [ - "bls381", + "bls381", ] } anyhow = "1.0.83" bincode = "1.3.3" From eea823ede00131fef4511e1199fbabfac2028754 Mon Sep 17 00:00:00 2001 From: bing Date: Fri, 24 May 2024 05:32:55 +0800 Subject: [PATCH 17/42] chore: remove unused deps (#794) Co-authored-by: Bing Co-authored-by: John Guibas --- Cargo.lock | 179 ++------------------------------- cli/Cargo.toml | 3 - core/Cargo.toml | 2 - prover/Cargo.toml | 1 - recursion/compiler/Cargo.toml | 2 - recursion/gnark-ffi/Cargo.toml | 3 - recursion/program/Cargo.toml | 1 - sdk/Cargo.toml | 2 - 8 files changed, 7 insertions(+), 186 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c4add6d707..4e41c0e181 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -246,9 +246,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d58d9f5da7b40e9bfff0b7e7816700be4019db97d4b6359fe7f94a9e22e42ac" +checksum = "b155716bab55763c95ba212806cf43d05bcc70e5f35b02bad20cf5ec7fe11fed" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -257,9 +257,9 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a047897373be4bbb0224c1afdabca92648dc57a9c9ef6e7b0be3aff7a859c83" +checksum = "8037e03c7f462a063f28daec9fda285a9a89da003c552f8637a80b9c8fd96241" dependencies = [ "proc-macro2", "quote", @@ -669,12 +669,6 @@ dependencies = [ "rand", ] -[[package]] -name = "array-macro" -version = "2.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "220a2c618ab466efe41d0eace94dfeff1c35e3aa47891bdb95e1c0fefffd3c99" - [[package]] name = "arrayref" version = "0.3.7" @@ -856,7 +850,7 @@ dependencies = [ "bitflags 2.5.0", "cexpr", "clang-sys", - "itertools 0.10.5", + "itertools 0.12.1", "lazy_static", "lazycell", "log", @@ -943,11 +937,6 @@ dependencies = [ "rayon", ] -[[package]] -name = "blake3-zkvm" -version = "0.1.0" -source = "git+https://github.com/sp1-patches/BLAKE3.git?branch=patch-blake3_zkvm/v.1.0.0#bac2d59f9122b07a4d91475560b4c3214ae62444" - [[package]] name = "block-buffer" version = "0.10.4" @@ -1253,15 +1242,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - [[package]] name = "criterion" version = "0.5.1" @@ -1298,28 +1278,6 @@ dependencies = [ "itertools 0.10.5", ] -[[package]] -name = "crossbeam" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-epoch", - "crossbeam-queue", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "crossbeam-deque" version = "0.8.5" @@ -1339,15 +1297,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "crossbeam-queue" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "crossbeam-utils" version = "0.8.20" @@ -1522,19 +1471,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "dialoguer" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" -dependencies = [ - "console", - "shell-words", - "tempfile", - "thiserror", - "zeroize", -] - [[package]] name = "digest" version = "0.9.0" @@ -1577,12 +1513,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "dotenv" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" - [[package]] name = "downcast-rs" version = "1.2.1" @@ -1748,18 +1678,6 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" -[[package]] -name = "filetime" -version = "0.2.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.4.1", - "windows-sys 0.52.0", -] - [[package]] name = "fixed-hash" version = "0.8.0" @@ -1772,16 +1690,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "flate2" -version = "1.0.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - [[package]] name = "fnv" version = "1.0.7" @@ -3252,7 +3160,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.1", + "redox_syscall", "smallvec", "windows-targets 0.52.5", ] @@ -3520,21 +3428,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.12.1", "proc-macro2", "quote", "syn 2.0.65", ] -[[package]] -name = "prost-types" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" -dependencies = [ - "prost", -] - [[package]] name = "quick-error" version = "1.2.3" @@ -3624,15 +3523,6 @@ dependencies = [ "rayon", ] -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.5.1" @@ -3747,7 +3637,6 @@ dependencies = [ "base64 0.22.1", "bytes", "encoding_rs", - "futures-channel", "futures-core", "futures-util", "h2 0.4.5", @@ -4308,12 +4197,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "shell-words" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" - [[package]] name = "shlex" version = "1.3.0" @@ -4388,10 +4271,8 @@ dependencies = [ "anyhow", "cargo_metadata", "clap", - "dialoguer", "dirs", "downloader", - "flate2", "futures-util", "hex", "indicatif", @@ -4402,7 +4283,6 @@ dependencies = [ "sp1-core", "sp1-prover", "sp1-sdk", - "tar", "target-lexicon", "tempfile", "tokio", @@ -4418,7 +4298,6 @@ dependencies = [ "arrayref", "bincode", "blake3", - "blake3-zkvm", "cfg-if", "criterion", "curve25519-dalek", @@ -4455,7 +4334,6 @@ dependencies = [ "rrs-lib", "serde", "serde_with", - "serial_test", "size", "snowbridge-amcl", "sp1-derive", @@ -4567,7 +4445,6 @@ dependencies = [ "thiserror", "tokio", "tracing", - "tracing-appender", "tracing-subscriber", ] @@ -4623,8 +4500,6 @@ dependencies = [ "p3-util", "rand", "serde", - "serde_json", - "serial_test", "sp1-core", "sp1-recursion-core", "sp1-recursion-derive", @@ -4680,17 +4555,14 @@ dependencies = [ "bindgen", "cc", "cfg-if", - "crossbeam", "log", "num-bigint 0.4.5", "p3-baby-bear", "p3-field", "rand", - "reqwest 0.12.4", "serde", "serde_json", "sp1-recursion-compiler", - "subtle-encoding", "tempfile", ] @@ -4698,7 +4570,6 @@ dependencies = [ name = "sp1-recursion-program" version = "0.1.0" dependencies = [ - "array-macro", "itertools 0.12.1", "p3-air", "p3-baby-bear", @@ -4732,7 +4603,6 @@ dependencies = [ "bincode", "cfg-if", "dirs", - "dotenv", "futures", "hex", "indicatif", @@ -4742,7 +4612,6 @@ dependencies = [ "p3-field", "p3-matrix", "prost", - "prost-types", "reqwest 0.12.4", "reqwest-middleware", "serde", @@ -4917,17 +4786,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" -[[package]] -name = "tar" -version = "0.4.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" -dependencies = [ - "filetime", - "libc", - "xattr", -] - [[package]] name = "target-lexicon" version = "0.12.14" @@ -5206,18 +5064,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-appender" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" -dependencies = [ - "crossbeam-channel", - "thiserror", - "time", - "tracing-subscriber", -] - [[package]] name = "tracing-attributes" version = "0.1.27" @@ -5806,17 +5652,6 @@ dependencies = [ "tap", ] -[[package]] -name = "xattr" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" -dependencies = [ - "libc", - "linux-raw-sys", - "rustix", -] - [[package]] name = "yansi" version = "1.0.1" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 68968e38a7..6831879e6e 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -25,8 +25,6 @@ reqwest = { version = "0.12.4", features = [ futures-util = "0.3.30" indicatif = "0.17.8" tokio = { version = "1", features = ["full"] } -tar = "0.4" -flate2 = "1.0" dirs = "5.0" serde = { version = "1", features = ["derive"] } rand = "0.8" @@ -38,5 +36,4 @@ yansi = "1.0.1" hex = "0.4.3" anstyle = "1.0.7" target-lexicon = "0.12.14" -dialoguer = "0.11.0" tempfile = "3.10.1" diff --git a/core/Cargo.toml b/core/Cargo.toml index 682d0639d9..df02550f1a 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -38,7 +38,6 @@ amcl = { package = "snowbridge-amcl", version = "1.0.2", default-features = fals ] } arrayref = "0.3.7" blake3 = "1.5" -blake3-zkvm = { git = "https://github.com/sp1-patches/BLAKE3.git", branch = "patch-blake3_zkvm/v.1.0.0" } cfg-if = "1.0.0" generic-array = { version = "1.0.0", features = ["alloc", "serde"] } typenum = "1.17.0" @@ -57,7 +56,6 @@ strum_macros = "0.26" strum = "0.26" web-time = "1.1.0" rayon-scan = "0.1.1" -serial_test = "3.1.1" thiserror = "1.0.60" num-bigint = { version = "0.4.3", default-features = false } diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 2876adee09..ac438ded52 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -23,7 +23,6 @@ rayon = "1.10.0" itertools = "0.12.1" tracing = "0.1.40" tracing-subscriber = "0.3.18" -tracing-appender = "0.2.3" serde_json = "1.0.117" clap = { version = "4.5.4", features = ["derive", "env"] } sha2 = "0.10.8" diff --git a/recursion/compiler/Cargo.toml b/recursion/compiler/Cargo.toml index 179906f091..736013ff09 100644 --- a/recursion/compiler/Cargo.toml +++ b/recursion/compiler/Cargo.toml @@ -16,10 +16,8 @@ sp1-core = { path = "../../core" } itertools = "0.12.1" serde = { version = "1.0.201", features = ["derive"] } sp1-recursion-derive = { path = "../derive" } -serde_json = "1.0.117" p3-bn254-fr = { workspace = true } p3-baby-bear = { workspace = true } -serial_test = "3.1.1" p3-poseidon2 = { workspace = true } backtrace = "0.3.71" tracing = "0.1.40" diff --git a/recursion/gnark-ffi/Cargo.toml b/recursion/gnark-ffi/Cargo.toml index 159574c25d..d35800008a 100644 --- a/recursion/gnark-ffi/Cargo.toml +++ b/recursion/gnark-ffi/Cargo.toml @@ -10,10 +10,7 @@ sp1-recursion-compiler = { path = "../compiler" } serde = "1.0.201" serde_json = "1.0.117" tempfile = "3.10.1" -reqwest = { version = "0.12", features = ["json", "blocking"] } rand = "0.8" -crossbeam = "0.8" -subtle-encoding = "0.5.1" log = "0.4.21" num-bigint = "0.4.5" cfg-if = "1.0" diff --git a/recursion/program/Cargo.toml b/recursion/program/Cargo.toml index 80ed1c9d2e..47dd52380c 100644 --- a/recursion/program/Cargo.toml +++ b/recursion/program/Cargo.toml @@ -23,5 +23,4 @@ sp1-core = { path = "../../core" } itertools = "0.12.1" serde = { version = "1.0.201", features = ["derive"] } rand = "0.8.5" -array-macro = "2.1.8" tracing = "0.1.40" diff --git a/sdk/Cargo.toml b/sdk/Cargo.toml index 0bdb17e5e7..e7f05c1fc7 100644 --- a/sdk/Cargo.toml +++ b/sdk/Cargo.toml @@ -5,7 +5,6 @@ edition = "2021" [dependencies] prost = "0.12" -prost-types = "0.12" serde = { version = "1.0.201", features = ["derive"] } serde_json = "1.0.117" twirp = { git = "https://github.com/github/twirp-rs.git", rev = "c85f31f9c54957374e7dcb3534fc52cff0aa2dc5" } @@ -34,7 +33,6 @@ alloy = { git = "https://github.com/alloy-rs/alloy", rev = "bfd0fda", features = "contract", "signer-wallet", ] } -dotenv = "0.15.0" sha2 = "0.10.8" dirs = "5.0.1" tempfile = "3.10.1" From 76687992ff69dc981a49825db9fab3708fc42346 Mon Sep 17 00:00:00 2001 From: Robin Salen <30937548+Nashtare@users.noreply.github.com> Date: Thu, 23 May 2024 18:16:06 -0400 Subject: [PATCH 18/42] chore: Make some functions const (#774) Co-authored-by: John Guibas --- core/src/air/extension.rs | 2 +- core/src/air/interaction.rs | 2 +- core/src/air/polynomial.rs | 2 +- core/src/air/sub_builder.rs | 2 +- core/src/alu/divrem/utils.rs | 2 +- core/src/alu/mul/utils.rs | 2 +- core/src/alu/sr/utils.rs | 4 +- core/src/bytes/utils.rs | 2 +- core/src/disassembler/elf.rs | 2 +- core/src/disassembler/instruction.rs | 16 ++-- core/src/disassembler/mod.rs | 2 +- core/src/io.rs | 4 +- core/src/lookup/interaction.rs | 4 +- core/src/memory/global.rs | 2 +- core/src/memory/mod.rs | 4 +- core/src/memory/program.rs | 2 +- core/src/operations/field/field_den.rs | 2 +- .../operations/field/field_inner_product.rs | 2 +- core/src/operations/field/field_op.rs | 2 +- core/src/operations/field/field_sqrt.rs | 2 +- core/src/operations/fixed_rotate_right.rs | 6 +- core/src/operations/fixed_shift_right.rs | 6 +- core/src/program/mod.rs | 2 +- core/src/runtime/instruction.rs | 17 ++-- core/src/runtime/memory.rs | 6 +- core/src/runtime/mod.rs | 2 +- core/src/runtime/opcode.rs | 2 +- core/src/runtime/utils.rs | 2 +- core/src/stark/chip.rs | 4 +- core/src/stark/machine.rs | 4 +- core/src/stark/types.rs | 4 +- core/src/syscall/commit.rs | 4 +- core/src/syscall/halt.rs | 2 +- core/src/syscall/hint.rs | 4 +- .../precompiles/blake3/compress/mod.rs | 4 +- .../src/syscall/precompiles/edwards/ed_add.rs | 2 +- .../precompiles/edwards/ed_decompress.rs | 2 +- core/src/syscall/precompiles/keccak256/mod.rs | 2 +- .../precompiles/sha256/compress/mod.rs | 2 +- .../syscall/precompiles/sha256/extend/mod.rs | 2 +- core/src/syscall/precompiles/uint256/air.rs | 2 +- .../weierstrass/weierstrass_add.rs | 2 +- .../weierstrass/weierstrass_decompress.rs | 2 +- .../weierstrass/weierstrass_double.rs | 2 +- core/src/syscall/unconstrained.rs | 4 +- core/src/syscall/verify.rs | 2 +- core/src/syscall/write.rs | 2 +- core/src/utils/buffer.rs | 2 +- core/src/utils/ec/mod.rs | 2 +- examples/Cargo.lock | 73 +----------------- .../programs/aggregation/Cargo.lock | 41 +++++----- .../programs/aggregation/Cargo.toml | 4 +- .../elf/riscv32im-succinct-zkvm-elf | Bin 149172 -> 148900 bytes .../aggregation/programs/fibonacci/Cargo.lock | 40 +++++----- .../aggregation/programs/fibonacci/Cargo.toml | 2 +- .../fibonacci/elf/riscv32im-succinct-zkvm-elf | Bin 127764 -> 127540 bytes recursion/compiler/src/asm/code.rs | 4 +- recursion/compiler/src/asm/compiler.rs | 15 ++-- recursion/compiler/src/ir/builder.rs | 4 +- recursion/compiler/src/ir/symbolic.rs | 6 +- recursion/compiler/src/ir/types.rs | 6 +- recursion/core/src/fri_fold/mod.rs | 4 +- recursion/core/src/memory/air.rs | 2 +- recursion/core/src/poseidon2/external.rs | 2 +- recursion/core/src/poseidon2_wide/columns.rs | 4 +- recursion/core/src/program/mod.rs | 2 +- recursion/core/src/range_check/event.rs | 2 +- recursion/gnark-ffi/src/groth16.rs | 2 +- recursion/gnark-ffi/src/plonk_bn254.rs | 2 +- recursion/program/src/fri/domain.rs | 6 +- recursion/program/src/stark.rs | 4 +- sdk/src/proto/network.rs | 6 +- zkvm/entrypoint/src/syscalls/sys.rs | 4 +- zkvm/precompiles/src/utils.rs | 2 +- 74 files changed, 164 insertions(+), 234 deletions(-) diff --git a/core/src/air/extension.rs b/core/src/air/extension.rs index ea2a06775f..bac5907092 100644 --- a/core/src/air/extension.rs +++ b/core/src/air/extension.rs @@ -22,7 +22,7 @@ impl BinomialExtension { Self(arr) } - pub fn as_base_slice(&self) -> &[T] { + pub const fn as_base_slice(&self) -> &[T] { &self.0 } diff --git a/core/src/air/interaction.rs b/core/src/air/interaction.rs index 62348083cc..37150c99d3 100644 --- a/core/src/air/interaction.rs +++ b/core/src/air/interaction.rs @@ -9,7 +9,7 @@ pub struct AirInteraction { impl AirInteraction { /// Create a new interaction. - pub fn new(values: Vec, multiplicity: E, kind: InteractionKind) -> Self { + pub const fn new(values: Vec, multiplicity: E, kind: InteractionKind) -> Self { Self { values, multiplicity, diff --git a/core/src/air/polynomial.rs b/core/src/air/polynomial.rs index bee06ebbba..72c9dbd2fc 100644 --- a/core/src/air/polynomial.rs +++ b/core/src/air/polynomial.rs @@ -12,7 +12,7 @@ pub struct Polynomial { impl Polynomial { /// Create a new polynomial from a vector of coefficients. - pub fn new(coefficients: Vec) -> Self { + pub const fn new(coefficients: Vec) -> Self { Self { coefficients } } diff --git a/core/src/air/sub_builder.rs b/core/src/air/sub_builder.rs index d8c391fc4e..cd1f6be8a8 100644 --- a/core/src/air/sub_builder.rs +++ b/core/src/air/sub_builder.rs @@ -12,7 +12,7 @@ pub struct SubMatrixRowSlices, T: Send + Sync> { } impl, T: Send + Sync> SubMatrixRowSlices { - pub fn new(inner: M, column_range: Range) -> Self { + pub const fn new(inner: M, column_range: Range) -> Self { Self { inner, column_range, diff --git a/core/src/alu/divrem/utils.rs b/core/src/alu/divrem/utils.rs index 61943621ea..f3a7b7070f 100644 --- a/core/src/alu/divrem/utils.rs +++ b/core/src/alu/divrem/utils.rs @@ -29,7 +29,7 @@ pub fn get_quotient_and_remainder(b: u32, c: u32, opcode: Opcode) -> (u32, u32) } /// Calculate the most significant bit of the given 32-bit integer `a`, and returns it as a u8. -pub fn get_msb(a: u32) -> u8 { +pub const fn get_msb(a: u32) -> u8 { ((a >> 31) & 1) as u8 } diff --git a/core/src/alu/mul/utils.rs b/core/src/alu/mul/utils.rs index a7ac8864e8..db2914aca7 100644 --- a/core/src/alu/mul/utils.rs +++ b/core/src/alu/mul/utils.rs @@ -2,6 +2,6 @@ use crate::air::WORD_SIZE; use super::BYTE_SIZE; -pub fn get_msb(a: [u8; WORD_SIZE]) -> u8 { +pub const fn get_msb(a: [u8; WORD_SIZE]) -> u8 { (a[WORD_SIZE - 1] >> (BYTE_SIZE - 1)) & 1 } diff --git a/core/src/alu/sr/utils.rs b/core/src/alu/sr/utils.rs index f04543e797..46fb4a698a 100644 --- a/core/src/alu/sr/utils.rs +++ b/core/src/alu/sr/utils.rs @@ -3,7 +3,7 @@ use super::BYTE_SIZE; /// Calculate the number of bytes to shift by. /// /// Note that we take the least significant 5 bits per the RISC-V spec. -pub fn nb_bytes_to_shift(shift_amount: u32) -> usize { +pub const fn nb_bytes_to_shift(shift_amount: u32) -> usize { let n = (shift_amount % 32) as usize; n / BYTE_SIZE } @@ -11,7 +11,7 @@ pub fn nb_bytes_to_shift(shift_amount: u32) -> usize { /// Calculate the number of bits shift by. /// /// Note that we take the least significant 5 bits per the RISC-V spec. -pub fn nb_bits_to_shift(shift_amount: u32) -> usize { +pub const fn nb_bits_to_shift(shift_amount: u32) -> usize { let n = (shift_amount % 32) as usize; n % BYTE_SIZE } diff --git a/core/src/bytes/utils.rs b/core/src/bytes/utils.rs index d80d873428..7a56b9ecb4 100644 --- a/core/src/bytes/utils.rs +++ b/core/src/bytes/utils.rs @@ -1,5 +1,5 @@ /// Shifts a byte to the right and returns both the shifted byte and the bits that carried. -pub fn shr_carry(input: u8, rotation: u8) -> (u8, u8) { +pub const fn shr_carry(input: u8, rotation: u8) -> (u8, u8) { let c_mod = rotation & 0x7; if c_mod != 0 { let res = input >> c_mod; diff --git a/core/src/disassembler/elf.rs b/core/src/disassembler/elf.rs index 8f9dfb612b..42454f5c72 100644 --- a/core/src/disassembler/elf.rs +++ b/core/src/disassembler/elf.rs @@ -30,7 +30,7 @@ pub struct Elf { impl Elf { /// Create a new ELF file. - pub fn new( + pub const fn new( instructions: Vec, pc_start: u32, pc_base: u32, diff --git a/core/src/disassembler/instruction.rs b/core/src/disassembler/instruction.rs index 1b47f7b1e3..9c0eb3e512 100644 --- a/core/src/disassembler/instruction.rs +++ b/core/src/disassembler/instruction.rs @@ -7,7 +7,7 @@ use crate::runtime::{Instruction, Opcode, Register}; impl Instruction { /// Create a new instruction from an R-type instruction. - pub fn from_r_type(opcode: Opcode, dec_insn: RType) -> Self { + pub const fn from_r_type(opcode: Opcode, dec_insn: RType) -> Self { Self::new( opcode, dec_insn.rd as u32, @@ -19,7 +19,7 @@ impl Instruction { } /// Create a new instruction from an I-type instruction. - pub fn from_i_type(opcode: Opcode, dec_insn: IType) -> Self { + pub const fn from_i_type(opcode: Opcode, dec_insn: IType) -> Self { Self::new( opcode, dec_insn.rd as u32, @@ -31,7 +31,7 @@ impl Instruction { } /// Create a new instruction from an I-type instruction with a shamt. - pub fn from_i_type_shamt(opcode: Opcode, dec_insn: ITypeShamt) -> Self { + pub const fn from_i_type_shamt(opcode: Opcode, dec_insn: ITypeShamt) -> Self { Self::new( opcode, dec_insn.rd as u32, @@ -43,7 +43,7 @@ impl Instruction { } /// Create a new instruction from an S-type instruction. - pub fn from_s_type(opcode: Opcode, dec_insn: SType) -> Self { + pub const fn from_s_type(opcode: Opcode, dec_insn: SType) -> Self { Self::new( opcode, dec_insn.rs2 as u32, @@ -55,7 +55,7 @@ impl Instruction { } /// Create a new instruction from a B-type instruction. - pub fn from_b_type(opcode: Opcode, dec_insn: BType) -> Self { + pub const fn from_b_type(opcode: Opcode, dec_insn: BType) -> Self { Self::new( opcode, dec_insn.rs1 as u32, @@ -67,19 +67,19 @@ impl Instruction { } /// Create a new instruction that is not implemented. - pub fn unimp() -> Self { + pub const fn unimp() -> Self { Self::new(Opcode::UNIMP, 0, 0, 0, true, true) } /// Returns if the instruction is an R-type instruction. #[inline(always)] - pub fn is_r_type(&self) -> bool { + pub const fn is_r_type(&self) -> bool { !self.imm_c } /// Returns whether the instruction is an I-type instruction. #[inline(always)] - pub fn is_i_type(&self) -> bool { + pub const fn is_i_type(&self) -> bool { self.imm_c } diff --git a/core/src/disassembler/mod.rs b/core/src/disassembler/mod.rs index 9b94f2058c..a6a89f7f9e 100644 --- a/core/src/disassembler/mod.rs +++ b/core/src/disassembler/mod.rs @@ -10,7 +10,7 @@ use crate::runtime::{Instruction, Program}; impl Program { /// Create a new program. - pub fn new(instructions: Vec, pc_start: u32, pc_base: u32) -> Self { + pub const fn new(instructions: Vec, pc_start: u32, pc_base: u32) -> Self { Self { instructions, pc_start, diff --git a/core/src/io.rs b/core/src/io.rs index cfc461e724..b07643bbd3 100644 --- a/core/src/io.rs +++ b/core/src/io.rs @@ -27,7 +27,7 @@ pub struct SP1PublicValues { impl SP1Stdin { /// Create a new `SP1Stdin`. - pub fn new() -> Self { + pub const fn new() -> Self { Self { buffer: Vec::new(), ptr: 0, @@ -85,7 +85,7 @@ impl SP1Stdin { impl SP1PublicValues { /// Create a new `SP1PublicValues`. - pub fn new() -> Self { + pub const fn new() -> Self { Self { buffer: Buffer::new(), } diff --git a/core/src/lookup/interaction.rs b/core/src/lookup/interaction.rs index 0ac2a2903f..74b7a9fc06 100644 --- a/core/src/lookup/interaction.rs +++ b/core/src/lookup/interaction.rs @@ -56,7 +56,7 @@ impl InteractionKind { impl Interaction { /// Create a new interaction. - pub fn new( + pub const fn new( values: Vec>, multiplicity: VirtualPairCol, kind: InteractionKind, @@ -69,7 +69,7 @@ impl Interaction { } /// The index of the argument in the lookup table. - pub fn argument_index(&self) -> usize { + pub const fn argument_index(&self) -> usize { self.kind as usize } } diff --git a/core/src/memory/global.rs b/core/src/memory/global.rs index 5c9974e09f..60a27b0277 100644 --- a/core/src/memory/global.rs +++ b/core/src/memory/global.rs @@ -29,7 +29,7 @@ pub struct MemoryChip { impl MemoryChip { /// Creates a new memory chip with a certain type. - pub fn new(kind: MemoryChipType) -> Self { + pub const fn new(kind: MemoryChipType) -> Self { Self { kind } } } diff --git a/core/src/memory/mod.rs b/core/src/memory/mod.rs index dcd9e23fe9..7acdee1fb8 100644 --- a/core/src/memory/mod.rs +++ b/core/src/memory/mod.rs @@ -21,7 +21,7 @@ pub struct MemoryInitializeFinalizeEvent { } impl MemoryInitializeFinalizeEvent { - pub fn initialize(addr: u32, value: u32, used: bool) -> Self { + pub const fn initialize(addr: u32, value: u32, used: bool) -> Self { // All memory initialization happen at shard 0, timestamp 0. Self { addr, @@ -32,7 +32,7 @@ impl MemoryInitializeFinalizeEvent { } } - pub fn finalize_from_record(addr: u32, record: &MemoryRecord) -> Self { + pub const fn finalize_from_record(addr: u32, record: &MemoryRecord) -> Self { Self { addr, value: record.value, diff --git a/core/src/memory/program.rs b/core/src/memory/program.rs index fa8815c916..3d922c4ae6 100644 --- a/core/src/memory/program.rs +++ b/core/src/memory/program.rs @@ -44,7 +44,7 @@ pub struct MemoryProgramMultCols { pub struct MemoryProgramChip; impl MemoryProgramChip { - pub fn new() -> Self { + pub const fn new() -> Self { Self {} } } diff --git a/core/src/operations/field/field_den.rs b/core/src/operations/field/field_den.rs index 7940d8a0c5..b1f73e68ec 100644 --- a/core/src/operations/field/field_den.rs +++ b/core/src/operations/field/field_den.rs @@ -203,7 +203,7 @@ mod tests { } impl FieldDenChip

{ - pub fn new(sign: bool) -> Self { + pub const fn new(sign: bool) -> Self { Self { sign, _phantom: std::marker::PhantomData, diff --git a/core/src/operations/field/field_inner_product.rs b/core/src/operations/field/field_inner_product.rs index 2b259f2f7e..1a585e4e4c 100644 --- a/core/src/operations/field/field_inner_product.rs +++ b/core/src/operations/field/field_inner_product.rs @@ -200,7 +200,7 @@ mod tests { } impl FieldIpChip

{ - pub fn new() -> Self { + pub const fn new() -> Self { Self { _phantom: std::marker::PhantomData, } diff --git a/core/src/operations/field/field_op.rs b/core/src/operations/field/field_op.rs index 59bb85f2a2..ae04e2b9b1 100644 --- a/core/src/operations/field/field_op.rs +++ b/core/src/operations/field/field_op.rs @@ -311,7 +311,7 @@ mod tests { } impl FieldOpChip

{ - pub fn new(operation: FieldOperation) -> Self { + pub const fn new(operation: FieldOperation) -> Self { Self { operation, _phantom: std::marker::PhantomData, diff --git a/core/src/operations/field/field_sqrt.rs b/core/src/operations/field/field_sqrt.rs index 6693c2734e..c0401a1d46 100644 --- a/core/src/operations/field/field_sqrt.rs +++ b/core/src/operations/field/field_sqrt.rs @@ -187,7 +187,7 @@ mod tests { } impl EdSqrtChip

{ - pub fn new() -> Self { + pub const fn new() -> Self { Self { _phantom: std::marker::PhantomData, } diff --git a/core/src/operations/fixed_rotate_right.rs b/core/src/operations/fixed_rotate_right.rs index 150626db56..5172465b39 100644 --- a/core/src/operations/fixed_rotate_right.rs +++ b/core/src/operations/fixed_rotate_right.rs @@ -28,15 +28,15 @@ pub struct FixedRotateRightOperation { } impl FixedRotateRightOperation { - pub fn nb_bytes_to_shift(rotation: usize) -> usize { + pub const fn nb_bytes_to_shift(rotation: usize) -> usize { rotation / 8 } - pub fn nb_bits_to_shift(rotation: usize) -> usize { + pub const fn nb_bits_to_shift(rotation: usize) -> usize { rotation % 8 } - pub fn carry_multiplier(rotation: usize) -> u32 { + pub const fn carry_multiplier(rotation: usize) -> u32 { let nb_bits_to_shift = Self::nb_bits_to_shift(rotation); 1 << (8 - nb_bits_to_shift) } diff --git a/core/src/operations/fixed_shift_right.rs b/core/src/operations/fixed_shift_right.rs index 19e7f02308..305f573d4b 100644 --- a/core/src/operations/fixed_shift_right.rs +++ b/core/src/operations/fixed_shift_right.rs @@ -28,15 +28,15 @@ pub struct FixedShiftRightOperation { } impl FixedShiftRightOperation { - pub fn nb_bytes_to_shift(rotation: usize) -> usize { + pub const fn nb_bytes_to_shift(rotation: usize) -> usize { rotation / 8 } - pub fn nb_bits_to_shift(rotation: usize) -> usize { + pub const fn nb_bits_to_shift(rotation: usize) -> usize { rotation % 8 } - pub fn carry_multiplier(rotation: usize) -> u32 { + pub const fn carry_multiplier(rotation: usize) -> u32 { let nb_bits_to_shift = Self::nb_bits_to_shift(rotation); 1 << (8 - nb_bits_to_shift) } diff --git a/core/src/program/mod.rs b/core/src/program/mod.rs index 9bb69d9bfa..5b075db1cb 100644 --- a/core/src/program/mod.rs +++ b/core/src/program/mod.rs @@ -43,7 +43,7 @@ pub struct ProgramMultiplicityCols { pub struct ProgramChip; impl ProgramChip { - pub fn new() -> Self { + pub const fn new() -> Self { Self {} } } diff --git a/core/src/runtime/instruction.rs b/core/src/runtime/instruction.rs index 1fcf9a1950..9f8c7533c5 100644 --- a/core/src/runtime/instruction.rs +++ b/core/src/runtime/instruction.rs @@ -16,7 +16,14 @@ pub struct Instruction { impl Instruction { /// Create a new instruction. - pub fn new(opcode: Opcode, op_a: u32, op_b: u32, op_c: u32, imm_b: bool, imm_c: bool) -> Self { + pub const fn new( + opcode: Opcode, + op_a: u32, + op_b: u32, + op_c: u32, + imm_b: bool, + imm_c: bool, + ) -> Self { Self { opcode, op_a, @@ -28,7 +35,7 @@ impl Instruction { } /// Returns if the instruction is an ALU instruction. - pub fn is_alu_instruction(&self) -> bool { + pub const fn is_alu_instruction(&self) -> bool { matches!( self.opcode, Opcode::ADD @@ -58,7 +65,7 @@ impl Instruction { } /// Returns if the instruction is a memory instruction. - pub fn is_memory_instruction(&self) -> bool { + pub const fn is_memory_instruction(&self) -> bool { matches!( self.opcode, Opcode::LB @@ -73,7 +80,7 @@ impl Instruction { } /// Returns if the instruction is a branch instruction. - pub fn is_branch_instruction(&self) -> bool { + pub const fn is_branch_instruction(&self) -> bool { matches!( self.opcode, Opcode::BEQ | Opcode::BNE | Opcode::BLT | Opcode::BGE | Opcode::BLTU | Opcode::BGEU @@ -81,7 +88,7 @@ impl Instruction { } /// Returns if the instruction is a jump instruction. - pub fn is_jump_instruction(&self) -> bool { + pub const fn is_jump_instruction(&self) -> bool { matches!(self.opcode, Opcode::JAL | Opcode::JALR) } } diff --git a/core/src/runtime/memory.rs b/core/src/runtime/memory.rs index badfb9983e..4e66245187 100644 --- a/core/src/runtime/memory.rs +++ b/core/src/runtime/memory.rs @@ -53,7 +53,7 @@ pub struct MemoryWriteRecord { } impl MemoryRecordEnum { - pub fn value(&self) -> u32 { + pub const fn value(&self) -> u32 { match self { MemoryRecordEnum::Read(record) => record.value, MemoryRecordEnum::Write(record) => record.value, @@ -74,7 +74,7 @@ impl From for MemoryRecordEnum { } impl MemoryReadRecord { - pub fn new( + pub const fn new( value: u32, shard: u32, timestamp: u32, @@ -94,7 +94,7 @@ impl MemoryReadRecord { } impl MemoryWriteRecord { - pub fn new( + pub const fn new( value: u32, shard: u32, timestamp: u32, diff --git a/core/src/runtime/mod.rs b/core/src/runtime/mod.rs index 7868098a4d..b2c81fbb49 100644 --- a/core/src/runtime/mod.rs +++ b/core/src/runtime/mod.rs @@ -192,7 +192,7 @@ impl Runtime { } /// Get the current timestamp for a given memory access position. - pub fn timestamp(&self, position: &MemoryAccessPosition) -> u32 { + pub const fn timestamp(&self, position: &MemoryAccessPosition) -> u32 { self.state.clk + *position as u32 } diff --git a/core/src/runtime/opcode.rs b/core/src/runtime/opcode.rs index eb9cb03ecb..3eaf8caa88 100644 --- a/core/src/runtime/opcode.rs +++ b/core/src/runtime/opcode.rs @@ -69,7 +69,7 @@ impl Display for Opcode { } impl Opcode { - pub fn mnemonic(&self) -> &str { + pub const fn mnemonic(&self) -> &str { match self { Opcode::ADD => "add", Opcode::SUB => "sub", diff --git a/core/src/runtime/utils.rs b/core/src/runtime/utils.rs index 6f4feab738..009353abbb 100644 --- a/core/src/runtime/utils.rs +++ b/core/src/runtime/utils.rs @@ -3,7 +3,7 @@ use std::io::Write; use super::{Instruction, Runtime}; use crate::runtime::Register; -pub fn align(addr: u32) -> u32 { +pub const fn align(addr: u32) -> u32 { addr - addr % 4 } diff --git a/core/src/stark/chip.rs b/core/src/stark/chip.rs index 70264350cb..4a31646431 100644 --- a/core/src/stark/chip.rs +++ b/core/src/stark/chip.rs @@ -127,12 +127,12 @@ where } #[inline] - pub fn quotient_width(&self) -> usize { + pub const fn quotient_width(&self) -> usize { 1 << self.log_quotient_degree } #[inline] - pub fn logup_batch_size(&self) -> usize { + pub const fn logup_batch_size(&self) -> usize { 1 << self.log_quotient_degree } } diff --git a/core/src/stark/machine.rs b/core/src/stark/machine.rs index 8616915586..1afff664db 100644 --- a/core/src/stark/machine.rs +++ b/core/src/stark/machine.rs @@ -55,7 +55,7 @@ pub struct StarkMachine { } impl StarkMachine { - pub fn new(config: SC, chips: Vec, A>>, num_pv_elts: usize) -> Self { + pub const fn new(config: SC, chips: Vec, A>>, num_pv_elts: usize) -> Self { Self { config, chips, @@ -111,7 +111,7 @@ impl>> StarkMachine { &self.chips } - pub fn num_pv_elts(&self) -> usize { + pub const fn num_pv_elts(&self) -> usize { self.num_pv_elts } diff --git a/core/src/stark/types.rs b/core/src/stark/types.rs index d11e462b64..67f07cc032 100644 --- a/core/src/stark/types.rs +++ b/core/src/stark/types.rs @@ -30,7 +30,7 @@ pub struct ShardMainData { } impl ShardMainData { - pub fn new( + pub const fn new( traces: Vec>>, main_commit: Com, main_data: PcsProverData, @@ -64,7 +64,7 @@ impl ShardMainData { Ok(ShardMainDataWrapper::TempFile(file, bytes_written)) } - pub fn to_in_memory(self) -> ShardMainDataWrapper { + pub const fn to_in_memory(self) -> ShardMainDataWrapper { ShardMainDataWrapper::InMemory(self) } } diff --git a/core/src/syscall/commit.rs b/core/src/syscall/commit.rs index 66fd251c34..7c8fcabc15 100644 --- a/core/src/syscall/commit.rs +++ b/core/src/syscall/commit.rs @@ -4,7 +4,7 @@ use crate::runtime::{Syscall, SyscallContext}; pub struct SyscallCommit; impl SyscallCommit { - pub fn new() -> Self { + pub const fn new() -> Self { Self } } @@ -29,7 +29,7 @@ impl Syscall for SyscallCommit { pub struct SyscallCommitDeferred; impl SyscallCommitDeferred { - pub fn new() -> Self { + pub const fn new() -> Self { Self } } diff --git a/core/src/syscall/halt.rs b/core/src/syscall/halt.rs index 9572beecb8..8da62614db 100644 --- a/core/src/syscall/halt.rs +++ b/core/src/syscall/halt.rs @@ -3,7 +3,7 @@ use crate::runtime::{Syscall, SyscallContext}; pub struct SyscallHalt; impl SyscallHalt { - pub fn new() -> Self { + pub const fn new() -> Self { Self } } diff --git a/core/src/syscall/hint.rs b/core/src/syscall/hint.rs index e79fedfec1..c6eb31ef9b 100644 --- a/core/src/syscall/hint.rs +++ b/core/src/syscall/hint.rs @@ -4,7 +4,7 @@ pub struct SyscallHintLen; /// SyscallHintLen returns the length of the next slice in the hint input stream. impl SyscallHintLen { - pub fn new() -> Self { + pub const fn new() -> Self { Self } } @@ -22,7 +22,7 @@ pub struct SyscallHintRead; /// SyscallHintRead returns the length of the next slice in the hint input stream. impl SyscallHintRead { - pub fn new() -> Self { + pub const fn new() -> Self { Self } } diff --git a/core/src/syscall/precompiles/blake3/compress/mod.rs b/core/src/syscall/precompiles/blake3/compress/mod.rs index e8d800d0df..a89b9bcc34 100644 --- a/core/src/syscall/precompiles/blake3/compress/mod.rs +++ b/core/src/syscall/precompiles/blake3/compress/mod.rs @@ -72,7 +72,7 @@ pub(crate) const G_INDEX: [[usize; NUM_STATE_WORDS_PER_CALL]; OPERATION_COUNT] = [3, 4, 9, 14], ]; -pub(crate) fn g_func(input: [u32; 6]) -> [u32; 4] { +pub(crate) const fn g_func(input: [u32; 6]) -> [u32; 4] { let mut a = input[0]; let mut b = input[1]; let mut c = input[2]; @@ -105,7 +105,7 @@ pub struct Blake3CompressInnerEvent { pub struct Blake3CompressInnerChip {} impl Blake3CompressInnerChip { - pub fn new() -> Self { + pub const fn new() -> Self { Self {} } } diff --git a/core/src/syscall/precompiles/edwards/ed_add.rs b/core/src/syscall/precompiles/edwards/ed_add.rs index 4e215a0df0..f4e15423a7 100644 --- a/core/src/syscall/precompiles/edwards/ed_add.rs +++ b/core/src/syscall/precompiles/edwards/ed_add.rs @@ -74,7 +74,7 @@ pub struct EdAddAssignChip { } impl EdAddAssignChip { - pub fn new() -> Self { + pub const fn new() -> Self { Self { _marker: PhantomData, } diff --git a/core/src/syscall/precompiles/edwards/ed_decompress.rs b/core/src/syscall/precompiles/edwards/ed_decompress.rs index 3833e21e93..be62467c00 100644 --- a/core/src/syscall/precompiles/edwards/ed_decompress.rs +++ b/core/src/syscall/precompiles/edwards/ed_decompress.rs @@ -350,7 +350,7 @@ impl Syscall for EdDecompressChip { } impl EdDecompressChip { - pub fn new() -> Self { + pub const fn new() -> Self { Self { _phantom: PhantomData, } diff --git a/core/src/syscall/precompiles/keccak256/mod.rs b/core/src/syscall/precompiles/keccak256/mod.rs index 67f733bba0..f5091b8b4e 100644 --- a/core/src/syscall/precompiles/keccak256/mod.rs +++ b/core/src/syscall/precompiles/keccak256/mod.rs @@ -30,7 +30,7 @@ pub struct KeccakPermuteChip { } impl KeccakPermuteChip { - pub fn new() -> Self { + pub const fn new() -> Self { Self { p3_keccak: KeccakAir {}, } diff --git a/core/src/syscall/precompiles/sha256/compress/mod.rs b/core/src/syscall/precompiles/sha256/compress/mod.rs index 5d209b4a97..fd6c50f0fc 100644 --- a/core/src/syscall/precompiles/sha256/compress/mod.rs +++ b/core/src/syscall/precompiles/sha256/compress/mod.rs @@ -43,7 +43,7 @@ pub struct ShaCompressEvent { pub struct ShaCompressChip; impl ShaCompressChip { - pub fn new() -> Self { + pub const fn new() -> Self { Self {} } } diff --git a/core/src/syscall/precompiles/sha256/extend/mod.rs b/core/src/syscall/precompiles/sha256/extend/mod.rs index 873e3c2fa1..4caff508b9 100644 --- a/core/src/syscall/precompiles/sha256/extend/mod.rs +++ b/core/src/syscall/precompiles/sha256/extend/mod.rs @@ -31,7 +31,7 @@ pub struct ShaExtendEvent { pub struct ShaExtendChip; impl ShaExtendChip { - pub fn new() -> Self { + pub const fn new() -> Self { Self {} } } diff --git a/core/src/syscall/precompiles/uint256/air.rs b/core/src/syscall/precompiles/uint256/air.rs index 2117d75d40..498ac78c6c 100644 --- a/core/src/syscall/precompiles/uint256/air.rs +++ b/core/src/syscall/precompiles/uint256/air.rs @@ -50,7 +50,7 @@ pub struct Uint256MulEvent { pub struct Uint256MulChip; impl Uint256MulChip { - pub fn new() -> Self { + pub const fn new() -> Self { Self } } diff --git a/core/src/syscall/precompiles/weierstrass/weierstrass_add.rs b/core/src/syscall/precompiles/weierstrass/weierstrass_add.rs index 85a6e9d140..ac049a5be4 100644 --- a/core/src/syscall/precompiles/weierstrass/weierstrass_add.rs +++ b/core/src/syscall/precompiles/weierstrass/weierstrass_add.rs @@ -92,7 +92,7 @@ impl Syscall for WeierstrassAddAssignChip { } impl WeierstrassAddAssignChip { - pub fn new() -> Self { + pub const fn new() -> Self { Self { _marker: PhantomData, } diff --git a/core/src/syscall/precompiles/weierstrass/weierstrass_decompress.rs b/core/src/syscall/precompiles/weierstrass/weierstrass_decompress.rs index ec0f4cee54..ef610267f6 100644 --- a/core/src/syscall/precompiles/weierstrass/weierstrass_decompress.rs +++ b/core/src/syscall/precompiles/weierstrass/weierstrass_decompress.rs @@ -89,7 +89,7 @@ impl Syscall for WeierstrassDecompressChip { } impl WeierstrassDecompressChip { - pub fn new() -> Self { + pub const fn new() -> Self { Self { _marker: PhantomData::, } diff --git a/core/src/syscall/precompiles/weierstrass/weierstrass_double.rs b/core/src/syscall/precompiles/weierstrass/weierstrass_double.rs index d94e5366b1..241a9b6143 100644 --- a/core/src/syscall/precompiles/weierstrass/weierstrass_double.rs +++ b/core/src/syscall/precompiles/weierstrass/weierstrass_double.rs @@ -93,7 +93,7 @@ impl Syscall for WeierstrassDoubleAssi } impl WeierstrassDoubleAssignChip { - pub fn new() -> Self { + pub const fn new() -> Self { Self { _marker: PhantomData, } diff --git a/core/src/syscall/unconstrained.rs b/core/src/syscall/unconstrained.rs index e9025692bc..ab9456ce64 100644 --- a/core/src/syscall/unconstrained.rs +++ b/core/src/syscall/unconstrained.rs @@ -5,7 +5,7 @@ use crate::runtime::{ForkState, Syscall, SyscallContext}; pub struct SyscallEnterUnconstrained; impl SyscallEnterUnconstrained { - pub fn new() -> Self { + pub const fn new() -> Self { Self } } @@ -33,7 +33,7 @@ impl Syscall for SyscallEnterUnconstrained { pub struct SyscallExitUnconstrained; impl SyscallExitUnconstrained { - pub fn new() -> Self { + pub const fn new() -> Self { Self } } diff --git a/core/src/syscall/verify.rs b/core/src/syscall/verify.rs index 26e0e393f8..e40639aeba 100644 --- a/core/src/syscall/verify.rs +++ b/core/src/syscall/verify.rs @@ -10,7 +10,7 @@ use crate::{ pub struct SyscallVerifySP1Proof; impl SyscallVerifySP1Proof { - pub fn new() -> Self { + pub const fn new() -> Self { Self } } diff --git a/core/src/syscall/write.rs b/core/src/syscall/write.rs index 3c68ea7fc6..2953cd33bd 100644 --- a/core/src/syscall/write.rs +++ b/core/src/syscall/write.rs @@ -6,7 +6,7 @@ use crate::{ pub struct SyscallWrite; impl SyscallWrite { - pub fn new() -> Self { + pub const fn new() -> Self { Self } } diff --git a/core/src/utils/buffer.rs b/core/src/utils/buffer.rs index c4a2a926bb..3c15899c3a 100644 --- a/core/src/utils/buffer.rs +++ b/core/src/utils/buffer.rs @@ -9,7 +9,7 @@ pub struct Buffer { } impl Buffer { - pub fn new() -> Self { + pub const fn new() -> Self { Self { data: Vec::new(), ptr: 0, diff --git a/core/src/utils/ec/mod.rs b/core/src/utils/ec/mod.rs index 6ec4ad0327..1d96f58c3c 100644 --- a/core/src/utils/ec/mod.rs +++ b/core/src/utils/ec/mod.rs @@ -50,7 +50,7 @@ pub struct AffinePoint { impl AffinePoint { #[allow(dead_code)] - pub fn new(x: BigUint, y: BigUint) -> Self { + pub const fn new(x: BigUint, y: BigUint) -> Self { Self { x, y, diff --git a/examples/Cargo.lock b/examples/Cargo.lock index 2eecb2005b..b5faaa8719 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -646,12 +646,6 @@ dependencies = [ "rand", ] -[[package]] -name = "array-macro" -version = "2.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "220a2c618ab466efe41d0eace94dfeff1c35e3aa47891bdb95e1c0fefffd3c99" - [[package]] name = "arrayref" version = "0.3.7" @@ -914,11 +908,6 @@ dependencies = [ "rayon", ] -[[package]] -name = "blake3-zkvm" -version = "0.1.0" -source = "git+https://github.com/sp1-patches/BLAKE3.git?branch=patch-blake3_zkvm/v.1.0.0#bac2d59f9122b07a4d91475560b4c3214ae62444" - [[package]] name = "block-buffer" version = "0.9.0" @@ -1214,28 +1203,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crossbeam" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-epoch", - "crossbeam-queue", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "crossbeam-deque" version = "0.8.5" @@ -1255,15 +1222,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "crossbeam-queue" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "crossbeam-utils" version = "0.8.19" @@ -1501,12 +1459,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "dotenv" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" - [[package]] name = "downcast-rs" version = "1.2.1" @@ -3722,7 +3674,6 @@ dependencies = [ "base64 0.22.1", "bytes", "encoding_rs", - "futures-channel", "futures-core", "futures-util", "h2 0.4.4", @@ -4398,7 +4349,6 @@ dependencies = [ "arrayref", "bincode", "blake3", - "blake3-zkvm", "cfg-if", "curve25519-dalek", "elf", @@ -4433,7 +4383,6 @@ dependencies = [ "rrs-lib", "serde", "serde_with", - "serial_test", "size", "snowbridge-amcl", "sp1-derive", @@ -4516,7 +4465,6 @@ dependencies = [ "thiserror", "tokio", "tracing", - "tracing-appender", "tracing-subscriber", ] @@ -4559,8 +4507,6 @@ dependencies = [ "p3-symmetric", "p3-util", "serde", - "serde_json", - "serial_test", "sp1-core", "sp1-recursion-core", "sp1-recursion-derive", @@ -4615,17 +4561,14 @@ dependencies = [ "bindgen", "cc", "cfg-if", - "crossbeam", "log", "num-bigint 0.4.5", "p3-baby-bear", "p3-field", "rand", - "reqwest 0.12.4", "serde", "serde_json", "sp1-recursion-compiler", - "subtle-encoding", "tempfile", ] @@ -4633,7 +4576,6 @@ dependencies = [ name = "sp1-recursion-program" version = "0.1.0" dependencies = [ - "array-macro", "itertools 0.12.1", "p3-air", "p3-baby-bear", @@ -4665,8 +4607,8 @@ dependencies = [ "async-trait", "axum", "bincode", + "cfg-if", "dirs", - "dotenv", "futures", "hex", "indicatif", @@ -4676,7 +4618,6 @@ dependencies = [ "p3-field", "p3-matrix", "prost", - "prost-types", "reqwest 0.12.4", "reqwest-middleware", "serde", @@ -5193,18 +5134,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-appender" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" -dependencies = [ - "crossbeam-channel", - "thiserror", - "time", - "tracing-subscriber", -] - [[package]] name = "tracing-attributes" version = "0.1.27" diff --git a/examples/aggregation/programs/aggregation/Cargo.lock b/examples/aggregation/programs/aggregation/Cargo.lock index 9b3f983126..d05c04f332 100644 --- a/examples/aggregation/programs/aggregation/Cargo.lock +++ b/examples/aggregation/programs/aggregation/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.82" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "arrayvec" @@ -346,9 +346,9 @@ checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "num" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135b08af27d103b0a51f2ae0f8632117b7b185ccf931445affa8df530576a41" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ "num-bigint", "num-complex", @@ -360,20 +360,19 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" dependencies = [ - "autocfg", "num-integer", "num-traits", ] [[package]] name = "num-complex" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", ] @@ -389,9 +388,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -400,11 +399,10 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", "num-bigint", "num-integer", "num-traits", @@ -412,9 +410,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -697,18 +695,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.200" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc6f9cc94d67c0e21aaf7eda3a010fd3af78ebf6e096aa6e2e13c79749cce4f" +checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.200" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "856f046b9400cee3c8c94ed572ecdb752444c24528c035cd35882aad6f492bcb" +checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" dependencies = [ "proc-macro2", "quote", @@ -748,7 +746,6 @@ dependencies = [ [[package]] name = "sp1-precompiles" version = "0.1.0" -source = "git+https://github.com/succinctlabs/sp1.git?rev=v1.0.0-testnet#e721b246243e40376f7b75d7330e53c7351b727f" dependencies = [ "anyhow", "bincode", @@ -765,7 +762,6 @@ dependencies = [ [[package]] name = "sp1-primitives" version = "0.1.0" -source = "git+https://github.com/succinctlabs/sp1.git?rev=v1.0.0-testnet#e721b246243e40376f7b75d7330e53c7351b727f" dependencies = [ "itertools", "lazy_static", @@ -778,7 +774,6 @@ dependencies = [ [[package]] name = "sp1-zkvm" version = "0.1.0" -source = "git+https://github.com/succinctlabs/sp1.git?rev=v1.0.0-testnet#e721b246243e40376f7b75d7330e53c7351b727f" dependencies = [ "bincode", "cfg-if", diff --git a/examples/aggregation/programs/aggregation/Cargo.toml b/examples/aggregation/programs/aggregation/Cargo.toml index 78b81178f4..d3897f5ff5 100644 --- a/examples/aggregation/programs/aggregation/Cargo.toml +++ b/examples/aggregation/programs/aggregation/Cargo.toml @@ -7,9 +7,7 @@ edition = "2021" [dependencies] hex = "0.4.3" sha2 = "0.10.8" -sp1-zkvm = { git = "https://github.com/succinctlabs/sp1.git", features = [ - "verify", -], rev = "v1.0.0-testnet" } +sp1-zkvm = { path = "../../../../zkvm/entrypoint", features = ["verify"] } [patch.crates-io] sha2-v0-10-8 = { git = "https://github.com/sp1-patches/RustCrypto-hashes.git", package = "sha2", branch = "patch-v0.10.8" } diff --git a/examples/aggregation/programs/aggregation/elf/riscv32im-succinct-zkvm-elf b/examples/aggregation/programs/aggregation/elf/riscv32im-succinct-zkvm-elf index 3bc26ea23d1e92445925aa3f628c58278aa84536..6bf5282ac295a5895ad675e06dcea2b738e25bc5 100755 GIT binary patch delta 31726 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 delta 31786 zcmbt+3w#ts@_+Xvy9psc9uOd4*d!1_fUxfeA_hzl5iuYlB0}~_P?P`x0nv>@c!>%O z*r

L1T;<3?8VQ1|=TnaVIJ&DxRpQ=ph$8^!Rz4`~TMLOm?$G;6DH1Gt7Les;jH3 ztE;q4!a)gu+|_QE?$>&f4?(B8KX0v;YeYO<5D@4v&t#i%9#(`wC>MCBCL21uEmb9ga$6dZu8gPa_i=HEvG1xFlh<~do?Vx&Yhsqw zb&{i7HcQu4C(F7bmab1?!a!0@FUl#MKTN1lN<1K+?3^VvCCkZO@}#DFWNViZVNQ`O zFX=K)DjFd-bnPk+JCrC_CH3!F7g3qQ(wBEoRTe!YHznOGHBFX_I*v#vQ#3D;S9UZ@ zO#|h<9k0KvF8#47EK*iA2W^Krcggw5Pf1mS;4vFGuTz<;`-@W_owOpt@q^KDOsaRbh&+Z!V&lJ+#Fn`wQM(P0`9Mk^K2Sc{ zB`fW%bd{M9zFw6opGe6|DoG%<=?TjdSLCwQ{ecRqm&&Qxmra=8L#?AH>VS@-gs@C=X1czHFE#9A>6~-bTi=9v z{@&#Mw!EcZhj~BumaDRJl5WgW)n+x;XCI5}?V#?|&(EcXv_^vx0ZV7gYx-psymdeg zh=bv4+(!<7HjC?5QYSC}IpodIF~aG(5{ul@Z*bgG&2_RN@5R)*-JmYrUj2giAzk0N zl5Ta4$MO<5uai&of0w@?@5#SEso6l5r7v$b$;AVPOC<&JvH{aCYsh^{*N|JIYw)J& z)iKs=4h!mrtuN@#8yb5Q?2ha9f_J@6Pu8dFTKQMV#|IarRgWNXd3i~(Qfx&@iEJqB zrK^(@t6yj=D*TNn>4t|DRu{>mjn@unKuuy_Z#7@ z+%JV&sB4h-8i()(`J~Z{|4U6nc%xip>K2!{@egv@px(-}yr9`B&mCNxiwYn>0nlTO#u9c~WS)_jwE+?AU;g%BEkt3qAT>}%{X zbVUN+E!T|bg#vp=45SVi@k?g)tn}*Y-RQK1>H7OHykU!yE~@6U2uQQl@k}W6sw1*t zifPjC+ji~m+6J2x+sKx}DBB9cwx;X$HU4`}kW0-E%M0gG*BqKRE^Yo=YQMa^dXwUZ z6(vu~#>#u86206|nIV-tEgz`77NT9}uYm71&tIO9VS7&2H8HeU$}QNb26XeYvh$vC zoqv7~8Hy_ktABn@-f)ivGm4(a<>u`}Hs2}b=I@L5R_Qv+aN*POFW1S(@40-y^Xc8X zF>h~OSGjtB*rEDrOpPPr!$IBDFPtTG& ly)2GOmESu>(!C(>zxQuab)CE+XfCX_ z9E0vd3EtX0e*WdTS0GNxIShl^+o2l0;YO70L z#dIejP9(&ML}id&w#n!2`$tbm7ePZ26EzeGMX!6abS$o$b!}~RV!M{{JO%JRQ-(N)2c$L zKh~exvlMn5Jv~KuNFpVJz#akIBXj8JX3`)2p$NRouY7r!3g2t!%?k zNq0itydh7j{y}beyhQG>aeT(x9n!n?V;220EG|#ac9TiV^vb zc;xRA=EcUdo8IR%KOTGxK{r@F`B-7FI!8(6rR2hw3szYX)Dgd%13QOP~LQ{f*?QOkekDW5O>=$jQyArgX)-$Z;(1lEA6ly_Zit=)!p43b(a=z*RdwIa^Q-!6 zt6=g=RMpg%&aY~JYgOA`I=`wvMl>|4RTawLHcpjvbJ4&;dG4;!;oAio#q%;z8tY%) zf>=b?as>a&au8v2E zmN#y_)&`QUdf9nV5~knR8YRHUy46Ud>L$Eu3dQ4$D#jed)9aSYo0`^jSIWJ-d^gdS zSFfTg7A0%sqJ8rd=w4s)puBfqwsOC`vzB#S*sc%N;%ig@Bm3}sgZg?v~-|$vM ze(zf&rRL4+_rD~~7md62cjo$%p4gT5ln*pxdDEk@`0Y27qz^mFiSOk|%^e#Dy@xrg zU$VU9{T#`bEZ4k0O}a68{RhJ{niFU;=^m$S|2Hblz#6b|;s@_w>)cZ|e4HtjJTDLX z7^9@FvFu}HTTrc^jFT`1mwkeTzz%uWC$~wu7iGhz_e;$U*ih%lZ-2TZ>+PNCn8{|d zDm+19;gxs(PUdjJCy6T?uef@xJnPGA=srCG z_j|v@7Jt9o^5u`@T6s;$TKV`_e+@^)sI~H*udh+))u1OHS44*$UoPqYEbl+QSknDj zF8bz9Y1Dgi!#DOU-2quwF*u#}2uzuqQ0#ZUaDmlI}Q0Q&MYDaQVK^-1r9R1cK>EhtDX`TDUD_a(Yql=g8zZ;j) ztj81-pRO~KACuHV@p8(E^^&fGyzRsesU)#+;`bvlDiRwv{UeEI**Zcp#rud(TDpA| zkK29?U;0cl3wP`Mj&jpUq>*Q2=Z`tkjUDBwKMu{<-jO!`-{A=dYEPgl5cVDA`X9%U z#JL~uq#&Ag3X6u0^5#|8w{c6=cqUQk} zdtQZUu-WK!Ih|IE+Y|_Rop$38zr$?un62V3iM&@ ziu_w>F5k0p4$tNF8#nUnJDg0(W?jJg&&D5lcj;soq31kDI@?7Q;L7)i>o|8vmuQVq;`s@%BQ2Yii(4h$>(a|*bzb0~J2SATaPGWaO7Wc%AN4;J7lt^V z*qyPP(z96rjmyN@8K;896>;363*XL<<5#P<`{H=_xY~XO@tVYk{V#PD#dE#x$*$SV zC$5XQvH$Dt=6X6pD|ou+1FvzgG8 zg)>FW(ecs3rpE)%((^rpK9RqAiEW^0)NSgCXcRvt^2@u$XJ)fb zs3jHG99%89axp%Qr;E}K{7AnZy|P&%=muP=vkGxV1DFw4dN_aQ>`MPo@kJWX6f=^z zDQP0;<3JyqDV|E=tCPk;A06?%g}ozMF}k;y+mYL)WxYjRM?SpM-rm{F2EL+CywH*N z5S@~FFDd>qQIO2nOZAtD*OR$D>Bwc-tUu&{e@o`Wr5;&gcqd*UP0kXxb>e1eQ`YV+ zo%kbC@GL648tvPamCc%Q9>)1K&YyAW`((2;oHv2r3)eiHMx0mRyc*|3oMkxY;9QDx z9nNQQHsWMx*z36d3FrGbKgW3nCo^QTWSlABXBo0{*&qNX&Z}`w!Rg0Yf%6`mD{($( z5Fe%RQBrbFxMj|qaLa&|mMzQ)w`@<2cqf%-O2=}G(J47EH|6k;R%YN z4mfLb#TK|tXDSmt*F?uRS&u)(va(m&4-aL=6O_W^7CV(>dDk&)z{HEXsPX~35!=5|AsZ{~^j zyYZ2_lMu0lJJFQEhe-MTg(rjGFCFPGzRlp1lC1gJ%Bbs+FGh9ebEVpR@oINoD1DT_ z`-kp)2Txm8fQ~_(HZ+XV!?FTV*OM2T-v>Pn7;lEyN!-&xR~~g8YG5pJV3?OUP$XsY z%*Tjnufa?Ve< z(hzp2az7bGj)4~>SxsT1$C$(<1J4;;4ouFq;-tn;oqspeXdYl}|5#xm0t<3dIMIAy z;Qi9R0PY7Km8Agu!n8Xnn?Iww@xYJ2g~)4kkaq{+JUKiRB9GHSv?82GV`vjWI|y2D zT8%+hCrlKY;uA5yI0S{jqF> zSl*xKWh@*SYPHA!KDLf*)=2RtWC~7zmkb&mWLX(_$D-tWfL00G;gOD8;*g$67*=-oB^#0G-@IpB$tTY2FXz;(?PV}pw)mD z-Qh;i*2a`A25r*~p^R2RQao8z81C^b(zg&KHZc@3;6ew9tpP20qR1=YS-P@Gp-_`> zJ9vLlQNZJ+mdRoP=)s1YLm{V9B5YR*3_1)NMLHd%yDw;GK#OjZ6SQ-nMcY3X;AE5> z^-Y;tR;fen8`857^sZAvQgn!J0&VIo6rvf~RPP?(gSUi2q=ybFcTlA%P46zM2J-l! z#ZyC}N)mv6t^cTR6Y-j7Gk8TRPwRIBa9{A6ri#}G@*I7`v{2|66I)C?Bc~knis_-y zShb9%kLq3qUd?ooHHc?P#bsjnAcT6nTTH>VV86SqFIphG3$(tZ2ZsS?Jo4jyx7ad> z=VUQ2`U5oBY}D$Yb{0csn^*jO5YL!W0~sy0h*tsLCeUaoqntsD!3@r!YTdDh_kK-)e&0iH36M)K!CbAlEQHBmp9CuTMP=ab&i;jup6g2HM0$t$Gsqeql24?xMlO6Q$(4X%J_KL#RMH7zR0$F~P4{5(@1_>Db7t z1aHtiqO+N26imIRZNqB78w(oMN(Xh)F3=|4BgR2KljK(tLz=7%8{!`a|KL61UgA%@ zHx#NNesSlu9KB5Zt_aVg_lh0hd&+{L(B>$<;!N<5gRVK4>YfbRVbGK*4p}04;-xYR z!5?;i#Lm8;tpTn0evxP4c~a#vG0uV&X5|WTuLVKavO;VDz2L~|P>9OYLDwSefewRa zAOa2wl!>4nTP;pmkQsYCAd;-SK-YH-bs8;A#8@kwK5LDbWaU}ri4TTClc`|T=q9~q zp<^w0R^s6pgfkf{(uN1cGge-hv3Xr6M0L?&z*!1j%{uXe6|=NaZfoO8@CJdV$&>!g zppjg3KQ(~n1Z^Vt(Sz&&=#`)^3DcFCpZet(=tn?b*p_}RJ4=c-s8g1j_NYJ#9!*$5 zFQ;j`xO0V;y7NI_CL)bBfISSfZ9;rx<2jScA4O28qfRTc5d4_8{;kV8t5XcY)(mMBs9)SId(OY#3Zada|Zspd=gEWL3`(z(>;!>U* z+%Oc_pyD+iEL@`aLw#^dYJ`6rcoVQzet{ng4q&TV{si!{ZV`j02H+_0%83ri9@c_uZQ^hk^@T}B9pr@Uu`R?0r18;;ni6#Z~XT>&m4RZ;dnxSPd|#H|GHPNNSAlT%eY+k4P>!IRb>B+ zo0GsPDn3IPO+sE%_*wAYf1+H}g7`R)ZD4ybM93vwMfR0^NN_U5v?HFK4lM+B;OVW_ zzNdk=O$k38;Y`PV0$wt}pbRDn6dzRZ(~*@G&UJCxcPJ2H?af{u{vBBW&V- z53C(z@QK?I0-AgfEgpR*vb8Z1tTn)u5YRmGC2%~RCo2X)K6f@_%9Cp{0N4*4UA{v{ ztvZxLg#%)+BMJvepag`oc7s}qv+*S0h~Qg+yTSm3w9?|+XJJ8rnCMGb(zE_|;O3TW zMhgVO4@Ol$`d87#b-5zz}^ZxbAWu2%KsdAE%fySCJ&thUZUv-zG4nz&jAla{ffZ7ARLYocmsGW zp3iG8XLB*{fKL^W!V$pABYqW^P!?4WYOyB<2V?MN4WoXgk6zITD*h-2|0@QkbkeE| zmmeI1$Hd?nF?gAZseZ+PtuX?x$KcOmFfClQgIe6JvxdU@E+_0&V+2X-50#7+;c;aV z@&|Qc?R+fGZ^;g_l^{^iI2WMLqg?(qu=eVNT>eT-1z!N~xyHa!C`J%PLy`Cnj4`kl zWG=#w0GHv_iPD9jGyxYy;U9oYy9XlzT_LHxgQ1{Io`d^8wExF11v@OlI5p}OcDVC`iOdEgEd z&<---T^M+L5)1^94D1aT*WMJF@n-@roE*V&O!>Rv;o#_-4RAwP!HXbls=yLJ9d^_2 zLS~z5V6+^i3Z`LzSK;l_KvYNuJqdggm>fg+OJFB3WoW`Vi(o($_5vpZ(?R@gi!lC( zP@odNfq?S*O2v7L8G9c5;VOP5rUjqJU}YkOEFI*b{%Pm}lt;c%y5tGyn>Eh>UbsQY zcO(8QK%fOGweZZ{j3xApw8*{$i6sgz1U?gmUjn*dyR;+*m&f1-V(^X_{9aoe44r992z94-P3l1g4UNIK#^A*F}NfKdtz`f2G_*kz0o*`79NQv0H2A$DHxvGK^_?tgGa|;Ukt8_ z!JDJ7GXL+1B2Wc~V{l6hPNry650cN1!NoDSECw%$;Gi;2H$?~v-W7un#o&`MIJKu{ zPPohLG5E$9yr30h{8J0ow-Um5M+`m~gMWy@iS*7(JxE_(3@(nr9t}HDhzi`R5mdZ6 z2LCYzen}NWB)9$-;CkzG2ud+;r(F*3o5=*hiO-#c8^X6WL>Nc~^`divl-@ zIfVWuwh}54`)~=~(+7(lDd_)JU`7-+|99H86TxNjPyS{9GNuX5hoi zBl07mPdg}>rvcLsGQ&Qy#4EfW4;fS$&blwh`djN%NylaZ6Q4Xp6>b$@mhyK;{gL$G zvkWcZP5>W(-CEzI=RqEPtuKZHCjx8ynZTp7#4qFdnBWH7Z#HDJZ78Dnpg&_p*%AB% za6NR>z$X3yVC|a{!v6y90o|%oSynzaUBFtWUIR>@l+cQVL6c`3D<$DyZ@z(;=w<+3aTL4VosAy}Ot-$oX3hg#Y-$7vd zc7@jIoME5)ZxHB17EK@rt1kMeB`hGZ>wqT$YZWd8rjK1TgPsPa4_`Ec{{~DS!O*&# zD*QiS`XGj8FT#B>Ea~GIMPCqv>p`F|Wi*Qy1Jf5X9n=Ebf$8fRjeiK3zNFFce}L($ z8k&u$g1kW(Zorzs9>tRY;F)^0f~g=p5~Xm^W0+syQY8jZ!5zS*8x6{rcI2^ZHe-bkeiya; zYT#%We;$Kx6k8|pA=z`#vuCm+(+^6sBTySYIG*yIp2V+A{T^b+A*N-lbTQ&4%**q{ z99)8Lti)rEC|mAYi#!cXIfrbk1zrhkRk8Jna3xyzKd_}OJ{^OnJ=vE3-VoJ3T#(1p zLO-@8ggOY*WF8#V&xllpuhO(}Qwp39oPu&RPVNRS15Q-&Gr;9h{P%!sbHp!``IO)} z+$V#l<=y_6)wD0(NY@15h2Uf4D7xe!sSGB+gaMCbf1eT&;R!!JoK&65m zz%8gy3!u}$$AGnfNq(wr`C2qUJMfF8aZ|V_I29A>nkOQU!k?oFcS{66@hB#~&5@n{ z{x&*JhmHX+Yn^c8*{#)Bv}jn0XS-HlvdUFE1Wx%kFnwu82b?s4xe#d+LBNEsG-?U( zCg2nm|B6Offek9Y;%W3SuwBJgGj7y_Rsf~qzFV-cd{}I~g-_22fx92lT09h3@WQ39 z$e4;X(~Y>V-)d04*rLZaJH+^@SThYlOb_ZC2`SP|V&Q|cDc}zSpL&VHpc=R|3X|N# zrwnw#!C3?N4KN{9K@$56_#p6P758`mdE`lh^061fWF(uh23@i>5(eAhfjYQUq5@d5 zWNt$YLjfHWXNOg+v=LY@Ot(J1`IEs@ z2ud;^Rw_ZacwJabDFp4`BOo?t%>|x=pxw0Hz)(z){|31HX=E{UC`Ek_WGSjv%N%Qv zDe|8|>r}pVEAlkT=ZDKXSS<)EVZbp};b*`#Q3_7OZtb8B?}SKLGezW0=R>pKScW0_ zY^1V2aAkeeYR@h1o6fH{-Gd@2{UWm`soPU)P_-hvfxidE;z6O6|9gU$@jiK-90)~x zN2-J-Jn96V7=^vSOY+31GA#NY!oBu+DtZ4EVC^$j!pDJ?&sLQxB-X_VH$#`!TYo5r zTk0a+P=s-_7cJWld2;K|E3pPc6Gl;abc1sh$^)yzCdlpvVMBz#UI*TTe$%3atwt09 z(?JSG0<$RjTejonMe9J;u@`{JN24J|2AqBd7zUA#2=9LuGX~0s^?N0jPz#Rc9aJy| zm@4cHGF7++xC!`575@#m5(@gLIQ2Pfw}3BG@kC(l17RvZRGfD6EA^A$xC2v!-NOrl zn{a<9s^6BOO^4t_15}WWUt)&c7KN|Eth67P5-9PT>JUmWSu;_39z#{rhmm(Z@MGZT zt0t`jJ{oCa8v6i*H$hN(5jJ86?BVa~{{_1Y{l(i}zBriW!qyfdNIr-yiT$Y>LG&Vq zKZZBi@Hg08ULUck^Z}%Y{+eGUwjQ_={7tIOR*X+8ur^-z0`J-x(RUpdYF&33ls6>M zKY>*tfi8KumB9WAye1;RI6AiL3kFuC8Z;g_K1zO3Jq9ogx=MAzH6qoIG4TI*L@%}d~>du@DH&L(%dQb(d7|w z8kg*EUO?)5Et1ZD8ID5gK|aKqt(*sgMhv0R(3J=lHFpYdDX?b#GGOidcH;kp9;|;o zGRI$uY7YG|f*%E5`G$e*g+2<&j2+m3LLVJ8@@`Ub?=VhdJ5YgkkX?Tf<7c8ba>X26 z^vjDdW9N%UX7ZuI2Hf8cRRbYTrhEpxDaus+2#m-m3^6uwpMfqoI5UA?3w}=pNo*>x zc2LcWV(=qvvAF&=e&2{qus?o4HakE{(4J3#&uEnbFM1IRH{kGuE3uvpjC};$OOea3N&~^+4Z4<((!AS38lgF@khv-#j32VaY2q92Rm*MR>%_-UY1`CE5mXaZBEWK<2X_A?B^ zU#pmh`40A%wpN8s0BgU^&pwI7ZUe->~u3|1l?SO9BB zJc~OW+9gaCe8`CRKzBlpCQd4M4!9UtHB>1w>zF|;%Gtg>XgC^X1%*PRzt~#AA2xlA zh$68X*iYn{h@i5suoi?K!U?Y+!l0H8>da!{o`cQlXppNwR@@5mYT$|}d=Pjo@G`a7 zuvamo4bEmCLoKP<3atGshOql;r3U3cN+S2h;K$oy(Pb{u`yOGM%ZFrGMkC(vOBy=J z6Spc@ESQUMS%LdxV58B5VQHeqcm+ z8nE^QBf_hIwI3Q0-UY1vz=-e{z++%gCp1xcEcwGu%xm8olw3pMR`n8Ne}qAbe-RgN z0`CPzbSiNZkA(PU6dncqRuolbr2lKg-P; z25y9aX24$H-N13G0lxvi9K|of4E<^pz8|Pt?{3NmaK-jMm z2q%pNM?I8@yn(U1qFy?8g2y(%g_=Rv125D180E)dKyQk|Z$ZEI`z_MnKcc@ET75cH z3_?8$B%)I4qdS3jnZz#(_!!eB+$%ryQh8I6M7o|aF#3#>-1%linWF0pG3PGq(#|O= zB1yLYb(rnVkvN_J+|?}pa2J*%_uyXp?HEkJiN_6EiT>Y7X@gI@-`1bDxSp9U_nWV1KJ@}`h zeHMfD6WUf_iosK3@QN7xQVjk)8q@3f#2eaHV2Q!gV(_XMyekHO5rdN^w$*Qo!piIU zvM2(D+XFH94>9=57@T}#+X@^p*b{>vjNl9+Scp~s1RlW##Z4`eD@DWpZsSABUb_)n6 zKuA^#+yQJvffN;20~Y~zRq^A%n}ClacacH6fTtP_Yzc-N;WvT1t~4l#hHwbD{9A+a zw1x1kH({AP&%lrZA)n6KdJxJhQGu#pv*7o@F(YnaY%88vfQko>I<^D&NI!#;kVwz? zTaj;@49uX~HDEdh`MVLjp8-yOA>yb}W!S77f}_=HJ_H_%6`Izrp>8D1H<2X5`hsjT z2*$Ts32c-HJ@WzPK+JJuz+vFzCfh~hU_@;}q7eHA1lR^1xnec#FSORBOh!vF)T)rSpe1kS$-9#C7O3ClTn2)gKz{2Gy_fnpZiC6UqSqV_hOnpWndfB3T6VYJRYg= zAn@T&BT*g#K6n5gRl95?>KVNnF`(jmfel|Fec-AX@Fi}d`*1{6+dkY1JP4!0s>=TW z>_e1mEy}qM9)N*s)GnC@T-;(%o>))=9tVydwr5Em4GtPqg*V=hQE)f&dIfcqi_ zQov6|449XpkJTrelqVJe4|~?Y%GC0C)fg3Z23D*Z@bVfMi2M{DX4siNi2Sw6z^YXF z{lG_88G;P4qj+Geakj( zo@WuYwc#m*_~JRW57qMLfTO!`T3y>N>{cIsFrhW*HQ=h?F9;gd;>;J@X0}&>qchvO zos3OJRBIksy9*T}ig&3k{O`*M!V_qKs?YxixEw)TqZ-I|Be8uFDWA6oe-8QtqLzO9 zMlBjGvX}B@L36<6cl&(~lhf>QdK})t-Wl@?jjV92`_9>S7W$obzdvAf`b+_{$zk`q zEGCc7=y$p-PN&`EbQGFwmo92*M>N>JT1Pvg?Mpf@S<=;>WcT)4WfY~~a>p>2-|IKJ zEjF9QW%1eqj*|9Nw6DP`PJhD(iHbU|7t^cx%}%?+?C?3Qev=ihHoLr+s!Oy~^ByzX z?WR_TI;~!>-R}4J++MfUXY(747OU54MK^hE9*5miXtHRQUrbcYS^BE~-qt$5hdF}py)9iG5ZDPU--rwi82K)}A+vf{--9Cpk z(prz(mu^n$Ah?k3pyD(d1!Ot3KpD6fDx#DiFH?!u@q5t{ zrq-+wEgEdU6Dc%FJ+=DM3^I||smLWYI~*$TWl$;8ngyawYu_@hlP@{UqHS8(zO|89ganaV%5Gy)4*3?2JK$KXDl|5h75#^y62Z^m~_|-wb z#clQ2k;v?5oXHi4w9f4cSOb=T&E>TF+)jG{-gVgQMt8vLclzx1!q)IKT}-ky!p@fr z#wd-9t@CALMO(-C#YI~OcdTgeyk?nN12hFhSiD1YxEg?7JI;IEV)1d$HUy^bNP*SyUA`hyYQzE(Z{VpU^Kd|Zokpu zvzYLo-{!PCy>^Sqh9MTftZIuakS;1IPCv{q+l~MB^AwlM81UI0Mu*E~a|N6Z(Y%h& zGr?Ym)9roVmb1ukgHLGuQLd)PT|KH2GkR$89oUFqeqg z>$ywB$viFS3b+GKcfjm*B8+_=Q)|QQCZEY2aNAv8Hx>fcfZ679S$tLxmUCX8-R6l* zmKT+54TAF}r^G024TAGUVnN1k->XW$;gO2Uo;q_wRNDMFB&5mj`0ihZB(THzEnSlB4%Y3 zmg$(17ESl~-E#}Ae!tUXw%hC;i^J$Ndc=&4c!uq^+bwpp)o8(D%xm^|l#;D|=Qb(R z1~Q?;=0PC%;Z?sY;B~nDHiy}-tnb6o==aXPqXK_eZ(d=$8pDILVs5OMDW+zN+QG4M z5iv3T5#GIhvuzhGthCO~JTvd~&i45WY1BGxKKcu%0jtgAQ`oKZuFqu-I9!1zt{>}Q|$#r!;-BYy{KgCV7QQEP^sR+?wo(ebkEEgGw-Y{v^x>S zMw7*AG21Lgdm!8vEaAsJD#iFb9i zXQ9cYl!F8PGyHQ411@A*zt4+(huI2`hMg$fkMiETJ3PwcNtuJ!l0yH7pA zTZUnS=XVC&M(q3pR-fB#7cc&U_w4PQ>v#L6FYtR!j&i>l+0$*aI^0IH-EVh@+|PJn zipy^HdfeFaA$n~tqg}W^<9k#59-Gx}!R`}VKqH2m7R=5u~SiqGM|y3=R# z8m&${o{NM%;kLp<4!7CkviXc=uSq=q1;1(_;>qrHc|8HQ#pn;%?Io&mtSRu%f+qqN zqt#-?a|XLeIL4=^IL#KX)nxJbOn!?KZVW5;IB7a@n_W)yiP_{6r~l2b7-+SdZ4Qq) zVDn*D?shsgO*XFyiv~Ok zaae73TexzY4XsDyyBuDZ)#<;Wnpt0Qdl!er7BE|}ytdli9;;ods z+3z=bU=lp#_Y3hYU)#lI_S2IDzZ(%?ce};Tukh*Ip5u7%;B>nzcy3?|c&sj~)$10g zxzv64sIU1L4xZO%vAVEGz$OO&3CDMQtk|6;S-RjkPQd7}`oOh214gyfH@piM;uKF4 z8^7b_DNdW;YxerQcwmF@^ZP`n6TCFV?)ExNcE8E#3Scwkbc;Jq@F@fRP6uMa9pZ)_Q^Qa>YNm2RXvxqg5vsEDr2b1C((JQUU>o!)XlQ*`wFy!b)3w z{|~-;*hM#Z4z)HcmmMan!)&y`R-40UwAz#>cPY>nFkzxJoBbGDM!(pZB{@_5nCYEn zY=eDfEP@?aGb^4S|05qLo;<~e2xEp6zq{&3K7flOr+Bt_zewsPO8?2rij>raCtYrj z-R?4Z9JqR1-T;Er>cJx}xYFguf+1{|9sYATEhbDc4wuG`!e*?$O#$p&?Dz}2E!>f6a#-+e))_E6T^?*aO{%f0TKM%Teyhc0 zHaP=`ACKQ+Gm8@~d_hV8UZiOY`Yax7@x`5|N!E$k2ytw;njI#$-6Q^b8t?B-CWpsp zH(TruC$CE^`rgwJFwF)+%W-92An2L-3~L>-FCA_&4w4< z=V|?8v0IELhsl9-itL0D=oA}&;f*QuxZH=mniCr>KlbP%+a%=<^qC#>#2znWOh_@t z*6=d9j8?nNjD^3|>~dgLWWv1pJ^qI9mSenIiW$%Nu}ZMIeAx5`oOWemPN4;b6K`}( z$gkMd_{H$Eye2;foHayBO8SO@|ID3}or(m7ov*Gy%r4NL+O&I@=2ZBbQ$?0_= zuM&5V>~^!VU4%+L-S5<3Qj&F005 zPIGrVDlk4R^D2Fod5h**>CvXR=2xDUV)9_|XLng$m}6m%M>u}veQ&T@EH1mn6R^4c z4m{?tsNHf=1JoRa%z9oE#ExJ2%v1|ZH)G|6w~x?z!jw zdGEe))o0N=K8;>3OC!&$$Xe8Ei=8pL3=AoeF^=qLJZDGyWvW*$aO;ZK`%7yR*8dPA zm24LmV+JHQ?+~>HrW|JMztu&xGZR^psOpq4!uVQt&li|5F67x+$ff0M*S9hgwZ{Ff z?~t2TtGPL5NVAG#h8!@PmNRqoc9t#Q!juM8U0|`imzz14CR8&fhIZE5p5Z?P*1ns9mzhmNSa#37dINWb z_(OJ^O%@J*yxEi@#&=Hd)LB#icd@Z^R@%-znx20^59ErXH3z*SS~{mmo0`N$WCeRg zYFt+ABd==0`x=Ym-r~t6TUFt@=FOCwAE)xdPP>Y&OZ;0gy zgC*k|;=P1Qy8y@*WSdzO4IVm~T_=akKUF}C=VA33^xkcZw;4}lZ#ACqCYvNuVm6k1q1sbtJS&XbrBGk>OffU!CY^+QhY=||U z3(3`<7ke`Dl54*uDC$ZssN@Gq{wFSEWJo1Hh}0fWllyxNPyY6Ykc=@ZBvTtLWZBMJ z8b``whNOHOCyY%jJ9oX5o%e#)6UO6Wf5q^Go$&}ht`@G{8874s_A6S>V{9uUAr=Gy0MF>-OpUqHd9H0*?6rX)P+sGs0%T= zKG|ht)uQ&>pndjE=1ntp$*wV|!PBPg{Dd)5bD}7n_?A?XAmmB5{E|nr`@Uev&R=hE z8PzCzBwJo@%Fg1Z?4I1D(oDuj)jYc72~j<1K=SOJyC5p+j4x4ce!%#$I5a6OujDV; zeb*b*&V;tM(#Dc)x<=9>jLnTA@$Pw&v74yB``z9xYJr+fE#5SfDdZPp24*QKI|uIT z%eB6&jS)-k`La8tF;U=B8iGMg6tXwN$f8QRw}|@5H%D@d(n8!WE#my-8>QM0MbVU* zkwQ&zZ7L2;xi6Ai9o43yY^tUrUwk;V1aTlw>xRGXX+JB}bgHe;p=oV}hE&4Lj^-DA z+*bF-%Ac9vbhJ%P-1Igzb<-`eC9!JM)zxN*rs;P}wLL`N8RKC~{fvCcm?`$mxQl4% zGo6G+&O}^_B{MUO#;okDTJg%F6tQ>a0RD-%IP-FFQfFlh_=O%dmLVQFQ;KMksIF9} zEOk`X#$@+gABsYwFKvHs5~Xvl?Dgg1Ud@Q-S{Ajrgk!a0 z|79jMju-brX~cJS?#?g7+Br7K*k9MuI>#d!?PA!yX#2k#x86IPXVtpQSm^{Nl29vH z4UHXPG#*sPP;|3Pq|eRDs?}DZ1Mbi&WR;Xsb!JT2g<-Y0xoe9ko0}sUpBGE!X2mua zh6A?2Flm|bK?EmWz?-+`;d z(0O@jB?m*QAf`IKs8%g*YIckIdHJ^5tI6*qlAT3)DWlRtIxtYpO?9DW#2j#|I40-n z##8eaNCD%YvNvpE)6RUXPFd!p^s_@kP1El6ZiQEM_Qps>px?pum-4t`zUd(RV z%%XBkY!|hp?!dj`;(`&9X|X5`jF60r8aD=xOOo-~#+pU%aO7fiO@_(1B0Fm%6HO1M zikA2|(NJSbE2*PJBIMhmx73Q@fFkvJ3VSXJ})NI;@MLp&+Q5~jd8%rPlnqx93TE1E`ek_hI&&&U{ zIpGB@(wm-AJ&hrP{o}{Nvf@uDKYvA^%oB?@mz<#SZg!=x#=6g#eZmLKD@7Z!8=6mK zZ+QQNIJjbjgdJ-7N~ct^Pc*GhNyZwX2btPC&HKdsm3^Ra%gQXt_?kEbQFM|){6jLn zF7}I@wAz1~jeB)d64WqsVzlPeeIg92mhlr}`6~45A#rF`0ASc7V`BYp?jnz3o6@-b zk^a=$men+aUs!!R{+24VwW?N#vPKyjHdR-uE6v2VsXA`W99l~bKhaw}zh(x+eEWPEOA^e$>(Fwa3+wEvu7X ze{v~pzt!Pls{L3PHmpuAXdxdWl1{3=e4zP1V(W%^QuAjb_bH5@R#EyCs`^YE452em z%^>94sPgJJ5?Z-Q1-Y9BOC{fl$(vr3zU7Vb<^*mksT8%i98b@aN~Se#fBMx}>3xrw z^}g!{;&3kY@`~2REUCaN;&$96jq-}gI|ikcgq{qdD59@>M76JWc2r~2jyIyD z+DcKsJ56dfh%LLJCaUq!ZcHVhHoSx#h)JaXeUa20EgJs5PC5`HiuR;QOQOZNJ$FeZ zDPqr_+azPG=<@OyskXbQe7Qn0#x)*&c`%nsl12I}k4d#@V)rY8gscA*7OEt zse4yT`#u-j_x@FS?Q=2l)!~%weiaMk<>J(51n#Z(=dCyXVd#qwq> zfn$W_onE5*fx?7dW2dnueP$Ue$_@-qX}%Mapuudk;1Q`hmU$G|D3q z4-H7!1Mvz~~j9zNuC)?yZ~-nv0@Bn!ojkHE(@DaZ&lU8W*eHUMUrLMDF1MQi)gi4kMJ9 zXgQoCZSshiBc5cx7f&EG^=Zzn^NRULZj?$U!fkot+>wD&$t2uXNVSty%B%03p$Ojb zZdO+FbnIg>>0>d-%H-;Th}ko$S217Qs|L?^LuQBz?|wznt?yyEYi;cL{tZ#rgnT@M zJcbqNUiC@jj5?#d9=1|diP{+LnW%cLI+>BYsiaD5JvwAaucuup@S`bbtC~lr;OVql zGDn|DGRK@r?xsfm;*(-jSMFV7ltP_TGMA!9m<}uml`$=AbpLB4?_BJkdC#nAmHlT{ zTE)vBULMWZ{4ZqY6#xD(n>z*n=t`;e3z7HH5S}Qef7FAgiWMJa^PyrV{_Yn4`p6}< zb`r_QhD$ZE!gFj8?$7SeCFJ?-s$$h?_Jmf5uG4 zsvtB-^gDieq(J%<|CDJn=Bh#mAv748@^N*-#l-W+$MZrF|8X|oA*>${iYT08eETcZ zE#CatuH6}1uGj8vY1!35I^=|+GvtIjKKUkXAmxful{GX6mUS_*I&!*49aqBvJ!Fiz-7fX7}s!ILGW)!?!h$~*IZnSaV^KS7T5E* zUcvPyu9LXF#x)Rne?T6E?N|b??zk+t2I3luYZ&-rzLT@rM1Wbi7UNotYdx;5xc-J~ zKd#rm6F;;Lk%nGSn>g!2sEI?7|GbGiE~rgBe?ffpc^Xd_oxYf0to)zMWX%bwqT!3g z{I#Gs;hrwIC;~nOrZjU_x%VE~gFmxolzaUHVnI9gKXLqvyLgPa`b%N_^ar#>SU>6~ zq*E!<#UDi4sg=_9AH}v)p4gv$l$i?!T7DF1r)~X)U6ff@z;fi&^Rj2|EdNZoqI}Y1 zzYkdFSA!qwqWaS@Qo}{D`t)7WrHkUb(}Rt#fUonVsh1k>{(2h^q_a$RIk*LAR~m91=L2T}55P4JGL$H%H-LIRK*k8t zc$8D1j?K@{ztiKNFlnkh@M_sV)hFkctpJajwEUE;zDaxq(UA!JB+E3a3PtrNeZ*^L z3rBqk$hdc*)G5VZ_LpsmILzr4ZEg(;tDNma{OP*FCd#25v>I15f%NWzk4}*M) zE-zmAzKfW2uCp|si#g|pB<}{3UR;*qqI@@ReCyoOsQk&8^~lU|$SKJl)G%wJU!FA8 z=dYqFQHEjzyn3Uk`_4A#ZLKALN0DwIzk{3tBvzIu`zvOVgP1OJ83rr0`n)Fdj!}H~ z-Q8)Wm?)D$_8=#Rf2^tWn8dvA^I|uGOf7lIB({B@)%z$Qb&~@ZIcnVO`l#dY&Q13$b&(0Dw>Ue zGN-hT2nN%EC{aEU*O?K@KO~+aDlf%I6K@ssE@c?Ej|>KvD+@buv)B%*JW9NDDNAY? zC5~UpNm+GUdyO*6VQ*lByAGVM$ zksgfd3Ah{*^T&!s!5nG+o#NSGhP3uB@kTI%w~Eh$JtRl@BiK7QM|y(6Qb?n8V(~)G zQgK^~5UmIOLWo|ZDOGus!JFuP)2W<~%;cmBpwl$(`aTJ1UN0=Zf9<3@= zwwZWZS{3foCkBHu=#+?G4_fX-WdY|I()_!Xb)4r*aZ{AHfV&==5)8Uk$&ew5u;7fs zC2qbgacW1q-C(7H7H;D(fS52jnik7Iqq3@6&EsT773h|!%H0yrFjh^|BSdMCcudz; zU@A+AWDh~MRe4$BJ*2Wq<+y~N*j=gofSeywx<>JA>Cg;nK#Ect#bc!UnaY?bo@U%L zGZ@^j?3H*oWqA}g@G|9vC~m%q`nw71nLIlfJVsR%Cs_3UChs2uuLV3*swSeH0qrno zJvEw)+<=LvMfsMhPrp}5Gw`%AP4{YsYYnBM;~=&NbUhHLVU?im0BsBIQN64O%@WXy ztAarq#gs^PEoi)2p4brUpmG6u^qu>4oT06@^!;o|j#N^Wgx{P~DL@NdD zlya?!o4bA*#-eJgz&fK$GV#mvQmfm&My0lZw-b5f|88u0z}R$pU3j-Yik-hT4sqyFM+0ulP8NoBf0sw zr(mN%PPNinpE0j)1GN<>QsEj3Jz>al3FN-U@33^I>ohk{=DO#8SY+BndBpoIrt zC1@j`3HE6tlF}Lwiy>Hqdni?>Jfg1!eeyHP!*M*N`&#g|9#97d@ehH2OnEsDKI!{x zFz5@}R7o~bJ1&A<^_=om9D?NV^GZfMf~0htGAN$s>0=*RUi^{bLyqh#^r!ppiXQZszg&rd_kyPhEWX<1{hZA@T zzp!gl0`J3<3}4C&;l?=0GKGB@n+wUU^DZtt1f{jVuDjq@ou26Yved z7#u2|13WTJem$@+O#Tq??oKkZX!^;#)-XH{I5k#wt2U7V8$sw9E3-1Kz$xG@uo+EJ zE2I|#HQ>u3zVcim_a}{m0OV8woPx44B{PZlNU8+ctdYGS*C@Au%vUMXDch~AKz7SN zAw(NxYHc1Cy_T@bMgbq~EQ3plv%7%LfKMA=lE-^15;#`j$kz#D;SbP?{Y#G844{)uw6nP+GI6QrmT=_>#ol0#4QS0be!>d*d)% z3fvGTzhV>%Fvn%>EeJxu4O|3;)FK1MyZ%OoD)D$ysr-$=^YsP-e=#P&SRn{Snm~MK+-Qj^=o^6tMBt&o2UBIO1ZN|G z4~OA0;Ckq%E+UV8bQ>C&pNZ#RGRVZ12O<>y1$a3M=;8h^;MVT4J|0+~IP^LAeKdum zfD^xN@3H`}44kX+p8*~k#(x)hG_YPia0!H(FoE9jjI9d8BZ1WyQ<}m(w`02wc$t2hIi;cOaY%Hbmf;Bk+e2`1=Ul<+6?jStIc9a2$Ze)58hCYk)U? z-98ELy%WQ-N4pEHccIUL^)5&q&)8oeuXn*%V2k$JfTDgKa8(%o1Xz7{2s;BL(6g*# z1^Xfl`XT}+QB7JRm(v=iC&J?+a9sr6)Q$scpB-!`sQAkWoIn$qmZ$=21RfcI?~TBZ zMc|j)a3B;kEp3Dlj-n+atiqfKd|d=Ci@^6s;Kw5HE*+zOwZ-r01Pz~!zzMX_X^A}0 zCjt+Rz}^VFAOb(BVX9v>;O`Lv{}+M3iNKf94n#|;K@s@+2<(l(fe=>fR}FYPLSR<} zem4St9f3P{)y)Yt=*kFuT?8Jl;!ypn0ry1+C=s|Z0>2%Bzl^|f^a4&xYS2dD+X!p* zs|L)D5Lg|7cSPWKBJi0AoIvjuwL}K=jleeoUlA@aF+!k5dH!C1u5VRsv zs`ATfPHW@{@ZUbuzKOjb_#;T>kj7=SCm)LmV%5U27Qs6V^ zlw_IbCGEt$1w5JtNw!6~Nyc8SNDlc9O;*WhcH5B;i9G_WAN>$+0#?s)H2E)q^|K)2 z^3ILtcZs;2Q9!$ zrrGVyQ9i(K1c6S^Gy&I#tsZ{1cc?*s#%44gL<8PTTYmm6^lT zQ@73Gz|mft489kbPUC3b#aTdN8$h6=IbGmQU^=D?2}tY$FdfseX70y2tR;8XMeiIy>gj)2B^2F6qwEf zb^d+8bT+8t&A@a{*iEb82r!))>IPo~rt?D`U)dXB4NL|H$f6M-;83y6;`@Q=d{Hm3 z1(?nn^)7lBn9d!|T7{Q@=?qdgsCOPy&m(m_5}3{=b&m#s>6{Y$fa;QGL7+oRqo(kE z;Mco~5aO!Z1&#nG0vcrC;qQ}-24da3u{GAKXfW^40O@By9Ib-7=J$Srx%nLd-E}Y zr*W^J)|2cz!1^gZ;h%tape!;~S8hJmB4B;qHCEtVLv8yI`MMI1>aZ=9a4c4zT&;#KkhBcVOhi)CH(;A+T29RXFJ&@EQ$|T^uqPP_5tz;J&&u zP+<#jI zI?e`{0k^g-xCSzk-&H|j|xF|8d#AC{>U5@+9o-w?*nR36IbPX_wV44LnM5Cz0; zU=pK5wT+*T7goS(^MT6{v_1bUv*qBE{CmLX>oIenLkUM?mZEC)nd81{1UclpX#8vh z=|%8!L*-pe0ig>Nv}g+70PY*6V66=dEzy>5H}IK$%8CAbK<3^G49OMkm1V+}abdf? zIOS>!zuB5=$6LQ2+gDT4R=iTylyY_}_^Bvn0EPDb^Oct^yhqM%kSi~?N5)Cuc0+yGsAZ(TJKZV~Mh>|l(Wp=jBD z$dg;YzZ-inG+_vpM>h<(2jzj)sFkqkyB~zZ?F7~Yd>;L#M~O5UQ4`j$#lQo@UT<-#ruIT!hmZu zY^ukW8wT{y@D0E%z*lIv9$5dDiCX+0<#`*w#>5NI<@w4v8_x?|hkHv{zty2l<5tP) z+(9-Tz90NBY+H!Q2sjQ^5dXqMm@r{-f>z~#hY@#yEj*wp^whEZ7ZeJAW^TH;`BYxC2`~Y0^c)Px3vk(|h$m$DZv~dL6jR`d7$u


y@LcpF0t0vJ2 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 delta 23843 zcmbuH4_s7L`v1?lG9wZqe-sf3FQ9~|IRBU#%#2zvbIsJK%rymO2C@8uibkdmrh}Sp zp+~)DW}1I;TWc+BwQ>s!Tr1brver#Y+uXiZWKddG>ij;>{R6{nt-bblU$5(#_j8`} zoaa2}@65fp`%K5xpLML2B}dE3^oRQ_b}&YF1j7}}7)P=@hO^x{Y3iK?Zd&=)K&h(B z<{u-az>DHipP_857aavvgWTUN7funFxRq#j=NZfJenz+)Jo

Yiyxi&9_%~N- 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 diff --git a/recursion/compiler/src/asm/code.rs b/recursion/compiler/src/asm/code.rs index 1f01ce1ff2..be067020f2 100644 --- a/recursion/compiler/src/asm/code.rs +++ b/recursion/compiler/src/asm/code.rs @@ -18,7 +18,7 @@ pub struct BasicBlock( impl> BasicBlock { /// Creates a new basic block. - pub fn new() -> Self { + pub const fn new() -> Self { Self(Vec::new(), Vec::new()) } @@ -42,7 +42,7 @@ pub struct AssemblyCode { impl> AssemblyCode { /// Creates a new assembly code. - pub fn new(blocks: Vec>, labels: BTreeMap) -> Self { + pub const fn new(blocks: Vec>, labels: BTreeMap) -> Self { Self { blocks, labels } } diff --git a/recursion/compiler/src/asm/compiler.rs b/recursion/compiler/src/asm/compiler.rs index 6d46cf1bd9..5c2c9a22bf 100644 --- a/recursion/compiler/src/asm/compiler.rs +++ b/recursion/compiler/src/asm/compiler.rs @@ -42,28 +42,28 @@ pub struct AsmCompiler { impl Var { /// Gets the frame pointer for a var. - pub fn fp(&self) -> i32 { + pub const fn fp(&self) -> i32 { -((self.0 as i32) * 3 + 1 + STACK_START_OFFSET) } } impl Felt { /// Gets the frame pointer for a felt. - pub fn fp(&self) -> i32 { + pub const fn fp(&self) -> i32 { -((self.0 as i32) * 3 + 2 + STACK_START_OFFSET) } } impl Ext { /// Gets the frame pointer for an extension element - pub fn fp(&self) -> i32 { + pub const fn fp(&self) -> i32 { -((self.0 as i32) * 3 + STACK_START_OFFSET) } } impl Ptr { /// Gets the frame pointer for a pointer. - pub fn fp(&self) -> i32 { + pub const fn fp(&self) -> i32 { self.address.fp() } } @@ -700,7 +700,12 @@ impl<'a, F: PrimeField32 + TwoAdicField, EF: ExtensionField + TwoAdicField> compiler.push_to_block(last_if_block, instr, None); } - fn branch(lhs: i32, rhs: ValueOrConst, is_eq: bool, block: F) -> AsmInstruction { + const fn branch( + lhs: i32, + rhs: ValueOrConst, + is_eq: bool, + block: F, + ) -> AsmInstruction { match (rhs, is_eq) { (ValueOrConst::Const(rhs), true) => AsmInstruction::BneI(block, lhs, rhs), (ValueOrConst::Const(rhs), false) => AsmInstruction::BeqI(block, lhs, rhs), diff --git a/recursion/compiler/src/ir/builder.rs b/recursion/compiler/src/ir/builder.rs index 404da05a4b..19fb164f28 100644 --- a/recursion/compiler/src/ir/builder.rs +++ b/recursion/compiler/src/ir/builder.rs @@ -33,7 +33,7 @@ impl From> for TracedVec { } impl TracedVec { - pub fn new() -> Self { + pub const fn new() -> Self { Self { vec: Vec::new(), traces: Vec::new(), @@ -698,7 +698,7 @@ pub struct RangeBuilder<'a, C: Config> { } impl<'a, C: Config> RangeBuilder<'a, C> { - pub fn step_by(mut self, step_size: usize) -> Self { + pub const fn step_by(mut self, step_size: usize) -> Self { self.step_size = step_size; self } diff --git a/recursion/compiler/src/ir/symbolic.rs b/recursion/compiler/src/ir/symbolic.rs index 37beac2a8e..6b2fbfd4e1 100644 --- a/recursion/compiler/src/ir/symbolic.rs +++ b/recursion/compiler/src/ir/symbolic.rs @@ -135,7 +135,7 @@ impl PartialEq for SymbolicExt { impl Eq for SymbolicExt {} impl SymbolicVar { - pub(crate) fn digest(&self) -> Digest { + pub(crate) const fn digest(&self) -> Digest { match self { SymbolicVar::Const(_, d) => *d, SymbolicVar::Val(_, d) => *d, @@ -148,7 +148,7 @@ impl SymbolicVar { } impl SymbolicFelt { - pub(crate) fn digest(&self) -> Digest { + pub(crate) const fn digest(&self) -> Digest { match self { SymbolicFelt::Const(_, d) => *d, SymbolicFelt::Val(_, d) => *d, @@ -162,7 +162,7 @@ impl SymbolicFelt { } impl SymbolicExt { - pub(crate) fn digest(&self) -> Digest { + pub(crate) const fn digest(&self) -> Digest { match self { SymbolicExt::Const(_, d) => *d, SymbolicExt::Base(_, d) => *d, diff --git a/recursion/compiler/src/ir/types.rs b/recursion/compiler/src/ir/types.rs index 96d999e96e..4ce05c9a74 100644 --- a/recursion/compiler/src/ir/types.rs +++ b/recursion/compiler/src/ir/types.rs @@ -96,7 +96,7 @@ impl From for Usize { } impl Var { - pub fn new(id: u32) -> Self { + pub const fn new(id: u32) -> Self { Self(id, PhantomData) } @@ -110,7 +110,7 @@ impl Var { } impl Felt { - pub fn new(id: u32) -> Self { + pub const fn new(id: u32) -> Self { Self(id, PhantomData) } @@ -131,7 +131,7 @@ impl Felt { } impl Ext { - pub fn new(id: u32) -> Self { + pub const fn new(id: u32) -> Self { Self(id, PhantomData) } diff --git a/recursion/core/src/fri_fold/mod.rs b/recursion/core/src/fri_fold/mod.rs index 02ef07db1d..d59668d1e9 100644 --- a/recursion/core/src/fri_fold/mod.rs +++ b/recursion/core/src/fri_fold/mod.rs @@ -359,11 +359,11 @@ impl FriFoldChip { ); } - pub fn do_receive_table(local: &FriFoldCols) -> T { + pub const fn do_receive_table(local: &FriFoldCols) -> T { local.is_last_iteration } - pub fn do_memory_access(local: &FriFoldCols) -> T { + pub const fn do_memory_access(local: &FriFoldCols) -> T { local.is_real } } diff --git a/recursion/core/src/memory/air.rs b/recursion/core/src/memory/air.rs index 45ba60fc26..9fe4161fac 100644 --- a/recursion/core/src/memory/air.rs +++ b/recursion/core/src/memory/air.rs @@ -18,7 +18,7 @@ pub(crate) const NUM_MEMORY_INIT_COLS: usize = size_of::>(); #[allow(dead_code)] impl MemoryGlobalChip { - pub fn new() -> Self { + pub const fn new() -> Self { Self { fixed_log2_rows: None, } diff --git a/recursion/core/src/poseidon2/external.rs b/recursion/core/src/poseidon2/external.rs index 72e0cd51f0..33bd225f57 100644 --- a/recursion/core/src/poseidon2/external.rs +++ b/recursion/core/src/poseidon2/external.rs @@ -311,7 +311,7 @@ impl Poseidon2Chip { ); } - pub fn do_receive_table(local: &Poseidon2Cols) -> T { + pub const fn do_receive_table(local: &Poseidon2Cols) -> T { local.rounds[0] } diff --git a/recursion/core/src/poseidon2_wide/columns.rs b/recursion/core/src/poseidon2_wide/columns.rs index 6ea939053e..371b9d620d 100644 --- a/recursion/core/src/poseidon2_wide/columns.rs +++ b/recursion/core/src/poseidon2_wide/columns.rs @@ -51,7 +51,7 @@ impl Poseidon2ColType { } /// Returns the external sbox columns for the given round. - pub fn get_external_sbox(&self, round: usize) -> Option<&[T; WIDTH]> { + pub const fn get_external_sbox(&self, round: usize) -> Option<&[T; WIDTH]> { match self { Poseidon2ColType::Wide(cols) => Some(&cols.external_rounds_sbox[round]), Poseidon2ColType::Narrow(_) => None, @@ -59,7 +59,7 @@ impl Poseidon2ColType { } /// Returns the internal sbox columns. - pub fn get_internal_sbox(&self) -> Option<&[T; NUM_INTERNAL_ROUNDS]> { + pub const fn get_internal_sbox(&self) -> Option<&[T; NUM_INTERNAL_ROUNDS]> { match self { Poseidon2ColType::Wide(cols) => Some(&cols.internal_rounds_sbox), Poseidon2ColType::Narrow(_) => None, diff --git a/recursion/core/src/program/mod.rs b/recursion/core/src/program/mod.rs index e151844ee0..c8745378a2 100644 --- a/recursion/core/src/program/mod.rs +++ b/recursion/core/src/program/mod.rs @@ -40,7 +40,7 @@ pub struct ProgramMultiplicityCols { pub struct ProgramChip; impl ProgramChip { - pub fn new() -> Self { + pub const fn new() -> Self { Self {} } } diff --git a/recursion/core/src/range_check/event.rs b/recursion/core/src/range_check/event.rs index 58e260e984..3dbdae7bb4 100644 --- a/recursion/core/src/range_check/event.rs +++ b/recursion/core/src/range_check/event.rs @@ -14,7 +14,7 @@ pub struct RangeCheckEvent { impl RangeCheckEvent { /// Creates a new `RangeCheckEvent`. - pub fn new(opcode: RangeCheckOpcode, val: u16) -> Self { + pub const fn new(opcode: RangeCheckOpcode, val: u16) -> Self { Self { opcode, val } } } diff --git a/recursion/gnark-ffi/src/groth16.rs b/recursion/gnark-ffi/src/groth16.rs index 703f16b358..b83031d67c 100644 --- a/recursion/gnark-ffi/src/groth16.rs +++ b/recursion/gnark-ffi/src/groth16.rs @@ -30,7 +30,7 @@ pub struct Groth16Proof { impl Groth16Prover { /// Creates a new [Groth16Prover]. - pub fn new() -> Self { + pub const fn new() -> Self { Self } diff --git a/recursion/gnark-ffi/src/plonk_bn254.rs b/recursion/gnark-ffi/src/plonk_bn254.rs index cdb3b23a97..04a2799807 100644 --- a/recursion/gnark-ffi/src/plonk_bn254.rs +++ b/recursion/gnark-ffi/src/plonk_bn254.rs @@ -25,7 +25,7 @@ pub struct PlonkBn254Proof { impl PlonkBn254Prover { /// Creates a new prover. - pub fn new() -> Self { + pub const fn new() -> Self { PlonkBn254Prover } diff --git a/recursion/program/src/fri/domain.rs b/recursion/program/src/fri/domain.rs index a26acf23ed..eca1a6e483 100644 --- a/recursion/program/src/fri/domain.rs +++ b/recursion/program/src/fri/domain.rs @@ -15,15 +15,15 @@ pub struct TwoAdicMultiplicativeCosetVariable { } impl TwoAdicMultiplicativeCosetVariable { - pub fn size(&self) -> Var { + pub const fn size(&self) -> Var { self.size } - pub fn first_point(&self) -> Felt { + pub const fn first_point(&self) -> Felt { self.shift } - pub fn gen(&self) -> Felt { + pub const fn gen(&self) -> Felt { self.g } } diff --git a/recursion/program/src/stark.rs b/recursion/program/src/stark.rs index a65dad9c47..a7cdd1fb53 100644 --- a/recursion/program/src/stark.rs +++ b/recursion/program/src/stark.rs @@ -78,7 +78,7 @@ pub struct ShardProofHint<'a, SC: StarkGenericConfig, A> { } impl<'a, SC: StarkGenericConfig, A: MachineAir> ShardProofHint<'a, SC, A> { - pub fn new(machine: &'a StarkMachine, proof: &'a ShardProof) -> Self { + pub const fn new(machine: &'a StarkMachine, proof: &'a ShardProof) -> Self { Self { machine, proof } } } @@ -89,7 +89,7 @@ pub struct VerifyingKeyHint<'a, SC: StarkGenericConfig, A> { } impl<'a, SC: StarkGenericConfig, A: MachineAir> VerifyingKeyHint<'a, SC, A> { - pub fn new(machine: &'a StarkMachine, vk: &'a StarkVerifyingKey) -> Self { + pub const fn new(machine: &'a StarkMachine, vk: &'a StarkVerifyingKey) -> Self { Self { machine, vk } } } diff --git a/sdk/src/proto/network.rs b/sdk/src/proto/network.rs index 52bb125647..9c0492a738 100644 --- a/sdk/src/proto/network.rs +++ b/sdk/src/proto/network.rs @@ -308,7 +308,7 @@ impl ProofMode { /// /// The values are not transformed in any way and thus are considered stable /// (if the ProtoBuf definition does not change) and safe for programmatic use. - pub fn as_str_name(&self) -> &'static str { + pub const fn as_str_name(&self) -> &'static str { match self { ProofMode::Unspecified => "PROOF_MODE_UNSPECIFIED", ProofMode::Core => "PROOF_MODE_CORE", @@ -363,7 +363,7 @@ impl ProofStatus { /// /// The values are not transformed in any way and thus are considered stable /// (if the ProtoBuf definition does not change) and safe for programmatic use. - pub fn as_str_name(&self) -> &'static str { + pub const fn as_str_name(&self) -> &'static str { match self { ProofStatus::ProofUnspecifiedStatus => "PROOF_UNSPECIFIED_STATUS", ProofStatus::ProofPreparing => "PROOF_PREPARING", @@ -420,7 +420,7 @@ impl TransactionStatus { /// /// The values are not transformed in any way and thus are considered stable /// (if the ProtoBuf definition does not change) and safe for programmatic use. - pub fn as_str_name(&self) -> &'static str { + pub const fn as_str_name(&self) -> &'static str { match self { TransactionStatus::TransactionUnspecifiedStatus => "TRANSACTION_UNSPECIFIED_STATUS", TransactionStatus::TransactionScheduled => "TRANSACTION_SCHEDULED", diff --git a/zkvm/entrypoint/src/syscalls/sys.rs b/zkvm/entrypoint/src/syscalls/sys.rs index bea32c3e57..2a62372a62 100644 --- a/zkvm/entrypoint/src/syscalls/sys.rs +++ b/zkvm/entrypoint/src/syscalls/sys.rs @@ -9,7 +9,7 @@ pub unsafe extern "C" fn sys_panic(msg_ptr: *const u8, len: usize) -> ! { #[allow(unused_variables)] #[no_mangle] -pub fn sys_getenv( +pub const fn sys_getenv( recv_buf: *mut u32, words: usize, varname: *const u8, @@ -20,7 +20,7 @@ pub fn sys_getenv( #[allow(unused_variables)] #[no_mangle] -pub fn sys_alloc_words(nwords: usize) -> *mut u32 { +pub const fn sys_alloc_words(nwords: usize) -> *mut u32 { core::ptr::null_mut() } diff --git a/zkvm/precompiles/src/utils.rs b/zkvm/precompiles/src/utils.rs index d73b485b1e..4bb9d205ab 100644 --- a/zkvm/precompiles/src/utils.rs +++ b/zkvm/precompiles/src/utils.rs @@ -21,7 +21,7 @@ impl + Copy, const NUM_WORDS: usize> AffinePoint Self { + pub const fn new(limbs: [u32; NUM_WORDS]) -> Self { Self { limbs, _marker: std::marker::PhantomData, From 6e9030ca46558e3dad2a9c4cbe661f9322ae90e8 Mon Sep 17 00:00:00 2001 From: Eugene Rabinovich Date: Thu, 23 May 2024 15:18:17 -0700 Subject: [PATCH 19/42] chore: no remainder range checks if division by 0 (#764) Co-authored-by: Tamir Hemo --- core/src/alu/divrem/mod.rs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/core/src/alu/divrem/mod.rs b/core/src/alu/divrem/mod.rs index b861f91721..b54206469f 100644 --- a/core/src/alu/divrem/mod.rs +++ b/core/src/alu/divrem/mod.rs @@ -186,6 +186,9 @@ pub struct DivRemCols { /// Selector to know whether this row is enabled. pub is_real: T, + + /// Column to modify multiplicity for remainder range check event. + pub remainder_check_multiplicity: T, } impl MachineAir for DivRemChip { @@ -276,6 +279,11 @@ impl MachineAir for DivRemChip { } } + // Calculate the modified multiplicity + { + cols.remainder_check_multiplicity = cols.is_real * cols.is_c_0.result; + } + // Calculate c * quotient + remainder. { let c_times_quotient = { @@ -373,7 +381,9 @@ impl MachineAir for DivRemChip { clk: event.clk, } }; - output.add_lt_event(lt_event); + if cols.remainder_check_multiplicity == F::one() { + output.add_lt_event(lt_event); + } } // Range check. @@ -689,6 +699,12 @@ where is_signed * slt + is_unsigned * sltu }; + // Check that the event multiplicity column is computed correctly. + builder.assert_eq( + local.remainder_check_multiplicity, + local.is_c_0.result * local.is_real, + ); + // Dispatch abs(remainder) < max(abs(c), 1), this is equivalent to abs(remainder) < // abs(c) if not division by 0. builder.send_alu( @@ -698,7 +714,7 @@ where local.max_abs_c_or_1, local.shard, local.channel, - local.is_real, + local.remainder_check_multiplicity, ); } From e6f9f0d3429f88918338d8d31c8a7c0180f77606 Mon Sep 17 00:00:00 2001 From: cario-dev <152556479+cario-dev@users.noreply.github.com> Date: Fri, 24 May 2024 00:19:28 +0200 Subject: [PATCH 20/42] chore: upgrade checkout action to version with node20 (#734) --- .github/workflows/eval.yml | 2 +- .github/workflows/main.yml | 2 +- .github/workflows/pr.yml | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/eval.yml b/.github/workflows/eval.yml index 150b7d3f30..77bead45df 100644 --- a/.github/workflows/eval.yml +++ b/.github/workflows/eval.yml @@ -20,7 +20,7 @@ jobs: CARGO_NET_GIT_FETCH_WITH_CLI: "true" steps: - name: Checkout sources - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Set up git private repo access run: | diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 33320d62be..ec110183b0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,7 +25,7 @@ jobs: CARGO_NET_GIT_FETCH_WITH_CLI: "true" steps: - name: Checkout sources - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup CI uses: ./.github/actions/setup diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index ff5a26540e..2dfe2485dd 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -28,7 +28,7 @@ jobs: CARGO_NET_GIT_FETCH_WITH_CLI: "true" steps: - name: Checkout sources - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup CI uses: ./.github/actions/setup @@ -59,7 +59,7 @@ jobs: CARGO_NET_GIT_FETCH_WITH_CLI: "true" steps: - name: Checkout sources - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup CI uses: ./.github/actions/setup @@ -90,7 +90,7 @@ jobs: CARGO_NET_GIT_FETCH_WITH_CLI: "true" steps: - name: Checkout sources - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup CI uses: ./.github/actions/setup @@ -118,7 +118,7 @@ jobs: CARGO_NET_GIT_FETCH_WITH_CLI: "true" steps: - name: Checkout sources - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup CI uses: ./.github/actions/setup @@ -147,7 +147,7 @@ jobs: CARGO_NET_GIT_FETCH_WITH_CLI: "true" steps: - name: Checkout sources - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup CI uses: ./.github/actions/setup From d7e1851572e5d2b8abb3b56335ef94aa2f277717 Mon Sep 17 00:00:00 2001 From: John Guibas Date: Thu, 23 May 2024 15:56:21 -0700 Subject: [PATCH 21/42] feat: plonk prover (#795) Co-authored-by: Ubuntu Co-authored-by: Chris Tian --- .github/workflows/main.yml | 6 +- .github/workflows/pr.yml | 4 +- book/SUMMARY.md | 2 +- book/developers/building-groth16-artifacts.md | 7 - book/developers/building-plonk-artifacts.md | 7 + book/developers/recommended-settings.md | 2 +- book/verifying-proofs/solidity-and-evm.md | 16 +- core/src/stark/machine.rs | 14 +- examples/aggregation/script/Cargo.toml | 2 +- examples/aggregation/script/src/main.rs | 8 +- examples/fibonacci/script/Cargo.toml | 4 +- .../script/bin/{groth16.rs => plonk_bn254.rs} | 4 +- prover/Cargo.toml | 8 +- prover/Makefile | 33 +--- prover/release.sh | 2 +- ...{build_groth16.rs => build_plonk_bn254.rs} | 4 +- prover/scripts/e2e.rs | 12 +- prover/scripts/fibonacci_groth16.rs | 2 +- prover/src/build.rs | 57 +++--- prover/src/install.rs | 26 +-- prover/src/lib.rs | 43 ++-- prover/src/types.rs | 10 +- prover/src/verify.rs | 36 ++-- recursion/circuit/src/challenger.rs | 12 +- recursion/circuit/src/constraints.rs | 4 +- recursion/circuit/src/fri.rs | 6 +- recursion/circuit/src/lib.rs | 12 +- recursion/circuit/src/poseidon2.rs | 8 +- recursion/circuit/src/stark.rs | 4 +- recursion/circuit/src/witness.rs | 4 +- recursion/compiler/src/constraints/mod.rs | 1 - recursion/core/src/cpu/air/alu.rs | 2 +- recursion/core/src/cpu/air/branch.rs | 2 +- recursion/core/src/cpu/air/heap.rs | 2 +- recursion/core/src/cpu/air/jump.rs | 2 +- recursion/core/src/cpu/air/memory.rs | 2 +- recursion/core/src/cpu/air/mod.rs | 11 +- recursion/core/src/cpu/air/operands.rs | 2 +- recursion/core/src/cpu/air/public_values.rs | 2 +- recursion/core/src/cpu/air/system.rs | 2 +- recursion/core/src/cpu/columns/mod.rs | 2 +- recursion/core/src/cpu/mod.rs | 2 +- recursion/core/src/cpu/trace.rs | 2 +- recursion/core/src/multi/mod.rs | 7 + recursion/core/src/poseidon2/columns.rs | 1 - recursion/core/src/poseidon2/external.rs | 7 +- recursion/core/src/poseidon2/trace.rs | 7 +- recursion/core/src/poseidon2_wide/external.rs | 7 + recursion/core/src/stark/config.rs | 4 +- recursion/core/src/stark/mod.rs | 33 +++- recursion/core/src/stark/utils.rs | 8 +- recursion/gnark-ffi/Cargo.toml | 4 +- recursion/gnark-ffi/assets/SP1Verifier.txt | 75 +------ recursion/gnark-ffi/build.rs | 2 +- recursion/gnark-ffi/go/go.mod | 1 + recursion/gnark-ffi/go/go.sum | 2 + recursion/gnark-ffi/go/main.go | 57 +++--- recursion/gnark-ffi/go/sp1/build.go | 121 ++++++++++-- .../go/sp1/poseidon2/poseidon2_test.go | 2 +- recursion/gnark-ffi/go/sp1/prove.go | 24 ++- recursion/gnark-ffi/go/sp1/sp1.go | 14 +- .../go/sp1/trusted_setup/trusted_setup.go | 170 ++++++++++++++++ recursion/gnark-ffi/go/sp1/utils.go | 35 +--- recursion/gnark-ffi/go/sp1/verify.go | 12 +- recursion/gnark-ffi/src/ffi.rs | 48 ++--- recursion/gnark-ffi/src/groth16.rs | 127 ------------ recursion/gnark-ffi/src/lib.rs | 3 +- recursion/gnark-ffi/src/plonk_bn254.rs | 184 ++++++++---------- sdk/Cargo.toml | 2 +- sdk/src/artifacts.rs | 16 +- sdk/src/lib.rs | 114 +++-------- sdk/src/proto/network.rs | 4 - sdk/src/provers/local.rs | 32 +-- sdk/src/provers/mock.rs | 24 +-- sdk/src/provers/mod.rs | 29 ++- sdk/src/provers/network.rs | 10 +- 76 files changed, 765 insertions(+), 814 deletions(-) delete mode 100644 book/developers/building-groth16-artifacts.md create mode 100644 book/developers/building-plonk-artifacts.md rename examples/fibonacci/script/bin/{groth16.rs => plonk_bn254.rs} (90%) rename prover/scripts/{build_groth16.rs => build_plonk_bn254.rs} (74%) create mode 100644 recursion/gnark-ffi/go/sp1/trusted_setup/trusted_setup.go delete mode 100644 recursion/gnark-ffi/src/groth16.rs diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ec110183b0..7bd88f3474 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -18,8 +18,8 @@ concurrency: cancel-in-progress: true jobs: - groth16: - name: Groth16 + plonk: + name: Plonk runs-on: runs-on,cpu=64,ram=256,family=m7i+m7a,hdd=80,image=ubuntu22-full-x64 env: CARGO_NET_GIT_FETCH_WITH_CLI: "true" @@ -35,7 +35,7 @@ jobs: with: command: test toolchain: nightly-2024-04-17 - args: --release -p sp1-sdk --features groth16 -- test_e2e_prove_groth16 --nocapture + args: --release -p sp1-sdk --features plonk_bn254 -- test_e2e_prove_plonk_bn254 --nocapture env: RUSTFLAGS: -Copt-level=3 -Cdebug-assertions -Coverflow-checks=y -Cdebuginfo=0 -C target-cpu=native RUST_BACKTRACE: 1 \ No newline at end of file diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 2dfe2485dd..093d9fcefe 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -45,7 +45,7 @@ jobs: with: command: test toolchain: nightly-2024-04-17 - args: --release --features groth16 + args: --release --features plonk_bn254 env: RUSTFLAGS: -Copt-level=3 -Cdebug-assertions -Coverflow-checks=y -Cdebuginfo=0 -C target-cpu=native RUST_BACKTRACE: 1 @@ -76,7 +76,7 @@ jobs: with: command: test toolchain: nightly-2024-04-17 - args: --release --features groth16 + args: --release --features plonk_bn254 env: RUSTFLAGS: -Copt-level=3 -Cdebug-assertions -Coverflow-checks=y -Cdebuginfo=0 -C target-cpu=native RUST_BACKTRACE: 1 diff --git a/book/SUMMARY.md b/book/SUMMARY.md index 36a380f466..91624caa07 100644 --- a/book/SUMMARY.md +++ b/book/SUMMARY.md @@ -40,4 +40,4 @@ - [Recommended Settings](./developers/recommended-settings.md) -- [Building Groth16 Artifacts](./developers/building-groth16-artifacts.md) \ No newline at end of file +- [Building Plonk Bn254 Artifacts](./developers/building-plonk-artifacts.md) \ No newline at end of file diff --git a/book/developers/building-groth16-artifacts.md b/book/developers/building-groth16-artifacts.md deleted file mode 100644 index beeb20946e..0000000000 --- a/book/developers/building-groth16-artifacts.md +++ /dev/null @@ -1,7 +0,0 @@ -# Building Groth16 Artifacts - -To build the Groth16 artifacts from scratch, you can use the `Makefile` inside the `prover` directory. - -```shell,noplayground -RUST_LOG=info make groth16 -``` \ No newline at end of file diff --git a/book/developers/building-plonk-artifacts.md b/book/developers/building-plonk-artifacts.md new file mode 100644 index 0000000000..9efd9127d0 --- /dev/null +++ b/book/developers/building-plonk-artifacts.md @@ -0,0 +1,7 @@ +# Building Plonk BN254 Artifacts + +To build the Plonk Bn254 artifacts from scratch, you can use the `Makefile` inside the `prover` directory. + +```shell,noplayground +RUST_LOG=info make plonk-bn254 +``` \ No newline at end of file diff --git a/book/developers/recommended-settings.md b/book/developers/recommended-settings.md index 3bbc6c583b..4c03948685 100644 --- a/book/developers/recommended-settings.md +++ b/book/developers/recommended-settings.md @@ -3,4 +3,4 @@ For developers contributing to the SP1 project, we recommend the following settings: - `FRI_QUERIES=1`: Makes the prover use less bits of security to generate proofs more quickly. -- `SP1_DEV=1`: This will rebuild the Groth16 artifacts everytime they are necessary. \ No newline at end of file +- `SP1_DEV=1`: This will rebuild the Plonk Bn254 artifacts everytime they are necessary. \ No newline at end of file diff --git a/book/verifying-proofs/solidity-and-evm.md b/book/verifying-proofs/solidity-and-evm.md index 978248c5e4..117ee69a19 100644 --- a/book/verifying-proofs/solidity-and-evm.md +++ b/book/verifying-proofs/solidity-and-evm.md @@ -3,25 +3,25 @@ SP1 recently added support for verifying proofs for onchain usecases. To see an end-to-end example of using SP1 for on-chain usecases, refer to the [SP1 Project Template](https://github.com/succinctlabs/sp1-project-template/tree/main). -## Generating a Groth16 Proof +## Generating a Plonk Bn254 Proof -By default, the proofs generated by SP1 are not verifiable onchain, as they are non-constant size and STARK verification on Ethereum is very expensive. To generate a proof that can be verified onchain, we use performant STARK recursion to combine SP1 shard proofs into a single STARK proof and then wrap that in a SNARK proof. Our `ProverClient` has a function for this called `prove_groth16`. Behind the scenes, this function will first generate a normal SP1 proof, then recursively combine all of them into a single proof using the STARK recursion protocol. Finally, the proof is wrapped in a SNARK proof using Groth16. +By default, the proofs generated by SP1 are not verifiable onchain, as they are non-constant size and STARK verification on Ethereum is very expensive. To generate a proof that can be verified onchain, we use performant STARK recursion to combine SP1 shard proofs into a single STARK proof and then wrap that in a SNARK proof. Our `ProverClient` has a function for this called `prove_plonk_bn254`. Behind the scenes, this function will first generate a normal SP1 proof, then recursively combine all of them into a single proof using the STARK recursion protocol. Finally, the proof is wrapped in a SNARK proof using PLONK. -**Due to the fact that Groth16 proofs require a trusted setup, the Groth16 prover is only guaranteed to work on official releases of SP1 (i.e., `v.1.0.0-testnet`).** +**Due to the fact that PLONK Bn254 proofs require a trusted setup, the PLONK Bn254 prover is only guaranteed to work on official releases of SP1.** -To use Groth16 proving & verification locally, enable the `groth16` feature flag in the sp1-sdk and ensure that Go >1.22.1 is installed. +To use PLONK proving & verification locally, enable the `plonk_bn254` feature flag in the sp1-sdk and ensure that Go >1.22.1 is installed. ```toml -sp1-sdk = { features = ["groth16"] } +sp1-sdk = { features = ["plonk_bn254"] } ``` ### Example ```rust,noplayground -{{#include ../../examples/fibonacci/script/bin/groth16.rs}} +{{#include ../../examples/fibonacci/script/bin/plonk_bn254.rs}} ``` -You can run the above script with `RUST_LOG=info cargo run --bin groth16 --release` in `examples/fibonacci/script`. +You can run the above script with `RUST_LOG=info cargo run --bin plonk_bn254 --release` in `examples/fibonacci/script`. ## Exporting the Verifier Contract @@ -41,7 +41,7 @@ use std::path::PathBuf; fn main() { let contracts_src_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../contracts/src"); - sp1_sdk::artifacts::export_solidity_groth16_verifier(contracts_src_dir) + sp1_sdk::artifacts::export_solidity_plonk_bn254_verifier(contracts_src_dir) .expect("failed to export verifier"); } ``` \ No newline at end of file diff --git a/core/src/stark/machine.rs b/core/src/stark/machine.rs index 1afff664db..871f7b8e48 100644 --- a/core/src/stark/machine.rs +++ b/core/src/stark/machine.rs @@ -258,7 +258,7 @@ impl>> StarkMachine { // Display some statistics about the workload. let stats = record.stats(); - log::info!("Shard: {:?}", stats); + log::info!("shard: {:?}", stats); // For each chip, shard the events into segments. record.shard(config) @@ -423,12 +423,12 @@ impl>> StarkMachine { let permutation_width = permutation_traces[i].width(); let total_width = trace_width + permutation_width; tracing::debug!( - "{:<11} | Main Cols = {:<5} | Perm Cols = {:<5} | Rows = {:<10} | Cells = {:<10}", - chips[i].name(), - trace_width, - permutation_width, - traces[i].0.height(), - total_width * traces[i].0.height(), + "{:<11} | Main Cols = {:<5} | Perm Cols = {:<5} | Rows = {:<10} | Cells = {:<10}", + chips[i].name(), + trace_width, + permutation_width, + traces[i].0.height(), + total_width * traces[i].0.height(), ); } diff --git a/examples/aggregation/script/Cargo.toml b/examples/aggregation/script/Cargo.toml index 2503e3e380..ae46141d2b 100644 --- a/examples/aggregation/script/Cargo.toml +++ b/examples/aggregation/script/Cargo.toml @@ -6,7 +6,7 @@ default-run = "sp1-aggregation-example-script" [dependencies] hex = "0.4.3" -sp1-sdk = { path = "../../../sdk", features = ["groth16"] } +sp1-sdk = { path = "../../../sdk", features = ["plonk_bn254"] } tracing = "0.1.40" [build-dependencies] diff --git a/examples/aggregation/script/src/main.rs b/examples/aggregation/script/src/main.rs index 7f48d90ed1..5759d64b34 100644 --- a/examples/aggregation/script/src/main.rs +++ b/examples/aggregation/script/src/main.rs @@ -11,7 +11,7 @@ const FIBONACCI_ELF: &[u8] = include_bytes!("../../programs/fibonacci/elf/riscv32im-succinct-zkvm-elf"); /// An input to the aggregation program. -/// +/// /// Consists of a proof and a verification key. struct AggregationInput { pub proof: SP1CompressedProof, @@ -93,9 +93,9 @@ fn main() { stdin.write_proof(input.proof.proof, input.vk.vk); } - // Generate the groth16 proof. + // Generate the plonk bn254 proof. client - .prove_groth16(&aggregation_pk, stdin) + .prove_plonk_bn254(&aggregation_pk, stdin) .expect("proving failed"); - }); + }); } diff --git a/examples/fibonacci/script/Cargo.toml b/examples/fibonacci/script/Cargo.toml index c8c19623f0..5d8bfb0c8b 100644 --- a/examples/fibonacci/script/Cargo.toml +++ b/examples/fibonacci/script/Cargo.toml @@ -13,8 +13,8 @@ sha2 = "0.10.8" sp1-helper = { path = "../../../helper" } [[bin]] -name = "groth16" -path = "bin/groth16.rs" +name = "plonk_bn254" +path = "bin/plonk_bn254.rs" [[bin]] name = "compressed" diff --git a/examples/fibonacci/script/bin/groth16.rs b/examples/fibonacci/script/bin/plonk_bn254.rs similarity index 90% rename from examples/fibonacci/script/bin/groth16.rs rename to examples/fibonacci/script/bin/plonk_bn254.rs index d7fb5f9486..5628b80c48 100644 --- a/examples/fibonacci/script/bin/groth16.rs +++ b/examples/fibonacci/script/bin/plonk_bn254.rs @@ -16,7 +16,7 @@ fn main() { // Generate the proof for the given program and input. let client = ProverClient::new(); let (pk, vk) = client.setup(ELF); - let mut proof = client.prove_groth16(&pk, stdin).unwrap(); + let mut proof = client.prove_plonk_bn254(&pk, stdin).unwrap(); println!("generated proof"); @@ -29,7 +29,7 @@ fn main() { // Verify proof and public values client - .verify_groth16(&proof, &vk) + .verify_plonk_bn254(&proof, &vk) .expect("verification failed"); // Save the proof. diff --git a/prover/Cargo.toml b/prover/Cargo.toml index ac438ded52..42f014de9f 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -45,15 +45,15 @@ num-bigint = "0.4.5" thiserror = "1.0.60" [[bin]] -name = "build_groth16" -path = "scripts/build_groth16.rs" +name = "build_plonk_bn254" +path = "scripts/build_plonk_bn254.rs" [[bin]] name = "e2e" path = "scripts/e2e.rs" [features] -default = ["groth16"] +default = ["plonk_bn254"] neon = ["sp1-core/neon"] -groth16 = ["sp1-recursion-gnark-ffi/groth16"] +plonk_bn254 = ["sp1-recursion-gnark-ffi/plonk_bn254"] diff --git a/prover/Makefile b/prover/Makefile index 249cbce283..0531e8926a 100644 --- a/prover/Makefile +++ b/prover/Makefile @@ -1,37 +1,16 @@ all: - make fibonacci-sweep - make tendermint-sweep - make fibonacci-groth16 + make build-plonk-bn254 + make release-plonk-bn254 -build-groth16: +build-plonk-bn254: mkdir -p build && \ RUSTFLAGS='-C target-cpu=native' \ - cargo run -p sp1-prover --release --bin build_groth16 -- \ + cargo run -p sp1-prover --release --bin build_plonk_bn254 -- \ --build-dir=./build -release-groth16: +release-plonk-bn254: bash release.sh test-e2e: RUSTFLAGS='-C target-cpu=native' \ - cargo test --package sp1-prover --lib --release -- tests::test_e2e --exact --show-output - -fibonacci-sweep: - mkdir -p scripts/results && \ - rm -f scripts/results/fibonacci_sweep.log && \ - RUSTFLAGS='-C target-cpu=native -C target_feature=+avx512ifma,+avx512vl' \ - RUST_LOG=info \ - cargo run --package sp1-prover --release --bin fibonacci_sweep - -tendermint-sweep: - mkdir -p scripts/results && \ - rm -f scripts/results/tendermint_sweep.log && \ - RUSTFLAGS='-C target-cpu=native -C target_feature=+avx512ifma,+avx512vl' \ - RUST_LOG=info \ - cargo run --package sp1-prover --release --bin tendermint_sweep - -fibonacci-groth16: - mkdir -p scripts/results && \ - RUSTFLAGS='-C target-cpu=native -C target_feature=+avx512ifma,+avx512vl' \ - RUST_LOG=info \ - cargo run --package sp1-prover --release --bin fibonacci_groth16 + cargo test --package sp1-prover --lib --release -- tests::test_e2e --exact --show-output \ No newline at end of file diff --git a/prover/release.sh b/prover/release.sh index 1cf390ee96..0d8601c067 100644 --- a/prover/release.sh +++ b/prover/release.sh @@ -21,7 +21,7 @@ fi # Create archive named after the commit hash ARCHIVE_NAME="${COMMIT_HASH}.tar.gz" cd $FILE_TO_UPLOAD -tar -czvf "../$ARCHIVE_NAME" . +tar --exclude='srs.bin' --exclude='srs_lagrange.bin' -czvf "../$ARCHIVE_NAME" . cd - if [ $? -ne 0 ]; then echo "Failed to create archive." diff --git a/prover/scripts/build_groth16.rs b/prover/scripts/build_plonk_bn254.rs similarity index 74% rename from prover/scripts/build_groth16.rs rename to prover/scripts/build_plonk_bn254.rs index b95771e117..66ccb229d3 100644 --- a/prover/scripts/build_groth16.rs +++ b/prover/scripts/build_plonk_bn254.rs @@ -5,7 +5,7 @@ use std::path::PathBuf; use clap::Parser; use sp1_core::utils::setup_logger; -use sp1_prover::build::build_groth16_artifacts_with_dummy; +use sp1_prover::build::build_plonk_bn254_artifacts_with_dummy; #[derive(Parser, Debug)] #[clap(author, version, about, long_about = None)] @@ -17,5 +17,5 @@ struct Args { pub fn main() { setup_logger(); let args = Args::parse(); - build_groth16_artifacts_with_dummy(args.build_dir); + build_plonk_bn254_artifacts_with_dummy(args.build_dir); } diff --git a/prover/scripts/e2e.rs b/prover/scripts/e2e.rs index dfae892795..c4833f2202 100644 --- a/prover/scripts/e2e.rs +++ b/prover/scripts/e2e.rs @@ -14,7 +14,7 @@ use sp1_recursion_circuit::stark::build_wrap_circuit; use sp1_recursion_circuit::witness::Witnessable; use sp1_recursion_compiler::ir::Witness; use sp1_recursion_core::air::RecursionPublicValues; -use sp1_recursion_gnark_ffi::Groth16Prover; +use sp1_recursion_gnark_ffi::PlonkBn254Prover; use subtle_encoding::hex; #[derive(Parser, Debug)] @@ -70,19 +70,19 @@ pub fn main() { witness.write_vkey_hash(vkey_hash); tracing::info!("sanity check gnark test"); - Groth16Prover::test(constraints.clone(), witness.clone()); + PlonkBn254Prover::test(constraints.clone(), witness.clone()); tracing::info!("sanity check gnark build"); - Groth16Prover::build(constraints.clone(), witness.clone(), build_dir.clone()); + PlonkBn254Prover::build(constraints.clone(), witness.clone(), build_dir.clone()); tracing::info!("sanity check gnark prove"); - let groth16_prover = Groth16Prover::new(); + let plonk_bn254_prover = PlonkBn254Prover::new(); tracing::info!("gnark prove"); - let proof = groth16_prover.prove(witness.clone(), build_dir.clone()); + let proof = plonk_bn254_prover.prove(witness.clone(), build_dir.clone()); tracing::info!("verify gnark proof"); - groth16_prover.verify( + plonk_bn254_prover.verify( &proof, &vkey_hash.as_canonical_biguint(), &committed_values_digest.as_canonical_biguint(), diff --git a/prover/scripts/fibonacci_groth16.rs b/prover/scripts/fibonacci_groth16.rs index 2a5fc88d8a..a17b37bb8f 100644 --- a/prover/scripts/fibonacci_groth16.rs +++ b/prover/scripts/fibonacci_groth16.rs @@ -1,4 +1,4 @@ -//! Tests end-to-end performance of wrapping a recursion proof to Groth16. +//! Tests end-to-end performance of wrapping a recursion proof to PLONK. #![feature(generic_const_exprs)] #![allow(incomplete_features)] diff --git a/prover/src/build.rs b/prover/src/build.rs index 8aad92a8d7..bd9ce31180 100644 --- a/prover/src/build.rs +++ b/prover/src/build.rs @@ -10,66 +10,69 @@ pub use sp1_recursion_compiler::ir::Witness; use sp1_recursion_compiler::{config::OuterConfig, constraints::Constraint}; use sp1_recursion_core::air::RecursionPublicValues; pub use sp1_recursion_core::stark::utils::sp1_dev_mode; -use sp1_recursion_gnark_ffi::Groth16Prover; +use sp1_recursion_gnark_ffi::PlonkBn254Prover; -use crate::install::{install_groth16_artifacts, GROTH16_ARTIFACTS_COMMIT}; +use crate::install::{install_plonk_bn254_artifacts, PLONK_BN254_ARTIFACTS_COMMIT}; use crate::utils::{babybear_bytes_to_bn254, babybears_to_bn254, words_to_bytes}; use crate::{OuterSC, SP1Prover}; -/// Tries to install the Groth16 artifacts if they are not already installed. -pub fn try_install_groth16_artifacts() -> PathBuf { - let build_dir = groth16_artifacts_dir(); +/// Tries to install the PLONK artifacts if they are not already installed. +pub fn try_install_plonk_bn254_artifacts() -> PathBuf { + let build_dir = plonk_bn254_artifacts_dir(); if build_dir.exists() { - println!("[sp1] groth16 artifacts already seem to exist at {}. if you want to re-download them, delete the directory", build_dir.display()); + println!( + "[sp1] plonk bn254 artifacts already seem to exist at {}. if you want to re-download them, delete the directory", + build_dir.display() + ); } else { println!( - "[sp1] groth16 artifacts for commit {} do not exist at {}. downloading...", - GROTH16_ARTIFACTS_COMMIT, + "[sp1] plonk bn254 artifacts for commit {} do not exist at {}. downloading...", + PLONK_BN254_ARTIFACTS_COMMIT, build_dir.display() ); - install_groth16_artifacts(build_dir.clone()); + install_plonk_bn254_artifacts(build_dir.clone()); } build_dir } -/// Tries to build the Groth16 artifacts inside the development directory. +/// Tries to build the PLONK artifacts inside the development directory. /// /// TODO: Maybe add some additional logic here to handle rebuilding the artifacts if they are /// already built. -pub fn try_build_groth16_artifacts_dev( +pub fn try_build_plonk_bn254_artifacts_dev( template_vk: &StarkVerifyingKey, template_proof: &ShardProof, ) -> PathBuf { - let build_dir = groth16_artifacts_dev_dir(); - println!("[sp1] building groth16 artifacts in development mode"); - build_groth16_artifacts(template_vk, template_proof, &build_dir); + let build_dir = plonk_bn254_artifacts_dev_dir(); + println!("[sp1] building plonk bn254 artifacts in development mode"); + build_plonk_bn254_artifacts(template_vk, template_proof, &build_dir); build_dir } -/// Gets the directory where the Groth16 artifacts are installed. -pub fn groth16_artifacts_dir() -> PathBuf { +/// Gets the directory where the PLONK artifacts are installed. +pub fn plonk_bn254_artifacts_dir() -> PathBuf { dirs::home_dir() .unwrap() .join(".sp1") .join("circuits") - .join("groth16") - .join(GROTH16_ARTIFACTS_COMMIT) + .join("plonk_bn254") + .join(PLONK_BN254_ARTIFACTS_COMMIT) } -/// Gets the directory where the Groth16 artifacts are installed in development mode. -pub fn groth16_artifacts_dev_dir() -> PathBuf { +/// Gets the directory where the PLONK artifacts are installed in development mode. +pub fn plonk_bn254_artifacts_dev_dir() -> PathBuf { dirs::home_dir() .unwrap() .join(".sp1") .join("circuits") - .join("groth16") + .join("plonk_bn254") .join("dev") } -/// Build the groth16 artifacts to the given directory for the given verification key and template +/// Build the plonk bn254 artifacts to the given directory for the given verification key and template /// proof. -pub fn build_groth16_artifacts( +pub fn build_plonk_bn254_artifacts( template_vk: &StarkVerifyingKey, template_proof: &ShardProof, build_dir: impl Into, @@ -77,16 +80,16 @@ pub fn build_groth16_artifacts( let build_dir = build_dir.into(); std::fs::create_dir_all(&build_dir).expect("failed to create build directory"); let (constraints, witness) = build_constraints_and_witness(template_vk, template_proof); - Groth16Prover::build(constraints, witness, build_dir); + PlonkBn254Prover::build(constraints, witness, build_dir); } -/// Builds the groth16 artifacts to the given directory. +/// Builds the plonk bn254 artifacts to the given directory. /// /// This may take a while as it needs to first generate a dummy proof and then it needs to compile /// the circuit. -pub fn build_groth16_artifacts_with_dummy(build_dir: impl Into) { +pub fn build_plonk_bn254_artifacts_with_dummy(build_dir: impl Into) { let (wrap_vk, wrapped_proof) = dummy_proof(); - crate::build::build_groth16_artifacts(&wrap_vk, &wrapped_proof, build_dir.into()); + crate::build::build_plonk_bn254_artifacts(&wrap_vk, &wrapped_proof, build_dir.into()); } /// Build the verifier constraints and template witness for the circuit. diff --git a/prover/src/install.rs b/prover/src/install.rs index bf271ce4ae..0fa5b34507 100644 --- a/prover/src/install.rs +++ b/prover/src/install.rs @@ -6,24 +6,24 @@ use reqwest::Client; use crate::utils::block_on; -/// The base URL for the S3 bucket containing the groth16 artifacts. -pub const GROTH16_ARTIFACTS_URL_BASE: &str = "https://sp1-circuits.s3-us-east-2.amazonaws.com"; +/// The base URL for the S3 bucket containing the plonk bn254 artifacts. +pub const PLONK_BN254_ARTIFACTS_URL_BASE: &str = "https://sp1-circuits.s3-us-east-2.amazonaws.com"; -/// The current version of the groth16 artifacts. -pub const GROTH16_ARTIFACTS_COMMIT: &str = "9f43e920"; +/// The current version of the plonk bn254 artifacts. +pub const PLONK_BN254_ARTIFACTS_COMMIT: &str = "d7b2513f"; -/// Install the latest groth16 artifacts. +/// Install the latest plonk bn254 artifacts. /// -/// This function will download the latest groth16 artifacts from the S3 bucket and extract them to -/// the directory specified by [groth16_artifacts_dir()]. -pub fn install_groth16_artifacts(build_dir: PathBuf) { +/// This function will download the latest plonk bn254 artifacts from the S3 bucket and extract them to +/// the directory specified by [plonk_bn254_artifacts_dir()]. +pub fn install_plonk_bn254_artifacts(build_dir: PathBuf) { // Create the build directory. std::fs::create_dir_all(&build_dir).expect("failed to create build directory"); // Download the artifacts. let download_url = format!( "{}/{}.tar.gz", - GROTH16_ARTIFACTS_URL_BASE, GROTH16_ARTIFACTS_COMMIT + PLONK_BN254_ARTIFACTS_URL_BASE, PLONK_BN254_ARTIFACTS_COMMIT ); let mut artifacts_tar_gz_file = tempfile::NamedTempFile::new().expect("failed to create tempfile"); @@ -56,14 +56,14 @@ pub fn install_groth16_artifacts(build_dir: PathBuf) { ); } -/// The directory where the groth16 artifacts will be stored based on [GROTH16_ARTIFACTS_VERSION] -/// and [GROTH16_ARTIFACTS_URL_BASE]. -pub fn install_groth16_artifacts_dir() -> PathBuf { +/// The directory where the plonk bn254 artifacts will be stored based on [PLONK_BN254_ARTIFACTS_VERSION] +/// and [PLONK_BN254_ARTIFACTS_URL_BASE]. +pub fn install_plonk_bn254_artifacts_dir() -> PathBuf { dirs::home_dir() .unwrap() .join(".sp1") .join("circuits") - .join(GROTH16_ARTIFACTS_COMMIT) + .join(PLONK_BN254_ARTIFACTS_COMMIT) } /// Download the file with a progress bar that indicates the progress. diff --git a/prover/src/lib.rs b/prover/src/lib.rs index eabd8270ef..0b0ab87f27 100644 --- a/prover/src/lib.rs +++ b/prover/src/lib.rs @@ -5,7 +5,7 @@ //! 1. Generate shard proofs which split up and prove the valid execution of a RISC-V program. //! 2. Compress shard proofs into a single shard proof. //! 3. Wrap the shard proof into a SNARK-friendly field. -//! 4. Wrap the last shard proof, proven over the SNARK-friendly field, into a Groth16/PLONK proof. +//! 4. Wrap the last shard proof, proven over the SNARK-friendly field, into a PLONK proof. #![allow(incomplete_features)] #![feature(generic_const_exprs)] @@ -20,7 +20,7 @@ pub mod verify; use std::borrow::Borrow; use std::env; -use std::path::{Path, PathBuf}; +use std::path::Path; use crate::utils::RECONSTRUCT_COMMITMENTS_ENV_VAR; use p3_baby_bear::BabyBear; @@ -52,8 +52,6 @@ use sp1_recursion_core::{ }; pub use sp1_recursion_gnark_ffi::plonk_bn254::PlonkBn254Proof; use sp1_recursion_gnark_ffi::plonk_bn254::PlonkBn254Prover; -pub use sp1_recursion_gnark_ffi::Groth16Proof; -use sp1_recursion_gnark_ffi::Groth16Prover; use sp1_recursion_program::hints::Hintable; pub use sp1_recursion_program::machine::ReduceProgramType; use sp1_recursion_program::machine::{ @@ -77,7 +75,7 @@ pub type OuterSC = BabyBearPoseidon2Outer; const REDUCE_DEGREE: usize = 3; const COMPRESS_DEGREE: usize = 9; -const WRAP_DEGREE: usize = 5; +const WRAP_DEGREE: usize = 9; pub type ReduceAir = RecursionAir; pub type CompressAir = RecursionAir; @@ -169,7 +167,7 @@ impl SP1Prover { // Get the compress program, machine, and keys. let shrink_program = SP1RootVerifier::::build(&compress_machine, &compress_vk, true); - let shrink_machine = CompressAir::machine(InnerSC::compressed()); + let shrink_machine = CompressAir::wrap_machine_dyn(InnerSC::compressed()); let (shrink_pk, shrink_vk) = shrink_machine.setup(&shrink_program); // Get the wrap program, machine, and keys. @@ -639,9 +637,13 @@ impl SP1Prover { }) } - /// Wrap the STARK proven over a SNARK-friendly field into a Groth16 proof. - #[instrument(name = "wrap_groth16", level = "info", skip_all)] - pub fn wrap_groth16(&self, proof: SP1ReduceProof, build_dir: &Path) -> Groth16Proof { + /// Wrap the STARK proven over a SNARK-friendly field into a PLONK proof. + #[instrument(name = "wrap_plonk_bn254", level = "info", skip_all)] + pub fn wrap_plonk_bn254( + &self, + proof: SP1ReduceProof, + build_dir: &Path, + ) -> PlonkBn254Proof { let vkey_digest = proof.sp1_vkey_digest_bn254(); let commited_values_digest = proof.sp1_commited_values_digest_bn254(); @@ -650,7 +652,7 @@ impl SP1Prover { witness.write_commited_values_digest(commited_values_digest); witness.write_vkey_hash(vkey_digest); - let prover = Groth16Prover::new(); + let prover = PlonkBn254Prover::new(); let proof = prover.prove(witness, build_dir.to_path_buf()); // Verify the proof. @@ -664,13 +666,6 @@ impl SP1Prover { proof } - pub fn wrap_plonk(&self, proof: ShardProof, build_dir: PathBuf) -> PlonkBn254Proof { - let mut witness = Witness::default(); - proof.write(&mut witness); - // TODO: write pv and vkey into witness - PlonkBn254Prover::prove(witness, build_dir) - } - /// Accumulate deferred proofs into a single digest. pub fn hash_deferred_proofs( prev_digest: [Val; DIGEST_SIZE], @@ -696,7 +691,7 @@ mod tests { use std::fs::File; use std::io::{Read, Write}; - use self::build::try_build_groth16_artifacts_dev; + use self::build::try_build_plonk_bn254_artifacts_dev; use super::*; use anyhow::Result; @@ -709,7 +704,7 @@ mod tests { /// pipeline. /// /// Add `FRI_QUERIES`=1 to your environment for faster execution. Should only take a few minutes - /// on a Mac M2. Note: This test always re-builds the groth16 artifacts, so setting SP1_DEV is + /// on a Mac M2. Note: This test always re-builds the plonk bn254 artifacts, so setting SP1_DEV is /// not needed. #[test] #[serial] @@ -769,13 +764,13 @@ mod tests { let vk_digest_bn254 = wrapped_bn254_proof.sp1_vkey_digest_bn254(); assert_eq!(vk_digest_bn254, vk.hash_bn254()); - tracing::info!("generate groth16 proof"); + tracing::info!("generate plonk bn254 proof"); let artifacts_dir = - try_build_groth16_artifacts_dev(&prover.wrap_vk, &wrapped_bn254_proof.proof); - let groth16_proof = prover.wrap_groth16(wrapped_bn254_proof, &artifacts_dir); - println!("{:?}", groth16_proof); + try_build_plonk_bn254_artifacts_dev(&prover.wrap_vk, &wrapped_bn254_proof.proof); + let plonk_bn254_proof = prover.wrap_plonk_bn254(wrapped_bn254_proof, &artifacts_dir); + println!("{:?}", plonk_bn254_proof); - prover.verify_groth16(&groth16_proof, &vk, &public_values, &artifacts_dir)?; + prover.verify_plonk_bn254(&plonk_bn254_proof, &vk, &public_values, &artifacts_dir)?; Ok(()) } diff --git a/prover/src/types.rs b/prover/src/types.rs index 198dc62660..d00f021e63 100644 --- a/prover/src/types.rs +++ b/prover/src/types.rs @@ -15,7 +15,7 @@ use sp1_core::{ }; use sp1_primitives::poseidon2_hash; use sp1_recursion_core::{air::RecursionPublicValues, stark::config::BabyBearPoseidon2Outer}; -use sp1_recursion_gnark_ffi::{plonk_bn254::PlonkBn254Proof, Groth16Proof}; +use sp1_recursion_gnark_ffi::plonk_bn254::PlonkBn254Proof; use thiserror::Error; use crate::utils::words_to_bytes_be; @@ -143,10 +143,10 @@ pub type SP1CoreProof = SP1ProofWithMetadata; /// within SP1 programs. pub type SP1ReducedProof = SP1ProofWithMetadata; -/// An SP1 proof that has been wrapped into a single Groth16 proof and can be verified onchain. -pub type SP1Groth16Proof = SP1ProofWithMetadata; +/// An SP1 proof that has been wrapped into a single PLONK proof and can be verified onchain. +pub type SP1PlonkBn254Proof = SP1ProofWithMetadata; -/// An SP1 proof that has been wrapped into a single Plonk proof and can be verified onchain. +/// An SP1 proof that has been wrapped into a single PLONK proof and can be verified onchain. pub type SP1PlonkProof = SP1ProofWithMetadata; #[derive(Serialize, Deserialize, Clone)] @@ -155,7 +155,7 @@ pub struct SP1CoreProofData(pub Vec>); pub struct SP1ReducedProofData(pub ShardProof); #[derive(Serialize, Deserialize, Clone)] -pub struct SP1Groth16ProofData(pub Groth16Proof); +pub struct SP1PlonkBn254ProofData(pub PlonkBn254Proof); #[derive(Serialize, Deserialize, Clone)] pub struct SP1PlonkProofData(pub PlonkBn254Proof); diff --git a/prover/src/verify.rs b/prover/src/verify.rs index 62f12c7e9b..fedd467cfc 100644 --- a/prover/src/verify.rs +++ b/prover/src/verify.rs @@ -11,7 +11,7 @@ use sp1_core::{ utils::BabyBearPoseidon2, }; use sp1_recursion_core::{air::RecursionPublicValues, stark::config::BabyBearPoseidon2Outer}; -use sp1_recursion_gnark_ffi::{Groth16Proof, Groth16Prover}; +use sp1_recursion_gnark_ffi::{PlonkBn254Proof, PlonkBn254Prover}; use thiserror::Error; use crate::{ @@ -19,10 +19,14 @@ use crate::{ }; #[derive(Error, Debug)] -pub enum Groth16VerificationError { - #[error("the verifying key does not match the inner groth16 proof's committed verifying key")] +pub enum PlonkVerificationError { + #[error( + "the verifying key does not match the inner plonk bn254 proof's committed verifying key" + )] InvalidVerificationKey, - #[error("the public values in the sp1 proof do not match the public values in the inner groth16 proof")] + #[error( + "the public values in the sp1 proof do not match the public values in the inner plonk bn254 proof" + )] InvalidPublicValues, } @@ -212,15 +216,15 @@ impl SP1Prover { Ok(()) } - /// Verifies a Groth16 proof using the circuit artifacts in the build directory. - pub fn verify_groth16( + /// Verifies a PLONK proof using the circuit artifacts in the build directory. + pub fn verify_plonk_bn254( &self, - proof: &Groth16Proof, + proof: &PlonkBn254Proof, vk: &SP1VerifyingKey, public_values: &SP1PublicValues, build_dir: &Path, ) -> Result<()> { - let prover = Groth16Prover::new(); + let prover = PlonkBn254Prover::new(); let vkey_hash = BigUint::from_str(&proof.public_inputs[0])?; let committed_values_digest = BigUint::from_str(&proof.public_inputs[1])?; @@ -228,29 +232,29 @@ impl SP1Prover { // Verify the proof with the corresponding public inputs. prover.verify(proof, &vkey_hash, &committed_values_digest, build_dir); - verify_groth16_public_inputs(vk, public_values, &proof.public_inputs)?; + verify_plonk_bn254_public_inputs(vk, public_values, &proof.public_inputs)?; Ok(()) } } -/// Verify the vk_hash and public_values_hash in the public inputs of the Groth16Proof match the expected values. -pub fn verify_groth16_public_inputs( +/// Verify the vk_hash and public_values_hash in the public inputs of the PlonkBn254Proof match the expected values. +pub fn verify_plonk_bn254_public_inputs( vk: &SP1VerifyingKey, public_values: &SP1PublicValues, - groth16_public_inputs: &[String], + plonk_bn254_public_inputs: &[String], ) -> Result<()> { - let expected_vk_hash = BigUint::from_str(&groth16_public_inputs[0])?; - let expected_public_values_hash = BigUint::from_str(&groth16_public_inputs[1])?; + let expected_vk_hash = BigUint::from_str(&plonk_bn254_public_inputs[0])?; + let expected_public_values_hash = BigUint::from_str(&plonk_bn254_public_inputs[1])?; let vk_hash = vk.hash_bn254().as_canonical_biguint(); if vk_hash != expected_vk_hash { - return Err(Groth16VerificationError::InvalidVerificationKey.into()); + return Err(PlonkVerificationError::InvalidVerificationKey.into()); } let public_values_hash = public_values.hash(); if public_values_hash != expected_public_values_hash { - return Err(Groth16VerificationError::InvalidPublicValues.into()); + return Err(PlonkVerificationError::InvalidPublicValues.into()); } Ok(()) diff --git a/recursion/circuit/src/challenger.rs b/recursion/circuit/src/challenger.rs index 29c4e282aa..b688059dd4 100644 --- a/recursion/circuit/src/challenger.rs +++ b/recursion/circuit/src/challenger.rs @@ -162,7 +162,7 @@ mod tests { use sp1_recursion_compiler::ir::SymbolicExt; use sp1_recursion_compiler::ir::{Builder, Witness}; use sp1_recursion_core::stark::config::{outer_perm, OuterChallenger}; - use sp1_recursion_gnark_ffi::Groth16Prover; + use sp1_recursion_gnark_ffi::PlonkBn254Prover; use super::reduce_32; use super::split_32; @@ -182,7 +182,7 @@ mod tests { let mut backend = ConstraintCompiler::::default(); let constraints = backend.emit(builder.operations); - Groth16Prover::test::(constraints.clone(), Witness::default()); + PlonkBn254Prover::test::(constraints.clone(), Witness::default()); } #[test] @@ -199,7 +199,7 @@ mod tests { let mut backend = ConstraintCompiler::::default(); let constraints = backend.emit(builder.operations); - Groth16Prover::test::(constraints.clone(), Witness::default()); + PlonkBn254Prover::test::(constraints.clone(), Witness::default()); } #[test] @@ -217,7 +217,7 @@ mod tests { let mut backend = ConstraintCompiler::::default(); let constraints = backend.emit(builder.operations); - Groth16Prover::test::(constraints.clone(), Witness::default()); + PlonkBn254Prover::test::(constraints.clone(), Witness::default()); } #[test] @@ -254,7 +254,7 @@ mod tests { let mut backend = ConstraintCompiler::::default(); let constraints = backend.emit(builder.operations); - Groth16Prover::test::(constraints.clone(), Witness::default()); + PlonkBn254Prover::test::(constraints.clone(), Witness::default()); } #[test] @@ -296,6 +296,6 @@ mod tests { let mut backend = ConstraintCompiler::::default(); let constraints = backend.emit(builder.operations); - Groth16Prover::test::(constraints.clone(), Witness::default()); + PlonkBn254Prover::test::(constraints.clone(), Witness::default()); } } diff --git a/recursion/circuit/src/constraints.rs b/recursion/circuit/src/constraints.rs index 1a456cddbc..a4e3142fed 100644 --- a/recursion/circuit/src/constraints.rs +++ b/recursion/circuit/src/constraints.rs @@ -182,7 +182,7 @@ mod tests { runtime::Runtime, stark::{config::BabyBearPoseidon2Outer, RecursionAirWideDeg3}, }; - use sp1_recursion_gnark_ffi::Groth16Prover; + use sp1_recursion_gnark_ffi::PlonkBn254Prover; use crate::stark::{tests::basic_program, StarkVerifierCircuit}; @@ -359,6 +359,6 @@ mod tests { let mut backend = ConstraintCompiler::::default(); let constraints = backend.emit(builder.operations); - Groth16Prover::test::(constraints.clone(), Witness::default()); + PlonkBn254Prover::test::(constraints.clone(), Witness::default()); } } diff --git a/recursion/circuit/src/fri.rs b/recursion/circuit/src/fri.rs index 7814a7d675..151254e2c9 100644 --- a/recursion/circuit/src/fri.rs +++ b/recursion/circuit/src/fri.rs @@ -251,7 +251,7 @@ pub mod tests { outer_perm, test_fri_config, OuterChallenge, OuterChallengeMmcs, OuterChallenger, OuterCompress, OuterDft, OuterFriProof, OuterHash, OuterPcs, OuterVal, OuterValMmcs, }; - use sp1_recursion_gnark_ffi::Groth16Prover; + use sp1_recursion_gnark_ffi::PlonkBn254Prover; use super::{verify_shape_and_sample_challenges, verify_two_adic_pcs, TwoAdicPcsRoundVariable}; use crate::{ @@ -484,7 +484,7 @@ pub mod tests { let mut backend = ConstraintCompiler::::default(); let constraints = backend.emit(builder.operations); - Groth16Prover::test::(constraints.clone(), Witness::default()); + PlonkBn254Prover::test::(constraints.clone(), Witness::default()); } #[test] @@ -557,6 +557,6 @@ pub mod tests { let mut backend = ConstraintCompiler::::default(); let constraints = backend.emit(builder.operations); - Groth16Prover::test::(constraints.clone(), Witness::default()); + PlonkBn254Prover::test::(constraints.clone(), Witness::default()); } } diff --git a/recursion/circuit/src/lib.rs b/recursion/circuit/src/lib.rs index 045edc2770..717e2d4eda 100644 --- a/recursion/circuit/src/lib.rs +++ b/recursion/circuit/src/lib.rs @@ -30,7 +30,7 @@ mod tests { use sp1_recursion_compiler::ir::Ext; use sp1_recursion_compiler::ir::ExtConst; use sp1_recursion_compiler::ir::{Builder, Felt, Witness}; - use sp1_recursion_gnark_ffi::Groth16Prover; + use sp1_recursion_gnark_ffi::PlonkBn254Prover; #[test] fn test_base_babybear() { @@ -68,7 +68,7 @@ mod tests { let constraints = backend.emit(builder.operations); let witness = Witness::default(); - Groth16Prover::test::(constraints.clone(), witness); + PlonkBn254Prover::test::(constraints.clone(), witness); } #[test] @@ -123,7 +123,7 @@ mod tests { let constraints = backend.emit(builder.operations); let witness = Witness::default(); - Groth16Prover::test::(constraints.clone(), witness); + PlonkBn254Prover::test::(constraints.clone(), witness); } #[test] @@ -143,7 +143,7 @@ mod tests { witness.write_vkey_hash(vkey_hash_bn254); witness.write_commited_values_digest(commited_values_digest_bn254); - Groth16Prover::test::(constraints.clone(), witness); + PlonkBn254Prover::test::(constraints.clone(), witness); } #[test] @@ -163,7 +163,7 @@ mod tests { let mut witness = Witness::default(); witness.write_commited_values_digest(commited_values_digest_bn254); - Groth16Prover::test::(constraints.clone(), witness); + PlonkBn254Prover::test::(constraints.clone(), witness); } #[test] @@ -183,6 +183,6 @@ mod tests { let mut witness = Witness::default(); witness.write_vkey_hash(vkey_hash_bn254); - Groth16Prover::test::(constraints.clone(), witness); + PlonkBn254Prover::test::(constraints.clone(), witness); } } diff --git a/recursion/circuit/src/poseidon2.rs b/recursion/circuit/src/poseidon2.rs index 7be8ab02c1..a5a8cc1136 100644 --- a/recursion/circuit/src/poseidon2.rs +++ b/recursion/circuit/src/poseidon2.rs @@ -64,7 +64,7 @@ pub mod tests { use sp1_recursion_compiler::constraints::ConstraintCompiler; use sp1_recursion_compiler::ir::{Builder, Felt, Var, Witness}; use sp1_recursion_core::stark::config::{outer_perm, OuterCompress, OuterHash}; - use sp1_recursion_gnark_ffi::Groth16Prover; + use sp1_recursion_gnark_ffi::PlonkBn254Prover; use crate::poseidon2::Poseidon2CircuitBuilder; use crate::types::OuterDigestVariable; @@ -92,7 +92,7 @@ pub mod tests { let mut backend = ConstraintCompiler::::default(); let constraints = backend.emit(builder.operations); - Groth16Prover::test::(constraints.clone(), Witness::default()); + PlonkBn254Prover::test::(constraints.clone(), Witness::default()); } #[test] @@ -125,7 +125,7 @@ pub mod tests { let mut backend = ConstraintCompiler::::default(); let constraints = backend.emit(builder.operations); - Groth16Prover::test::(constraints.clone(), Witness::default()); + PlonkBn254Prover::test::(constraints.clone(), Witness::default()); } #[test] @@ -145,6 +145,6 @@ pub mod tests { let mut backend = ConstraintCompiler::::default(); let constraints = backend.emit(builder.operations); - Groth16Prover::test::(constraints.clone(), Witness::default()); + PlonkBn254Prover::test::(constraints.clone(), Witness::default()); } } diff --git a/recursion/circuit/src/stark.rs b/recursion/circuit/src/stark.rs index 3d4c31d1a5..9ffc85d0e8 100644 --- a/recursion/circuit/src/stark.rs +++ b/recursion/circuit/src/stark.rs @@ -22,7 +22,7 @@ use sp1_recursion_compiler::ir::{Usize, Witness}; use sp1_recursion_compiler::prelude::SymbolicVar; use sp1_recursion_core::air::RecursionPublicValues; use sp1_recursion_core::stark::config::{outer_fri_config, BabyBearPoseidon2Outer}; -use sp1_recursion_core::stark::RecursionAirSkinnyDeg7; +use sp1_recursion_core::stark::RecursionAirSkinnyDeg9; use sp1_recursion_program::commit::PolynomialSpaceVariable; use sp1_recursion_program::stark::RecursiveVerifierConstraintFolder; use sp1_recursion_program::types::QuotientDataValues; @@ -243,7 +243,7 @@ pub fn build_wrap_circuit( template_proof: ShardProof, ) -> Vec { let outer_config = OuterSC::new(); - let outer_machine = RecursionAirSkinnyDeg7::::wrap_machine(outer_config); + let outer_machine = RecursionAirSkinnyDeg9::::wrap_machine(outer_config); let mut builder = Builder::::default(); let mut challenger = MultiField32ChallengerVariable::new(&mut builder); diff --git a/recursion/circuit/src/witness.rs b/recursion/circuit/src/witness.rs index 1217748ace..19046624f2 100644 --- a/recursion/circuit/src/witness.rs +++ b/recursion/circuit/src/witness.rs @@ -336,7 +336,7 @@ mod tests { ir::{Builder, ExtConst, Witness}, }; use sp1_recursion_core::stark::config::OuterChallenge; - use sp1_recursion_gnark_ffi::Groth16Prover; + use sp1_recursion_gnark_ffi::PlonkBn254Prover; #[test] fn test_witness_simple() { @@ -364,7 +364,7 @@ mod tests { let mut backend = ConstraintCompiler::::default(); let constraints = backend.emit(builder.operations); - Groth16Prover::test::( + PlonkBn254Prover::test::( constraints, Witness { vars: vec![Bn254Fr::one(), Bn254Fr::two()], diff --git a/recursion/compiler/src/constraints/mod.rs b/recursion/compiler/src/constraints/mod.rs index 4ac11438ac..c5c67647a9 100644 --- a/recursion/compiler/src/constraints/mod.rs +++ b/recursion/compiler/src/constraints/mod.rs @@ -1,4 +1,3 @@ -// pub mod groth16_ffi; pub mod opcodes; use core::fmt::Debug; diff --git a/recursion/core/src/cpu/air/alu.rs b/recursion/core/src/cpu/air/alu.rs index 61c34e91c3..377fc4fe82 100644 --- a/recursion/core/src/cpu/air/alu.rs +++ b/recursion/core/src/cpu/air/alu.rs @@ -8,7 +8,7 @@ use crate::{ memory::MemoryCols, }; -impl CpuChip { +impl CpuChip { /// Eval the ALU instructions. pub fn eval_alu(&self, builder: &mut AB, local: &CpuCols) where diff --git a/recursion/core/src/cpu/air/branch.rs b/recursion/core/src/cpu/air/branch.rs index d97e6653e5..91bebfa65e 100644 --- a/recursion/core/src/cpu/air/branch.rs +++ b/recursion/core/src/cpu/air/branch.rs @@ -8,7 +8,7 @@ use crate::{ memory::MemoryCols, }; -impl CpuChip { +impl CpuChip { /// Eval the BRANCH operations. pub fn eval_branch( &self, diff --git a/recursion/core/src/cpu/air/heap.rs b/recursion/core/src/cpu/air/heap.rs index 4ec656a89e..170f3246f9 100644 --- a/recursion/core/src/cpu/air/heap.rs +++ b/recursion/core/src/cpu/air/heap.rs @@ -7,7 +7,7 @@ use crate::{ runtime::HEAP_START_ADDRESS, }; -impl CpuChip { +impl CpuChip { /// Eval the heap ptr. ///s /// This function will ensure that the heap size never goes above 2^28. diff --git a/recursion/core/src/cpu/air/jump.rs b/recursion/core/src/cpu/air/jump.rs index 7accec831f..bf86a70cce 100644 --- a/recursion/core/src/cpu/air/jump.rs +++ b/recursion/core/src/cpu/air/jump.rs @@ -8,7 +8,7 @@ use crate::{ runtime::STACK_SIZE, }; -impl CpuChip { +impl CpuChip { /// Eval the JUMP instructions. /// /// This method will verify the fp column values and add to the `next_pc` expression. diff --git a/recursion/core/src/cpu/air/memory.rs b/recursion/core/src/cpu/air/memory.rs index fa3085fe5f..c0a3a2b639 100644 --- a/recursion/core/src/cpu/air/memory.rs +++ b/recursion/core/src/cpu/air/memory.rs @@ -8,7 +8,7 @@ use crate::{ memory::MemoryCols, }; -impl CpuChip { +impl CpuChip { // Eval the MEMORY instructions. pub fn eval_memory(&self, builder: &mut AB, local: &CpuCols) where diff --git a/recursion/core/src/cpu/air/mod.rs b/recursion/core/src/cpu/air/mod.rs index a817ea2886..28343367c8 100644 --- a/recursion/core/src/cpu/air/mod.rs +++ b/recursion/core/src/cpu/air/mod.rs @@ -20,7 +20,7 @@ use crate::{ memory::MemoryCols, }; -impl Air for CpuChip +impl Air for CpuChip where AB: SP1RecursionAirBuilder, { @@ -95,10 +95,17 @@ where // Constrain the is_real_flag. self.eval_is_real(builder, local, next); + + // Create a dummy constraint of the given degree to compress the permutation columns. + let mut expr = local.is_real * local.is_real; + for _ in 0..(L - 2) { + expr *= local.is_real.into(); + } + builder.assert_eq(expr.clone(), expr.clone()); } } -impl CpuChip { +impl CpuChip { /// Eval the clk. /// /// For all instructions except for FRI fold, the next clk is the current clk + 4. diff --git a/recursion/core/src/cpu/air/operands.rs b/recursion/core/src/cpu/air/operands.rs index 9b45abb02b..e67cea6dd1 100644 --- a/recursion/core/src/cpu/air/operands.rs +++ b/recursion/core/src/cpu/air/operands.rs @@ -7,7 +7,7 @@ use crate::{ memory::MemoryCols, }; -impl CpuChip { +impl CpuChip { /// Eval the operands. pub fn eval_operands(&self, builder: &mut AB, local: &CpuCols) where diff --git a/recursion/core/src/cpu/air/public_values.rs b/recursion/core/src/cpu/air/public_values.rs index 4f1a9c924c..15a23828f9 100644 --- a/recursion/core/src/cpu/air/public_values.rs +++ b/recursion/core/src/cpu/air/public_values.rs @@ -8,7 +8,7 @@ use crate::{ runtime::DIGEST_SIZE, }; -impl CpuChip { +impl CpuChip { /// Eval the COMMIT instructions. /// /// This method will verify the committed public value. diff --git a/recursion/core/src/cpu/air/system.rs b/recursion/core/src/cpu/air/system.rs index f7809ffdec..db20bf201e 100644 --- a/recursion/core/src/cpu/air/system.rs +++ b/recursion/core/src/cpu/air/system.rs @@ -7,7 +7,7 @@ use crate::{ cpu::{CpuChip, CpuCols}, }; -impl CpuChip { +impl CpuChip { /// Eval the system instructions (TRAP, HALT). pub fn eval_system_instructions( &self, diff --git a/recursion/core/src/cpu/columns/mod.rs b/recursion/core/src/cpu/columns/mod.rs index c5b863a202..5655a9661a 100644 --- a/recursion/core/src/cpu/columns/mod.rs +++ b/recursion/core/src/cpu/columns/mod.rs @@ -30,7 +30,7 @@ const fn make_col_map() -> CpuCols { pub(crate) const CPU_COL_MAP: CpuCols = make_col_map(); -impl BaseAir for CpuChip { +impl BaseAir for CpuChip { fn width(&self) -> usize { NUM_CPU_COLS } diff --git a/recursion/core/src/cpu/mod.rs b/recursion/core/src/cpu/mod.rs index 17a5d296e3..2b866b7819 100644 --- a/recursion/core/src/cpu/mod.rs +++ b/recursion/core/src/cpu/mod.rs @@ -23,7 +23,7 @@ pub struct CpuEvent { } #[derive(Default)] -pub struct CpuChip { +pub struct CpuChip { pub fixed_log2_rows: Option, pub _phantom: std::marker::PhantomData, } diff --git a/recursion/core/src/cpu/trace.rs b/recursion/core/src/cpu/trace.rs index 4ee78b9e42..c07a355d04 100644 --- a/recursion/core/src/cpu/trace.rs +++ b/recursion/core/src/cpu/trace.rs @@ -19,7 +19,7 @@ use crate::{ use super::{CpuChip, CpuCols, CPU_COL_MAP, NUM_CPU_COLS}; -impl> MachineAir for CpuChip { +impl, const L: usize> MachineAir for CpuChip { type Record = ExecutionRecord; type Program = RecursionProgram; diff --git a/recursion/core/src/multi/mod.rs b/recursion/core/src/multi/mod.rs index f0acb982ce..cbef76bc41 100644 --- a/recursion/core/src/multi/mod.rs +++ b/recursion/core/src/multi/mod.rs @@ -125,6 +125,13 @@ where let local: &MultiCols = (*local).borrow(); let next: &MultiCols = (*next).borrow(); + // Add some dummy constraints to compress the interactions. + let mut expr = local.is_fri_fold * local.is_fri_fold; + for _ in 0..(DEGREE - 2) { + expr *= local.is_fri_fold.into(); + } + builder.assert_eq(expr.clone(), expr.clone()); + let next_is_real = next.is_fri_fold + next.is_poseidon2; let local_is_real = local.is_fri_fold + local.is_poseidon2; diff --git a/recursion/core/src/poseidon2/columns.rs b/recursion/core/src/poseidon2/columns.rs index 9322c5d809..12fa730477 100644 --- a/recursion/core/src/poseidon2/columns.rs +++ b/recursion/core/src/poseidon2/columns.rs @@ -45,7 +45,6 @@ impl RoundSpecificCols { pub struct ComputationCols { pub input: [T; WIDTH], pub add_rc: [T; WIDTH], - pub sbox_deg_3: [T; WIDTH], pub sbox_deg_7: [T; WIDTH], pub output: [T; WIDTH], } diff --git a/recursion/core/src/poseidon2/external.rs b/recursion/core/src/poseidon2/external.rs index 33bd225f57..d41c5f800b 100644 --- a/recursion/core/src/poseidon2/external.rs +++ b/recursion/core/src/poseidon2/external.rs @@ -196,12 +196,7 @@ impl Poseidon2Chip { let sbox_deg_3 = computation_cols.add_rc[i] * computation_cols.add_rc[i] * computation_cols.add_rc[i]; - builder - .when(is_initial.clone() + is_external_layer.clone() + is_internal_layer.clone()) - .assert_eq(sbox_deg_3, computation_cols.sbox_deg_3[i]); - let sbox_deg_7 = computation_cols.sbox_deg_3[i] - * computation_cols.sbox_deg_3[i] - * computation_cols.add_rc[i]; + let sbox_deg_7 = sbox_deg_3.clone() * sbox_deg_3.clone() * computation_cols.add_rc[i]; builder .when(is_initial.clone() + is_external_layer.clone() + is_internal_layer.clone()) .assert_eq(sbox_deg_7, computation_cols.sbox_deg_7[i]); diff --git a/recursion/core/src/poseidon2/trace.rs b/recursion/core/src/poseidon2/trace.rs index 619c8c7743..cc6a41d94f 100644 --- a/recursion/core/src/poseidon2/trace.rs +++ b/recursion/core/src/poseidon2/trace.rs @@ -128,12 +128,11 @@ impl MachineAir for Poseidon2Chip { // Apply the sbox. for j in 0..WIDTH { - computation_cols.sbox_deg_3[j] = computation_cols.add_rc[j] + let sbox_deg_3 = computation_cols.add_rc[j] * computation_cols.add_rc[j] * computation_cols.add_rc[j]; - computation_cols.sbox_deg_7[j] = computation_cols.sbox_deg_3[j] - * computation_cols.sbox_deg_3[j] - * computation_cols.add_rc[j]; + computation_cols.sbox_deg_7[j] = + sbox_deg_3 * sbox_deg_3 * computation_cols.add_rc[j]; } // What state to use for the linear layer. diff --git a/recursion/core/src/poseidon2_wide/external.rs b/recursion/core/src/poseidon2_wide/external.rs index 5438e81be7..6fb3bc870e 100644 --- a/recursion/core/src/poseidon2_wide/external.rs +++ b/recursion/core/src/poseidon2_wide/external.rs @@ -440,6 +440,13 @@ where for r in NUM_EXTERNAL_ROUNDS / 2..NUM_EXTERNAL_ROUNDS { eval_external_round(builder, &cols, r, memory.is_real); } + + // Make the degree equivalent to WIDTH to compress the interaction columns. + let mut dummy = memory.is_real * memory.is_real; + for _ in 0..(DEGREE - 2) { + dummy *= memory.is_real.into(); + } + builder.assert_eq(dummy.clone(), dummy.clone()); } } diff --git a/recursion/core/src/stark/config.rs b/recursion/core/src/stark/config.rs index a1b3a22391..2a774ec437 100644 --- a/recursion/core/src/stark/config.rs +++ b/recursion/core/src/stark/config.rs @@ -74,11 +74,11 @@ pub fn outer_fri_config() -> FriConfig { } else { match std::env::var("FRI_QUERIES") { Ok(value) => value.parse().unwrap(), - Err(_) => 50, + Err(_) => 25, } }; FriConfig { - log_blowup: 2, + log_blowup: 4, num_queries, proof_of_work_bits: 16, mmcs: challenge_mmcs, diff --git a/recursion/core/src/stark/mod.rs b/recursion/core/src/stark/mod.rs index 7981c77ed8..540dcb613b 100644 --- a/recursion/core/src/stark/mod.rs +++ b/recursion/core/src/stark/mod.rs @@ -16,7 +16,7 @@ use std::marker::PhantomData; use crate::runtime::D; pub type RecursionAirWideDeg3 = RecursionAir; -pub type RecursionAirSkinnyDeg7 = RecursionAir; +pub type RecursionAirSkinnyDeg9 = RecursionAir; #[derive(MachineAir)] #[sp1_core_path = "sp1_core"] @@ -25,7 +25,7 @@ pub type RecursionAirSkinnyDeg7 = RecursionAir; #[builder_path = "crate::air::SP1RecursionAirBuilder"] pub enum RecursionAir, const DEGREE: usize> { Program(ProgramChip), - Cpu(CpuChip), + Cpu(CpuChip), MemoryGlobal(MemoryGlobalChip), Poseidon2Wide(Poseidon2WideChip), Poseidon2Skinny(Poseidon2Chip), @@ -53,6 +53,15 @@ impl, const DEGREE: usize> RecursionAi StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS) } + /// A recursion machine with fixed trace sizes tuned to work specifically for the wrap layer. + pub fn wrap_machine_dyn>(config: SC) -> StarkMachine { + let chips = Self::get_wrap_dyn_all() + .into_iter() + .map(Chip::new) + .collect::>(); + StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS) + } + pub fn get_all() -> Vec { once(RecursionAir::Program(ProgramChip)) .chain(once(RecursionAir::Cpu(CpuChip { @@ -74,14 +83,30 @@ impl, const DEGREE: usize> RecursionAi .collect() } - pub fn get_wrap_all() -> Vec { + pub fn get_wrap_dyn_all() -> Vec { once(RecursionAir::Program(ProgramChip)) .chain(once(RecursionAir::Cpu(CpuChip { - fixed_log2_rows: Some(21), + fixed_log2_rows: None, _phantom: PhantomData, }))) .chain(once(RecursionAir::MemoryGlobal(MemoryGlobalChip { + fixed_log2_rows: None, + }))) + .chain(once(RecursionAir::Multi(MultiChip { + fixed_log2_rows: None, + }))) + .chain(once(RecursionAir::RangeCheck(RangeCheckChip::default()))) + .collect() + } + + pub fn get_wrap_all() -> Vec { + once(RecursionAir::Program(ProgramChip)) + .chain(once(RecursionAir::Cpu(CpuChip { fixed_log2_rows: Some(20), + _phantom: PhantomData, + }))) + .chain(once(RecursionAir::MemoryGlobal(MemoryGlobalChip { + fixed_log2_rows: Some(19), }))) .chain(once(RecursionAir::Multi(MultiChip { fixed_log2_rows: Some(20), diff --git a/recursion/core/src/stark/utils.rs b/recursion/core/src/stark/utils.rs index 9321d82288..15c642c046 100644 --- a/recursion/core/src/stark/utils.rs +++ b/recursion/core/src/stark/utils.rs @@ -7,7 +7,7 @@ use crate::air::Block; use crate::runtime::RecursionProgram; use crate::runtime::Runtime; use crate::stark::RecursionAir; -use crate::stark::RecursionAirSkinnyDeg7; +use crate::stark::RecursionAirSkinnyDeg9; use p3_field::PrimeField32; use sp1_core::utils::run_test_machine; use std::collections::VecDeque; @@ -54,7 +54,7 @@ pub fn run_test_recursion( } if test_config == TestConfig::All || test_config == TestConfig::SkinnyDeg7 { - let machine = RecursionAirSkinnyDeg7::machine(BabyBearPoseidon2::compressed()); + let machine = RecursionAirSkinnyDeg9::machine(BabyBearPoseidon2::compressed()); let (pk, vk) = machine.setup(&program); let record = runtime.record.clone(); let result = run_test_machine(record, machine, pk, vk); @@ -64,7 +64,7 @@ pub fn run_test_recursion( } if test_config == TestConfig::All || test_config == TestConfig::SkinnyDeg7Wrap { - let machine = RecursionAirSkinnyDeg7::wrap_machine(BabyBearPoseidon2::compressed()); + let machine = RecursionAirSkinnyDeg9::wrap_machine(BabyBearPoseidon2::compressed()); let (pk, vk) = machine.setup(&program); let record = runtime.record.clone(); let result = run_test_machine(record, machine, pk, vk); @@ -77,7 +77,7 @@ pub fn run_test_recursion( /// Returns whether the `SP1_DEV` environment variable is enabled or disabled. /// /// This variable controls whether a smaller version of the circuit will be used for generating the -/// Groth16 proofs. This is useful for development and testing purposes. +/// PLONK proofs. This is useful for development and testing purposes. /// /// By default, the variable is disabled. pub fn sp1_dev_mode() -> bool { diff --git a/recursion/gnark-ffi/Cargo.toml b/recursion/gnark-ffi/Cargo.toml index d35800008a..cc3373baea 100644 --- a/recursion/gnark-ffi/Cargo.toml +++ b/recursion/gnark-ffi/Cargo.toml @@ -21,6 +21,6 @@ cc = "1.0" cfg-if = "1.0" [features] -default = ["groth16"] +default = ["plonk_bn254"] -groth16 = [] +plonk_bn254 = [] diff --git a/recursion/gnark-ffi/assets/SP1Verifier.txt b/recursion/gnark-ffi/assets/SP1Verifier.txt index ee45f9e984..a63e12c6ae 100644 --- a/recursion/gnark-ffi/assets/SP1Verifier.txt +++ b/recursion/gnark-ffi/assets/SP1Verifier.txt @@ -2,64 +2,7 @@ /// @title SP1 Verifier /// @author Succinct Labs /// @notice This contracts implements a solidity verifier for SP1. -contract SP1Verifier is Verifier { - /// @notice Deserializes a proof from the given bytes. - /// @param proofBytes The proof bytes. - function deserializeProof( - bytes memory proofBytes - ) - public - pure - returns ( - uint256[8] memory proof, - uint256[2] memory commitments, - uint256[2] memory commitmentPok - ) - { - require( - proofBytes.length == 8 * 32 + 4 + 2 * 32 + 2 * 32, - "invalid proof bytes length" - ); - - uint256 offset = 32; - for (uint256 i = 0; i < 8; i++) { - assembly { - mstore( - add(proof, add(0, mul(32, i))), - mload(add(proofBytes, add(offset, mul(32, i)))) - ) - } - } - - uint32 commitmentCount; - offset += 8 * 32; - assembly { - let dataLocation := add(proofBytes, offset) - let loadedData := mload(dataLocation) - commitmentCount := and(shr(224, loadedData), 0xFFFFFFFF) - } - - offset += 4; - for (uint256 i = 0; i < 2; i++) { - assembly { - mstore( - add(commitments, add(0, mul(32, i))), - mload(add(proofBytes, add(offset, mul(32, i)))) - ) - } - } - - offset += 2 * 32; - for (uint256 i = 0; i < 2; i++) { - assembly { - mstore( - add(commitmentPok, add(0, mul(32, i))), - mload(add(proofBytes, add(offset, mul(32, i)))) - ) - } - } - } - +contract SP1Verifier is PlonkVerifier { /// @notice Hashes the public values to a field elements inside Bn254. /// @param publicValues The public values. function hashPublicValues( @@ -77,16 +20,10 @@ contract SP1Verifier is Verifier { bytes memory publicValues, bytes memory proofBytes ) public view { - ( - uint256[8] memory proof, - uint256[2] memory commitments, - uint256[2] memory commitmentPok - ) = deserializeProof(proofBytes); bytes32 publicValuesDigest = hashPublicValues(publicValues); - uint256[2] memory inputs = [ - uint256(vkey), - uint256(publicValuesDigest) - ]; - this.verifyProof(proof, commitments, commitmentPok, inputs); + uint256[] memory inputs = new uint256[](2); + inputs[0] = uint256(vkey); + inputs[1] = uint256(publicValuesDigest); + this.Verify(proofBytes, inputs); } -} +} \ No newline at end of file diff --git a/recursion/gnark-ffi/build.rs b/recursion/gnark-ffi/build.rs index 83cfd9a158..fae3c68ed3 100644 --- a/recursion/gnark-ffi/build.rs +++ b/recursion/gnark-ffi/build.rs @@ -9,7 +9,7 @@ use bindgen::CargoCallbacks; /// Build the go library, generate Rust bindings for the exposed functions, and link the library. fn main() { cfg_if! { - if #[cfg(feature = "groth16")] { + if #[cfg(feature = "plonk_bn254")] { println!("cargo:rerun-if-changed=go"); // Define the output directory let out_dir = env::var("OUT_DIR").unwrap(); diff --git a/recursion/gnark-ffi/go/go.mod b/recursion/gnark-ffi/go/go.mod index 8cfcfd6d7e..505279b9dc 100644 --- a/recursion/gnark-ffi/go/go.mod +++ b/recursion/gnark-ffi/go/go.mod @@ -12,6 +12,7 @@ require ( github.com/bits-and-blooms/bitset v1.8.0 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-ignition-verifier v0.0.0-20230527014722-10693546ab33 github.com/davecgh/go-spew v1.1.1 // indirect github.com/fxamacker/cbor/v2 v2.5.0 // indirect github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b // indirect diff --git a/recursion/gnark-ffi/go/go.sum b/recursion/gnark-ffi/go/go.sum index a2d96911cf..1cba1df674 100644 --- a/recursion/gnark-ffi/go/go.sum +++ b/recursion/gnark-ffi/go/go.sum @@ -8,6 +8,8 @@ github.com/consensys/gnark v0.10.1-0.20240504023521-d9bfacd7cb60 h1:+m2KO2BeqBkH github.com/consensys/gnark v0.10.1-0.20240504023521-d9bfacd7cb60/go.mod h1:DU7zXvIuOqheiS3EgVdD7ydbXDiLh71FkaArWPxwJqY= github.com/consensys/gnark-crypto v0.12.2-0.20240504013751-564b6f724c3b h1:tu0NaVr64o6vXzy9rYSK/LCZXmS+u/k9eP1F8OtRUWQ= github.com/consensys/gnark-crypto v0.12.2-0.20240504013751-564b6f724c3b/go.mod h1:wKqwsieaKPThcFkHe0d0zMsbHEUWFmZcG7KBCse210o= +github.com/consensys/gnark-ignition-verifier v0.0.0-20230527014722-10693546ab33 h1:z42ewLaLxoTYeQ17arcF4WExZc/eSaN3YVlF7eEaPt4= +github.com/consensys/gnark-ignition-verifier v0.0.0-20230527014722-10693546ab33/go.mod h1:JdKor28c/KR4BbznP88bz8AAvnCgovzrB3KWsiR7lwk= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= diff --git a/recursion/gnark-ffi/go/main.go b/recursion/gnark-ffi/go/main.go index 7e842d3d75..89bba4a7e8 100644 --- a/recursion/gnark-ffi/go/main.go +++ b/recursion/gnark-ffi/go/main.go @@ -7,7 +7,7 @@ typedef struct { char *PublicInputs[2]; char *EncodedProof; char *RawProof; -} C_Groth16Proof; +} C_PlonkBn254Proof; */ import "C" import ( @@ -17,50 +17,51 @@ import ( "sync" "github.com/consensys/gnark-crypto/ecc" - "github.com/consensys/gnark/backend/groth16" + "github.com/consensys/gnark/backend/plonk" "github.com/consensys/gnark/frontend" - "github.com/consensys/gnark/frontend/cs/r1cs" + "github.com/consensys/gnark/frontend/cs/scs" + "github.com/consensys/gnark/test/unsafekzg" "github.com/succinctlabs/sp1-recursion-gnark/sp1" ) func main() {} -//export ProveGroth16 -func ProveGroth16(dataDir *C.char, witnessPath *C.char) *C.C_Groth16Proof { +//export ProvePlonkBn254 +func ProvePlonkBn254(dataDir *C.char, witnessPath *C.char) *C.C_PlonkBn254Proof { dataDirString := C.GoString(dataDir) witnessPathString := C.GoString(witnessPath) - sp1Groth16Proof := sp1.ProveGroth16(dataDirString, witnessPathString) + sp1PlonkBn254Proof := sp1.Prove(dataDirString, witnessPathString) - ms := C.malloc(C.sizeof_C_Groth16Proof) + ms := C.malloc(C.sizeof_C_PlonkBn254Proof) if ms == nil { return nil } - structPtr := (*C.C_Groth16Proof)(ms) - structPtr.PublicInputs[0] = C.CString(sp1Groth16Proof.PublicInputs[0]) - structPtr.PublicInputs[1] = C.CString(sp1Groth16Proof.PublicInputs[1]) - structPtr.EncodedProof = C.CString(sp1Groth16Proof.EncodedProof) - structPtr.RawProof = C.CString(sp1Groth16Proof.RawProof) + structPtr := (*C.C_PlonkBn254Proof)(ms) + structPtr.PublicInputs[0] = C.CString(sp1PlonkBn254Proof.PublicInputs[0]) + structPtr.PublicInputs[1] = C.CString(sp1PlonkBn254Proof.PublicInputs[1]) + structPtr.EncodedProof = C.CString(sp1PlonkBn254Proof.EncodedProof) + structPtr.RawProof = C.CString(sp1PlonkBn254Proof.RawProof) return structPtr } -//export BuildGroth16 -func BuildGroth16(dataDir *C.char) { +//export BuildPlonkBn254 +func BuildPlonkBn254(dataDir *C.char) { // Sanity check the required arguments have been provided. dataDirString := C.GoString(dataDir) - sp1.BuildGroth16(dataDirString) + sp1.Build(dataDirString) } -//export VerifyGroth16 -func VerifyGroth16(dataDir *C.char, proof *C.char, vkeyHash *C.char, commitedValuesDigest *C.char) *C.char { +//export VerifyPlonkBn254 +func VerifyPlonkBn254(dataDir *C.char, proof *C.char, vkeyHash *C.char, commitedValuesDigest *C.char) *C.char { dataDirString := C.GoString(dataDir) proofString := C.GoString(proof) vkeyHashString := C.GoString(vkeyHash) commitedValuesDigestString := C.GoString(commitedValuesDigest) - err := sp1.VerifyGroth16(dataDirString, proofString, vkeyHashString, commitedValuesDigestString) + err := sp1.Verify(dataDirString, proofString, vkeyHashString, commitedValuesDigestString) if err != nil { return C.CString(err.Error()) } @@ -69,8 +70,8 @@ func VerifyGroth16(dataDir *C.char, proof *C.char, vkeyHash *C.char, commitedVal var testMutex = &sync.Mutex{} -//export TestGroth16 -func TestGroth16(witnessPath *C.char, constraintsJson *C.char) *C.char { +//export TestPlonkBn254 +func TestPlonkBn254(witnessPath *C.char, constraintsJson *C.char) *C.char { // Because of the global env variables used here, we need to lock this function testMutex.Lock() witnessPathString := C.GoString(witnessPath) @@ -107,16 +108,20 @@ func TestMain() error { // Compile the circuit. circuit := sp1.NewCircuit(inputs) - builder := r1cs.NewBuilder - r1cs, err := frontend.Compile(ecc.BN254.ScalarField(), builder, &circuit) + builder := scs.NewBuilder + scs, err := frontend.Compile(ecc.BN254.ScalarField(), builder, &circuit) if err != nil { return err } - fmt.Println("[sp1] groth16 verifier constraints:", r1cs.GetNbConstraints()) + fmt.Println("[sp1] gnark verifier constraints:", scs.GetNbConstraints()) // Run the dummy setup. - var pk groth16.ProvingKey - pk, err = groth16.DummySetup(r1cs) + srs, srsLagrange, err := unsafekzg.NewSRS(scs) + if err != nil { + return err + } + var pk plonk.ProvingKey + pk, _, err = plonk.Setup(scs, srs, srsLagrange) if err != nil { return err } @@ -129,7 +134,7 @@ func TestMain() error { } // Generate the proof. - _, err = groth16.Prove(r1cs, pk, witness) + _, err = plonk.Prove(scs, pk, witness) if err != nil { return err } diff --git a/recursion/gnark-ffi/go/sp1/build.go b/recursion/gnark-ffi/go/sp1/build.go index ccbfb5449d..1ea42404da 100644 --- a/recursion/gnark-ffi/go/sp1/build.go +++ b/recursion/gnark-ffi/go/sp1/build.go @@ -1,19 +1,22 @@ package sp1 import ( - "crypto/sha256" "encoding/json" + "fmt" + "log" "os" + "strings" "github.com/consensys/gnark-crypto/ecc" - "github.com/consensys/gnark/backend" - "github.com/consensys/gnark/backend/groth16" + "github.com/consensys/gnark-crypto/kzg" + "github.com/consensys/gnark/backend/plonk" "github.com/consensys/gnark/frontend" - "github.com/consensys/gnark/frontend/cs/r1cs" + "github.com/consensys/gnark/frontend/cs/scs" + "github.com/consensys/gnark/test/unsafekzg" + "github.com/succinctlabs/sp1-recursion-gnark/sp1/trusted_setup" ) -func BuildGroth16(dataDir string) { - +func Build(dataDir string) { // Set the enviroment variable for the constraints file. // // TODO: There might be some non-determinism if a single processe is running this command @@ -21,7 +24,7 @@ func BuildGroth16(dataDir string) { os.Setenv("CONSTRAINTS_JSON", dataDir+"/"+CONSTRAINTS_JSON_FILE) // Read the file. - witnessInputPath := dataDir + "/witness_groth16.json" + witnessInputPath := dataDir + "/witness.json" data, err := os.ReadFile(witnessInputPath) if err != nil { panic(err) @@ -38,13 +41,96 @@ func BuildGroth16(dataDir string) { circuit := NewCircuit(witnessInput) // Compile the circuit. - r1cs, err := frontend.Compile(ecc.BN254.ScalarField(), r1cs.NewBuilder, &circuit) + scs, err := frontend.Compile(ecc.BN254.ScalarField(), scs.NewBuilder, &circuit) + if err != nil { + panic(err) + } + + // Download the trusted setup. + var srs kzg.SRS = kzg.NewSRS(ecc.BN254) + var srsLagrange kzg.SRS = kzg.NewSRS(ecc.BN254) + srsFileName := dataDir + "/" + SRS_FILE + srsLagrangeFileName := dataDir + "/" + SRS_LAGRANGE_FILE + + srsLagrangeFile, err := os.Create(srsLagrangeFileName) if err != nil { + log.Fatal("error creating srs file: ", err) panic(err) } + defer srsLagrangeFile.Close() + + if !strings.Contains(dataDir, "dev") { + if _, err := os.Stat(srsFileName); os.IsNotExist(err) { + fmt.Println("downloading aztec ignition srs") + trusted_setup.DownloadAndSaveAztecIgnitionSrs(174, srsFileName) + + srsFile, err := os.Open(srsFileName) + if err != nil { + panic(err) + } + defer srsFile.Close() + + _, err = srs.ReadFrom(srsFile) + srsFile.Close() + if err != nil { + panic(err) + } + + srsLagrange = trusted_setup.ToLagrange(scs, srs) + _, err = srsLagrange.WriteTo(srsLagrangeFile) + if err != nil { + panic(err) + } + } else { + srsFile, err := os.Open(srsFileName) + if err != nil { + panic(err) + } + defer srsFile.Close() + + _, err = srs.ReadFrom(srsFile) + srsFile.Close() + if err != nil { + panic(err) + } + + srsLagrangeFile, err := os.Open(srsLagrangeFileName) + if err != nil { + panic(err) + } + defer srsLagrangeFile.Close() + + _, err = srsLagrange.ReadFrom(srsLagrangeFile) + srsLagrangeFile.Close() + if err != nil { + panic(err) + } + } + } else { + srs, srsLagrange, err = unsafekzg.NewSRS(scs) + if err != nil { + panic(err) + } + + srsFile, err := os.Create(srsFileName) + if err != nil { + panic(err) + } + defer srsFile.Close() + + _, err = srs.WriteTo(srsFile) + if err != nil { + panic(err) + } + + _, err = srsLagrange.WriteTo(srsLagrangeFile) + if err != nil { + panic(err) + } + } - // Perform the trusted setup. - pk, vk, err := groth16.Setup(r1cs) + // Generate the proving and verifying key. + pk, vk, err := plonk.Setup(scs, srs, srsLagrange) if err != nil { panic(err) } @@ -55,7 +141,7 @@ func BuildGroth16(dataDir string) { if err != nil { panic(err) } - proof, err := groth16.Prove(r1cs, pk, witness, backend.WithProverHashToFieldFunction(sha256.New())) + proof, err := plonk.Prove(scs, pk, witness) if err != nil { panic(err) } @@ -65,7 +151,7 @@ func BuildGroth16(dataDir string) { if err != nil { panic(err) } - err = groth16.Verify(proof, vk, publicWitness, backend.WithVerifierHashToFieldFunction(sha256.New())) + err = plonk.Verify(proof, vk, publicWitness) if err != nil { panic(err) } @@ -81,12 +167,12 @@ func BuildGroth16(dataDir string) { vk.ExportSolidity(solidityVerifierFile) // Write the R1CS. - r1csFile, err := os.Create(dataDir + "/" + CIRCUIT_PATH) + scsFile, err := os.Create(dataDir + "/" + CIRCUIT_PATH) if err != nil { panic(err) } - defer r1csFile.Close() - _, err = r1cs.WriteTo(r1csFile) + defer scsFile.Close() + _, err = scs.WriteTo(scsFile) if err != nil { panic(err) } @@ -108,5 +194,8 @@ func BuildGroth16(dataDir string) { panic(err) } defer pkFile.Close() - pk.WriteDump(pkFile) + _, err = pk.WriteTo(pkFile) + if err != nil { + panic(err) + } } diff --git a/recursion/gnark-ffi/go/sp1/poseidon2/poseidon2_test.go b/recursion/gnark-ffi/go/sp1/poseidon2/poseidon2_test.go index 2352169fe1..d7bf417f70 100644 --- a/recursion/gnark-ffi/go/sp1/poseidon2/poseidon2_test.go +++ b/recursion/gnark-ffi/go/sp1/poseidon2/poseidon2_test.go @@ -48,5 +48,5 @@ func TestPoseidon2(t *testing.T) { circuit = TestPoseidon2Circuit{Input: input, ExpectedOutput: expected_output} witness = TestPoseidon2Circuit{Input: input, ExpectedOutput: expected_output} - assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16)) + assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.PLONK)) } diff --git a/recursion/gnark-ffi/go/sp1/prove.go b/recursion/gnark-ffi/go/sp1/prove.go index 9db841feed..c921d11435 100644 --- a/recursion/gnark-ffi/go/sp1/prove.go +++ b/recursion/gnark-ffi/go/sp1/prove.go @@ -1,17 +1,15 @@ package sp1 import ( - "crypto/sha256" "encoding/json" "os" "github.com/consensys/gnark-crypto/ecc" - "github.com/consensys/gnark/backend" - "github.com/consensys/gnark/backend/groth16" + "github.com/consensys/gnark/backend/plonk" "github.com/consensys/gnark/frontend" ) -func ProveGroth16(dataDir string, witnessPath string) Groth16Proof { +func Prove(dataDir string, witnessPath string) Proof { // Sanity check the required arguments have been provided. if dataDir == "" { panic("dataDirStr is required") @@ -19,27 +17,27 @@ func ProveGroth16(dataDir string, witnessPath string) Groth16Proof { os.Setenv("CONSTRAINTS_JSON", dataDir+"/"+CONSTRAINTS_JSON_FILE) // Read the R1CS. - r1csFile, err := os.Open(dataDir + "/" + CIRCUIT_PATH) + scsFile, err := os.Open(dataDir + "/" + CIRCUIT_PATH) if err != nil { panic(err) } - r1cs := groth16.NewCS(ecc.BN254) - r1cs.ReadFrom(r1csFile) + scs := plonk.NewCS(ecc.BN254) + scs.ReadFrom(scsFile) // Read the proving key. pkFile, err := os.Open(dataDir + "/" + PK_PATH) if err != nil { panic(err) } - pk := groth16.NewProvingKey(ecc.BN254) - pk.ReadDump(pkFile) + pk := plonk.NewProvingKey(ecc.BN254) + pk.UnsafeReadFrom(pkFile) // Read the verifier key. vkFile, err := os.Open(dataDir + "/" + VK_PATH) if err != nil { panic(err) } - vk := groth16.NewVerifyingKey(ecc.BN254) + vk := plonk.NewVerifyingKey(ecc.BN254) vk.ReadFrom(vkFile) // Read the file. @@ -67,16 +65,16 @@ func ProveGroth16(dataDir string, witnessPath string) Groth16Proof { } // Generate the proof. - proof, err := groth16.Prove(r1cs, pk, witness, backend.WithProverHashToFieldFunction(sha256.New())) + proof, err := plonk.Prove(scs, pk, witness) if err != nil { panic(err) } // Verify proof. - err = groth16.Verify(proof, vk, publicWitness, backend.WithVerifierHashToFieldFunction(sha256.New())) + err = plonk.Verify(proof, vk, publicWitness) if err != nil { panic(err) } - return NewSP1Groth16Proof(&proof, witnessInput) + return NewSP1PlonkBn254Proof(&proof, witnessInput) } diff --git a/recursion/gnark-ffi/go/sp1/sp1.go b/recursion/gnark-ffi/go/sp1/sp1.go index a2e20a1138..82c651b774 100644 --- a/recursion/gnark-ffi/go/sp1/sp1.go +++ b/recursion/gnark-ffi/go/sp1/sp1.go @@ -11,12 +11,14 @@ import ( "github.com/succinctlabs/sp1-recursion-gnark/sp1/poseidon2" ) -var CONSTRAINTS_JSON_FILE string = "constraints_groth16.json" -var WITNESS_JSON_FILE string = "witness_groth16.json" +var SRS_FILE string = "srs.bin" +var SRS_LAGRANGE_FILE string = "srs_lagrange.bin" +var CONSTRAINTS_JSON_FILE string = "constraints.json" +var WITNESS_JSON_FILE string = "witness.json" var VERIFIER_CONTRACT_PATH string = "SP1Verifier.sol" -var CIRCUIT_PATH string = "circuit_groth16.bin" -var VK_PATH string = "vk_groth16.bin" -var PK_PATH string = "pk_groth16.bin" +var CIRCUIT_PATH string = "circuit.bin" +var VK_PATH string = "vk.bin" +var PK_PATH string = "pk.bin" type Circuit struct { VkeyHash frontend.Variable `gnark:",public"` @@ -39,7 +41,7 @@ type WitnessInput struct { CommitedValuesDigest string `json:"commited_values_digest"` } -type Groth16Proof struct { +type Proof struct { PublicInputs [2]string `json:"public_inputs"` EncodedProof string `json:"encoded_proof"` RawProof string `json:"raw_proof"` diff --git a/recursion/gnark-ffi/go/sp1/trusted_setup/trusted_setup.go b/recursion/gnark-ffi/go/sp1/trusted_setup/trusted_setup.go new file mode 100644 index 0000000000..fcafee1739 --- /dev/null +++ b/recursion/gnark-ffi/go/sp1/trusted_setup/trusted_setup.go @@ -0,0 +1,170 @@ +package trusted_setup + +import ( + "log" + "os" + + stdbits "math/bits" + + "github.com/consensys/gnark-crypto/ecc/bn254" + "github.com/consensys/gnark-crypto/ecc/bn254/fr" + kzg_bn254 "github.com/consensys/gnark-crypto/ecc/bn254/kzg" + "github.com/consensys/gnark-crypto/kzg" + "github.com/consensys/gnark-ignition-verifier/ignition" + "github.com/consensys/gnark/constraint" +) + +func sanityCheck(srs *kzg_bn254.SRS) { + // we can now use the SRS to verify a proof + // create a polynomial + f := randomPolynomial(60) + + // commit the polynomial + digest, err := kzg_bn254.Commit(f, srs.Pk) + if err != nil { + log.Fatal(err) + } + + // compute opening proof at a random point + var point fr.Element + point.SetString("4321") + proof, err := kzg_bn254.Open(f, point, srs.Pk) + if err != nil { + log.Fatal(err) + } + + // verify the claimed valued + expected := eval(f, point) + if !proof.ClaimedValue.Equal(&expected) { + log.Fatal("inconsistent claimed value") + } + + // verify correct proof + err = kzg_bn254.Verify(&digest, &proof, point, srs.Vk) + if err != nil { + log.Fatal(err) + } +} + +func randomPolynomial(size int) []fr.Element { + f := make([]fr.Element, size) + for i := 0; i < size; i++ { + f[i].SetRandom() + } + return f +} + +// eval returns p(point) where p is interpreted as a polynomial +// ∑_{i= 0; i-- { + res.Mul(&res, &point).Add(&res, &p[i]) + } + return res +} + +func DownloadAndSaveAztecIgnitionSrs(startIdx int, fileName string) { + config := ignition.Config{ + BaseURL: "https://aztec-ignition.s3.amazonaws.com/", + Ceremony: "MAIN IGNITION", // "TINY_TEST_5" + CacheDir: "./data", + } + + if config.CacheDir != "" { + err := os.MkdirAll(config.CacheDir, os.ModePerm) + + if err != nil { + log.Fatal("when creating cache dir: ", err) + panic(err) + } + } + + log.Println("fetch manifest") + + manifest, err := ignition.NewManifest(config) + + if err != nil { + log.Fatal("when fetching manifest: ", err) + } + + current, next := ignition.NewContribution(manifest.NumG1Points), ignition.NewContribution(manifest.NumG1Points) + + if err := current.Get(manifest.Participants[startIdx], config); err != nil { + log.Fatal("when fetching contribution: ", err) + } + if err := next.Get(manifest.Participants[startIdx+1], config); err != nil { + log.Fatal("when fetching contribution: ", err) + } + if !next.Follows(¤t) { + log.Fatalf("contribution %d does not follow contribution %d", startIdx+1, startIdx) + } + + for i := startIdx + 2; i < len(manifest.Participants); i++ { + log.Println("processing contribution ", i+1) + current, next = next, current + if err := next.Get(manifest.Participants[i], config); err != nil { + log.Fatal("when fetching contribution ", i+1, ": ", err) + } + if !next.Follows(¤t) { + log.Fatal("contribution ", i+1, " does not follow contribution ", i, ": ", err) + } + } + + log.Println("success ✅: all contributions are valid") + + _, _, _, g2gen := bn254.Generators() + // we use the last contribution to build a kzg SRS for bn254 + srs := kzg_bn254.SRS{ + Pk: kzg_bn254.ProvingKey{ + G1: next.G1, + }, + Vk: kzg_bn254.VerifyingKey{ + G1: next.G1[0], + G2: [2]bn254.G2Affine{ + g2gen, + next.G2[0], + }, + }, + } + + // sanity check + sanityCheck(&srs) + log.Println("success ✅: kzg sanity check with SRS") + + fSRS, err := os.Create(fileName) + if err != nil { + log.Fatal("error creating srs file: ", err) + panic(err) + } + defer fSRS.Close() + + _, err = srs.WriteTo(fSRS) + if err != nil { + log.Fatal("error writing srs file: ", err) + panic(err) + } +} + +func ToLagrange(scs constraint.ConstraintSystem, canonicalSRS kzg.SRS) kzg.SRS { + var lagrangeSRS kzg.SRS + + switch srs := canonicalSRS.(type) { + case *kzg_bn254.SRS: + var err error + sizeSystem := scs.GetNbPublicVariables() + scs.GetNbConstraints() + nextPowerTwo := 1 << stdbits.Len(uint(sizeSystem)) + newSRS := &kzg_bn254.SRS{Vk: srs.Vk} + newSRS.Pk.G1, err = kzg_bn254.ToLagrangeG1(srs.Pk.G1[:nextPowerTwo]) + if err != nil { + panic(err) + } + lagrangeSRS = newSRS + default: + panic("unrecognized curve") + } + + return lagrangeSRS +} diff --git a/recursion/gnark-ffi/go/sp1/utils.go b/recursion/gnark-ffi/go/sp1/utils.go index cade74b5fe..ac898c28bb 100644 --- a/recursion/gnark-ffi/go/sp1/utils.go +++ b/recursion/gnark-ffi/go/sp1/utils.go @@ -3,52 +3,23 @@ package sp1 import ( "bytes" "encoding/hex" - "math/big" - "github.com/consensys/gnark/backend/groth16" + "github.com/consensys/gnark/backend/plonk" "github.com/consensys/gnark/frontend" "github.com/succinctlabs/sp1-recursion-gnark/sp1/babybear" ) -func NewSP1Groth16Proof(proof *groth16.Proof, witnessInput WitnessInput) Groth16Proof { +func NewSP1PlonkBn254Proof(proof *plonk.Proof, witnessInput WitnessInput) Proof { var buf bytes.Buffer (*proof).WriteRawTo(&buf) proofBytes := buf.Bytes() - fpSize := 4 * 8 - var ( - a [2]*big.Int - b [2][2]*big.Int - c [2]*big.Int - ) - a[0] = new(big.Int).SetBytes(proofBytes[fpSize*0 : fpSize*1]) - a[1] = new(big.Int).SetBytes(proofBytes[fpSize*1 : fpSize*2]) - b[0][0] = new(big.Int).SetBytes(proofBytes[fpSize*2 : fpSize*3]) - b[0][1] = new(big.Int).SetBytes(proofBytes[fpSize*3 : fpSize*4]) - b[1][0] = new(big.Int).SetBytes(proofBytes[fpSize*4 : fpSize*5]) - b[1][1] = new(big.Int).SetBytes(proofBytes[fpSize*5 : fpSize*6]) - c[0] = new(big.Int).SetBytes(proofBytes[fpSize*6 : fpSize*7]) - c[1] = new(big.Int).SetBytes(proofBytes[fpSize*7 : fpSize*8]) - - commitmentCountBigInt := new(big.Int).SetBytes(proofBytes[fpSize*8 : fpSize*8+4]) - commitmentCount := int(commitmentCountBigInt.Int64()) - - var commitments []*big.Int = make([]*big.Int, 2*commitmentCount) - var commitmentPok [2]*big.Int - - for i := 0; i < 2*commitmentCount; i++ { - commitments[i] = new(big.Int).SetBytes(proofBytes[fpSize*8+4+i*fpSize : fpSize*8+4+(i+1)*fpSize]) - } - - commitmentPok[0] = new(big.Int).SetBytes(proofBytes[fpSize*8+4+2*commitmentCount*fpSize : fpSize*8+4+2*commitmentCount*fpSize+fpSize]) - commitmentPok[1] = new(big.Int).SetBytes(proofBytes[fpSize*8+4+2*commitmentCount*fpSize+fpSize : fpSize*8+4+2*commitmentCount*fpSize+2*fpSize]) - var publicInputs [2]string publicInputs[0] = witnessInput.VkeyHash publicInputs[1] = witnessInput.CommitedValuesDigest encodedProof := hex.EncodeToString(proofBytes) - return Groth16Proof{ + return Proof{ PublicInputs: publicInputs, EncodedProof: encodedProof, RawProof: hex.EncodeToString(proofBytes), diff --git a/recursion/gnark-ffi/go/sp1/verify.go b/recursion/gnark-ffi/go/sp1/verify.go index c5ed991ff6..0d7b5f21ad 100644 --- a/recursion/gnark-ffi/go/sp1/verify.go +++ b/recursion/gnark-ffi/go/sp1/verify.go @@ -2,18 +2,16 @@ package sp1 import ( "bytes" - "crypto/sha256" "encoding/hex" "os" "github.com/consensys/gnark-crypto/ecc" - "github.com/consensys/gnark/backend" - "github.com/consensys/gnark/backend/groth16" + "github.com/consensys/gnark/backend/plonk" "github.com/consensys/gnark/frontend" "github.com/succinctlabs/sp1-recursion-gnark/sp1/babybear" ) -func VerifyGroth16(verifyCmdDataDir string, verifyCmdProof string, verifyCmdVkeyHash string, verifyCmdCommitedValuesDigest string) error { +func Verify(verifyCmdDataDir string, verifyCmdProof string, verifyCmdVkeyHash string, verifyCmdCommitedValuesDigest string) error { // Sanity check the required arguments have been provided. if verifyCmdDataDir == "" { panic("--data is required") @@ -24,7 +22,7 @@ func VerifyGroth16(verifyCmdDataDir string, verifyCmdProof string, verifyCmdVkey if err != nil { panic(err) } - proof := groth16.NewProof(ecc.BN254) + proof := plonk.NewProof(ecc.BN254) if _, err := proof.ReadFrom(bytes.NewReader(proofDecodedBytes)); err != nil { panic(err) } @@ -34,7 +32,7 @@ func VerifyGroth16(verifyCmdDataDir string, verifyCmdProof string, verifyCmdVkey if err != nil { panic(err) } - vk := groth16.NewVerifyingKey(ecc.BN254) + vk := plonk.NewVerifyingKey(ecc.BN254) vk.ReadFrom(vkFile) // Compute the public witness. @@ -55,6 +53,6 @@ func VerifyGroth16(verifyCmdDataDir string, verifyCmdProof string, verifyCmdVkey } // Verify proof. - err = groth16.Verify(proof, vk, publicWitness, backend.WithVerifierHashToFieldFunction(sha256.New())) + err = plonk.Verify(proof, vk, publicWitness) return err } diff --git a/recursion/gnark-ffi/src/ffi.rs b/recursion/gnark-ffi/src/ffi.rs index 5223d79bf4..49cbeadcb1 100644 --- a/recursion/gnark-ffi/src/ffi.rs +++ b/recursion/gnark-ffi/src/ffi.rs @@ -3,25 +3,25 @@ //! Although we cast to *mut c_char because the Go signatures can't be immutable, the Go functions //! should not modify the strings. -use crate::Groth16Proof; +use crate::PlonkBn254Proof; use cfg_if::cfg_if; use std::ffi::{c_char, CString}; #[allow(warnings, clippy::all)] mod bind { - #[cfg(feature = "groth16")] + #[cfg(feature = "plonk_bn254")] include!(concat!(env!("OUT_DIR"), "/bindings.rs")); } use bind::*; -pub fn prove_groth16(data_dir: &str, witness_path: &str) -> Groth16Proof { +pub fn prove_plonk_bn254(data_dir: &str, witness_path: &str) -> PlonkBn254Proof { cfg_if! { - if #[cfg(feature = "groth16")] { + if #[cfg(feature = "plonk_bn254")] { let data_dir = CString::new(data_dir).expect("CString::new failed"); let witness_path = CString::new(witness_path).expect("CString::new failed"); let proof = unsafe { - let proof = bind::ProveGroth16( + let proof = bind::ProvePlonkBn254( data_dir.as_ptr() as *mut c_char, witness_path.as_ptr() as *mut c_char, ); @@ -31,34 +31,34 @@ pub fn prove_groth16(data_dir: &str, witness_path: &str) -> Groth16Proof { proof.into_rust() } else { - panic!("groth16 feature not enabled"); + panic!("plonk_bn254 feature not enabled"); } } } -pub fn build_groth16(data_dir: &str) { +pub fn build_plonk_bn254(data_dir: &str) { cfg_if! { - if #[cfg(feature = "groth16")] { + if #[cfg(feature = "plonk_bn254")] { let data_dir = CString::new(data_dir).expect("CString::new failed"); unsafe { - bind::BuildGroth16(data_dir.as_ptr() as *mut c_char); + bind::BuildPlonkBn254(data_dir.as_ptr() as *mut c_char); } } else { - panic!("groth16 feature not enabled"); + panic!("plonk_bn254 feature not enabled"); } } } -pub fn verify_groth16( +pub fn verify_plonk_bn254( data_dir: &str, proof: &str, vkey_hash: &str, committed_values_digest: &str, ) -> Result<(), String> { cfg_if! { - if #[cfg(feature = "groth16")] { + if #[cfg(feature = "plonk_bn254")] { let data_dir = CString::new(data_dir).expect("CString::new failed"); let proof = CString::new(proof).expect("CString::new failed"); let vkey_hash = CString::new(vkey_hash).expect("CString::new failed"); @@ -66,7 +66,7 @@ pub fn verify_groth16( CString::new(committed_values_digest).expect("CString::new failed"); let err_ptr = unsafe { - bind::VerifyGroth16( + bind::VerifyPlonkBn254( data_dir.as_ptr() as *mut c_char, proof.as_ptr() as *mut c_char, vkey_hash.as_ptr() as *mut c_char, @@ -81,29 +81,29 @@ pub fn verify_groth16( Err(err.into_string().unwrap()) } } else { - panic!("groth16 feature not enabled"); + panic!("plonk_bn254 feature not enabled"); } } } -pub fn test_groth16(witness_json: &str, constraints_json: &str) { +pub fn test_plonk_bn254(witness_json: &str, constraints_json: &str) { cfg_if! { - if #[cfg(feature = "groth16")] { + if #[cfg(feature = "plonk_bn254")] { unsafe { let witness_json = CString::new(witness_json).expect("CString::new failed"); let build_dir = CString::new(constraints_json).expect("CString::new failed"); - let err_ptr = bind::TestGroth16( + let err_ptr = bind::TestPlonkBn254( witness_json.as_ptr() as *mut c_char, build_dir.as_ptr() as *mut c_char, ); if !err_ptr.is_null() { // Safety: The error message is returned from the go code and is guaranteed to be valid. let err = CString::from_raw(err_ptr); - panic!("TestGroth16 failed: {}", err.into_string().unwrap()); + panic!("TestPlonkBn254 failed: {}", err.into_string().unwrap()); } } } else { - panic!("groth16 feature not enabled"); + panic!("plonk_bn254 feature not enabled"); } } } @@ -121,13 +121,13 @@ unsafe fn c_char_ptr_to_string(input: *mut c_char) -> String { } } -#[cfg(feature = "groth16")] -impl C_Groth16Proof { - /// Converts a C Groth16Proof into a Rust Groth16Proof, freeing the C strings. - fn into_rust(self) -> Groth16Proof { +#[cfg(feature = "plonk_bn254")] +impl C_PlonkBn254Proof { + /// Converts a C PlonkBn254Proof into a Rust PlonkBn254Proof, freeing the C strings. + fn into_rust(self) -> PlonkBn254Proof { // Safety: The raw pointers are not used anymore after converted into Rust strings. unsafe { - Groth16Proof { + PlonkBn254Proof { public_inputs: [ c_char_ptr_to_string(self.PublicInputs[0]), c_char_ptr_to_string(self.PublicInputs[1]), diff --git a/recursion/gnark-ffi/src/groth16.rs b/recursion/gnark-ffi/src/groth16.rs deleted file mode 100644 index b83031d67c..0000000000 --- a/recursion/gnark-ffi/src/groth16.rs +++ /dev/null @@ -1,127 +0,0 @@ -use std::{ - fs::{File, OpenOptions}, - io::Write, - path::{Path, PathBuf}, -}; - -use crate::{ - ffi::{build_groth16, prove_groth16, test_groth16, verify_groth16}, - witness::GnarkWitness, -}; - -use num_bigint::BigUint; -use serde::{Deserialize, Serialize}; -use sp1_recursion_compiler::{ - constraints::Constraint, - ir::{Config, Witness}, -}; - -/// A prover that can generate proofs with the Groth16 protocol using bindings to Gnark. -#[derive(Debug, Clone)] -pub struct Groth16Prover; - -/// A zero-knowledge proof generated by the Groth16 protocol with a Base64 encoded gnark groth16 proof. -#[derive(Debug, Clone, Serialize, Deserialize, Default)] -pub struct Groth16Proof { - pub public_inputs: [String; 2], - pub encoded_proof: String, - pub raw_proof: String, -} - -impl Groth16Prover { - /// Creates a new [Groth16Prover]. - pub const fn new() -> Self { - Self - } - - /// Executes the prover in testing mode with a circuit definition and witness. - pub fn test(constraints: Vec, witness: Witness) { - let serialized = serde_json::to_string(&constraints).unwrap(); - - // Write constraints. - let mut constraints_file = tempfile::NamedTempFile::new().unwrap(); - constraints_file.write_all(serialized.as_bytes()).unwrap(); - - // Write witness. - let mut witness_file = tempfile::NamedTempFile::new().unwrap(); - let gnark_witness = GnarkWitness::new(witness); - let serialized = serde_json::to_string(&gnark_witness).unwrap(); - witness_file.write_all(serialized.as_bytes()).unwrap(); - - test_groth16( - witness_file.path().to_str().unwrap(), - constraints_file.path().to_str().unwrap(), - ); - } - - /// Builds the groth16 circuit locally. - pub fn build(constraints: Vec, witness: Witness, build_dir: PathBuf) { - let serialized = serde_json::to_string(&constraints).unwrap(); - - // Write constraints. - let constraints_path = build_dir.join("constraints_groth16.json"); - let mut file = File::create(constraints_path).unwrap(); - file.write_all(serialized.as_bytes()).unwrap(); - - // Write witness. - let witness_path = build_dir.join("witness_groth16.json"); - let gnark_witness = GnarkWitness::new(witness); - let mut file = File::create(witness_path).unwrap(); - let serialized = serde_json::to_string(&gnark_witness).unwrap(); - file.write_all(serialized.as_bytes()).unwrap(); - - build_groth16(build_dir.to_str().unwrap()); - - // Extend the built verifier with the sp1 verifier contract. - let groth16_verifier_path = build_dir.join("SP1Verifier.sol"); - - // Open the file in append mode. - let mut groth16_verifier_file = OpenOptions::new() - .append(true) - .open(groth16_verifier_path) - .expect("failed to open file"); - - // Write the string to the file - let sp1_verifier_str = include_str!("../assets/SP1Verifier.txt"); - groth16_verifier_file - .write_all(sp1_verifier_str.as_bytes()) - .expect("Failed to write to file"); - } - - /// Generates a Groth16 proof by sending a request to the Gnark server. - pub fn prove(&self, witness: Witness, build_dir: PathBuf) -> Groth16Proof { - // Write witness. - let mut witness_file = tempfile::NamedTempFile::new().unwrap(); - let gnark_witness = GnarkWitness::new(witness); - let serialized = serde_json::to_string(&gnark_witness).unwrap(); - witness_file.write_all(serialized.as_bytes()).unwrap(); - - prove_groth16( - build_dir.to_str().unwrap(), - witness_file.path().to_str().unwrap(), - ) - } - - /// Verify a Groth16 proof and verify that the supplied vkey_hash and committed_values_digest match. - pub fn verify( - &self, - proof: &Groth16Proof, - vkey_hash: &BigUint, - committed_values_digest: &BigUint, - build_dir: &Path, - ) { - verify_groth16( - build_dir.to_str().unwrap(), - &proof.raw_proof, - &vkey_hash.to_string(), - &committed_values_digest.to_string(), - ) - .expect("failed to verify proof") - } -} - -impl Default for Groth16Prover { - fn default() -> Self { - Self::new() - } -} diff --git a/recursion/gnark-ffi/src/lib.rs b/recursion/gnark-ffi/src/lib.rs index 31ea294d62..26940e863b 100644 --- a/recursion/gnark-ffi/src/lib.rs +++ b/recursion/gnark-ffi/src/lib.rs @@ -1,8 +1,7 @@ mod babybear; pub mod ffi; -pub mod groth16; pub mod plonk_bn254; pub mod witness; -pub use groth16::*; +pub use plonk_bn254::*; pub use witness::*; diff --git a/recursion/gnark-ffi/src/plonk_bn254.rs b/recursion/gnark-ffi/src/plonk_bn254.rs index 04a2799807..6b2ddf66be 100644 --- a/recursion/gnark-ffi/src/plonk_bn254.rs +++ b/recursion/gnark-ffi/src/plonk_bn254.rs @@ -1,146 +1,122 @@ use std::{ - fs::File, - io::{Read, Write}, - path::PathBuf, - process::{Command, Stdio}, + fs::{File, OpenOptions}, + io::Write, + path::{Path, PathBuf}, }; +use crate::{ + ffi::{build_plonk_bn254, prove_plonk_bn254, test_plonk_bn254, verify_plonk_bn254}, + witness::GnarkWitness, +}; + +use num_bigint::BigUint; use serde::{Deserialize, Serialize}; use sp1_recursion_compiler::{ constraints::Constraint, ir::{Config, Witness}, }; -use crate::GnarkWitness; - -/// A prover that can generate proofs with the PLONK-BN254 protocol using bindings to Gnark. +/// A prover that can generate proofs with the PLONK protocol using bindings to Gnark. +#[derive(Debug, Clone)] pub struct PlonkBn254Prover; -/// A zero-knowledge proof generated by the PLONK-BN254 protocol. +/// A zero-knowledge proof generated by the PLONK protocol with a Base64 encoded gnark PLONK proof. #[derive(Debug, Clone, Serialize, Deserialize, Default)] pub struct PlonkBn254Proof { - proof: String, - public_inputs: [String; 2], + pub public_inputs: [String; 2], + pub encoded_proof: String, + pub raw_proof: String, } impl PlonkBn254Prover { - /// Creates a new prover. - pub const fn new() -> Self { - PlonkBn254Prover + /// Creates a new [PlonkBn254Prover]. + pub fn new() -> Self { + Self } + /// Executes the prover in testing mode with a circuit definition and witness. + pub fn test(constraints: Vec, witness: Witness) { + let serialized = serde_json::to_string(&constraints).unwrap(); + + // Write constraints. + let mut constraints_file = tempfile::NamedTempFile::new().unwrap(); + constraints_file.write_all(serialized.as_bytes()).unwrap(); + + // Write witness. + let mut witness_file = tempfile::NamedTempFile::new().unwrap(); + let gnark_witness = GnarkWitness::new(witness); + let serialized = serde_json::to_string(&gnark_witness).unwrap(); + witness_file.write_all(serialized.as_bytes()).unwrap(); + + test_plonk_bn254( + witness_file.path().to_str().unwrap(), + constraints_file.path().to_str().unwrap(), + ); + } + + /// Builds the PLONK circuit locally. pub fn build(constraints: Vec, witness: Witness, build_dir: PathBuf) { let serialized = serde_json::to_string(&constraints).unwrap(); - let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); - let gnark_dir = manifest_dir.join("../gnark"); - let cwd = std::env::current_dir().unwrap(); // Write constraints. - let constraints_path = build_dir.join("constraints_plonk_bn254.json"); + let constraints_path = build_dir.join("constraints.json"); let mut file = File::create(constraints_path).unwrap(); file.write_all(serialized.as_bytes()).unwrap(); // Write witness. - let witness_path = build_dir.join("witness_plonk_bn254.json"); + let witness_path = build_dir.join("witness.json"); let gnark_witness = GnarkWitness::new(witness); let mut file = File::create(witness_path).unwrap(); let serialized = serde_json::to_string(&gnark_witness).unwrap(); file.write_all(serialized.as_bytes()).unwrap(); - // Run `make`. - let make = Command::new("make") - .current_dir(&gnark_dir) - .stderr(Stdio::inherit()) - .stdout(Stdio::inherit()) - .stdin(Stdio::inherit()) - .output() - .unwrap(); - if !make.status.success() { - panic!("failed to run make"); - } - - // Run the build script. - let result = Command::new("go") - .args([ - "run", - "main.go", - "build-plonk-bn254", - "--data", - cwd.join(build_dir).to_str().unwrap(), - ]) - .current_dir(gnark_dir) - .stderr(Stdio::inherit()) - .stdout(Stdio::inherit()) - .stdin(Stdio::inherit()) - .output() - .unwrap(); - - if !result.status.success() { - panic!("failed to run build script"); - } - } + build_plonk_bn254(build_dir.to_str().unwrap()); - pub fn prove(witness: Witness, build_dir: PathBuf) -> PlonkBn254Proof { - let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); - let gnark_dir = manifest_dir.join("../gnark"); - let cwd = std::env::current_dir().unwrap(); + // Extend the built verifier with the sp1 verifier contract. + let plonk_bn254_verifier_path = build_dir.join("SP1Verifier.sol"); + // Open the file in append mode. + let mut plonk_bn254_verifier_file = OpenOptions::new() + .append(true) + .open(plonk_bn254_verifier_path) + .expect("failed to open file"); + + // Write the string to the file + let sp1_verifier_str = include_str!("../assets/SP1Verifier.txt"); + plonk_bn254_verifier_file + .write_all(sp1_verifier_str.as_bytes()) + .expect("Failed to write to file"); + } + + /// Generates a PLONK proof by sending a request to the Gnark server. + pub fn prove(&self, witness: Witness, build_dir: PathBuf) -> PlonkBn254Proof { // Write witness. let mut witness_file = tempfile::NamedTempFile::new().unwrap(); let gnark_witness = GnarkWitness::new(witness); let serialized = serde_json::to_string(&gnark_witness).unwrap(); witness_file.write_all(serialized.as_bytes()).unwrap(); - // Run `make`. - let make = Command::new("make") - .current_dir(&gnark_dir) - .stderr(Stdio::inherit()) - .stdout(Stdio::inherit()) - .stdin(Stdio::inherit()) - .output() - .unwrap(); - if !make.status.success() { - panic!("failed to run make"); - } - - // Run the prove script. - let proof_file = tempfile::NamedTempFile::new().unwrap(); - let result = Command::new("go") - .args([ - "run", - "main.go", - "prove-plonk-bn254", - "--data", - cwd.join(build_dir).to_str().unwrap(), - "--witness", - witness_file.path().to_str().unwrap(), - "--proof", - proof_file.path().to_str().unwrap(), - ]) - .current_dir(gnark_dir) - .stderr(Stdio::inherit()) - .stdout(Stdio::inherit()) - .stdin(Stdio::inherit()) - .output() - .unwrap(); - - if !result.status.success() { - panic!("failed to run build script"); - } - - // Read the contents back from the tempfile. - let mut buffer = String::new(); - proof_file - .reopen() - .unwrap() - .read_to_string(&mut buffer) - .unwrap(); - - // Deserialize the JSON string back to a Groth16Proof instance - let deserialized: PlonkBn254Proof = - serde_json::from_str(&buffer).expect("Error deserializing the proof"); - - deserialized + prove_plonk_bn254( + build_dir.to_str().unwrap(), + witness_file.path().to_str().unwrap(), + ) + } + + /// Verify a PLONK proof and verify that the supplied vkey_hash and committed_values_digest match. + pub fn verify( + &self, + proof: &PlonkBn254Proof, + vkey_hash: &BigUint, + committed_values_digest: &BigUint, + build_dir: &Path, + ) { + verify_plonk_bn254( + build_dir.to_str().unwrap(), + &proof.raw_proof, + &vkey_hash.to_string(), + &committed_values_digest.to_string(), + ) + .expect("failed to verify proof") } } diff --git a/sdk/Cargo.toml b/sdk/Cargo.toml index e7f05c1fc7..2ca7450f61 100644 --- a/sdk/Cargo.toml +++ b/sdk/Cargo.toml @@ -41,7 +41,7 @@ cfg-if = "1.0" [features] neon = ["sp1-core/neon"] -groth16 = ["sp1-prover/groth16"] +plonk_bn254= ["sp1-prover/plonk_bn254"] [build-dependencies] vergen = { version = "8", default-features = false, features = [ diff --git a/sdk/src/artifacts.rs b/sdk/src/artifacts.rs index 52f1c97376..059f79a404 100644 --- a/sdk/src/artifacts.rs +++ b/sdk/src/artifacts.rs @@ -4,18 +4,20 @@ use anyhow::{Context, Result}; use futures::StreamExt; use indicatif::{ProgressBar, ProgressStyle}; use reqwest::Client; -pub use sp1_prover::build::{build_groth16_artifacts_with_dummy, try_install_groth16_artifacts}; +pub use sp1_prover::build::{ + build_plonk_bn254_artifacts_with_dummy, try_install_plonk_bn254_artifacts, +}; -/// Exports the soliditiy verifier for Groth16 proofs to the specified output directory. +/// Exports the soliditiy verifier for PLONK proofs to the specified output directory. /// -/// WARNING: If you are on development mode, this function assumes that the Groth16 artifacts have +/// WARNING: If you are on development mode, this function assumes that the PLONK artifacts have /// already been built. -pub fn export_solidity_groth16_verifier(output_dir: impl Into) -> Result<()> { +pub fn export_solidity_plonk_bn254_verifier(output_dir: impl Into) -> Result<()> { let output_dir: PathBuf = output_dir.into(); let artifacts_dir = if sp1_prover::build::sp1_dev_mode() { - sp1_prover::build::groth16_artifacts_dev_dir() + sp1_prover::build::plonk_bn254_artifacts_dev_dir() } else { - sp1_prover::build::try_install_groth16_artifacts() + sp1_prover::build::try_install_plonk_bn254_artifacts() }; let verifier_path = artifacts_dir.join("SP1Verifier.sol"); @@ -79,7 +81,7 @@ pub async fn download_file( mod tests { #[test] fn test_verifier_export() { - crate::artifacts::export_solidity_groth16_verifier(tempfile::tempdir().unwrap().path()) + crate::artifacts::export_solidity_plonk_bn254_verifier(tempfile::tempdir().unwrap().path()) .expect("failed to export verifier"); } } diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index 1249fc0c88..ba90d84596 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -26,7 +26,7 @@ pub use provers::{LocalProver, MockProver, NetworkProver, Prover}; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use sp1_core::stark::{MachineVerificationError, ShardProof}; pub use sp1_prover::{ - CoreSC, Groth16Proof, HashableKey, InnerSC, OuterSC, PlonkBn254Proof, SP1Prover, SP1ProvingKey, + CoreSC, HashableKey, InnerSC, OuterSC, PlonkBn254Proof, SP1Prover, SP1ProvingKey, SP1PublicValues, SP1Stdin, SP1VerifyingKey, }; @@ -54,11 +54,8 @@ pub type SP1ProofVerificationError = MachineVerificationError; pub type SP1CompressedProof = SP1ProofWithPublicValues>; pub type SP1CompressedProofVerificationError = MachineVerificationError; -/// A [SP1ProofWithPublicValues] generated with [ProverClient::prove_groth16]. -pub type SP1Groth16Proof = SP1ProofWithPublicValues; - -/// A [SP1ProofWithPublicValues] generated with [ProverClient::prove_plonk]. -pub type SP1PlonkProof = SP1ProofWithPublicValues; +/// A [SP1ProofWithPublicValues] generated with [ProverClient::prove_plonk_bn254]. +pub type SP1PlonkBn254Proof = SP1ProofWithPublicValues; impl ProverClient { /// Creates a new [ProverClient]. @@ -200,7 +197,7 @@ impl ProverClient { /// /// Returns a proof of the program's execution. By default the proof generated will not be /// compressed to constant size. To create a more succinct proof, use the [Self::prove_compressed], - /// [Self::prove_groth16], or [Self::prove_plonk] methods. + /// [Self::prove_plonk_bn254], or [Self::prove_plonk] methods. /// /// ### Examples /// ```no_run @@ -259,39 +256,9 @@ impl ProverClient { self.prover.prove_compressed(pk, stdin) } - /// Proves the execution of the given program with the given input in the groth16 mode. - /// - /// Returns a proof of the program's execution in the groth16 format. The proof is a succinct - /// proof that is of constant size and friendly for on-chain verification. - /// - /// ### Examples - /// ```no_run - /// use sp1_sdk::{ProverClient, SP1Stdin}; - /// - /// // Load the program. - /// let elf = include_bytes!("../../examples/fibonacci/program/elf/riscv32im-succinct-zkvm-elf"); - /// - /// // Initialize the prover client. - /// let client = ProverClient::new(); - /// - /// // Setup the program. - /// let (pk, vk) = client.setup(elf); - /// - /// // Setup the inputs. - /// let mut stdin = SP1Stdin::new(); - /// stdin.write(&10usize); - /// - /// // Generate the proof. - /// let proof = client.prove_groth16(&pk, stdin).unwrap(); - /// ``` - /// Generates a groth16 proof, verifiable onchain, of the given elf and stdin. - pub fn prove_groth16(&self, pk: &SP1ProvingKey, stdin: SP1Stdin) -> Result { - self.prover.prove_groth16(pk, stdin) - } - - /// Proves the execution of the given program with the given input in the plonk mode. + /// Proves the execution of the given program with the given input in the plonk bn254 mode. /// - /// Returns a proof of the program's execution in the plonk format. The proof is a succinct + /// Returns a proof of the program's execution in the plonk bn254format. The proof is a succinct /// proof that is of constant size and friendly for on-chain verification. /// /// ### Examples @@ -312,10 +279,15 @@ impl ProverClient { /// stdin.write(&10usize); /// /// // Generate the proof. - /// let proof = client.prove_plonk(&pk, stdin).unwrap(); + /// let proof = client.prove_plonk_bn254(&pk, stdin).unwrap(); /// ``` - pub fn prove_plonk(&self, pk: &SP1ProvingKey, stdin: SP1Stdin) -> Result { - self.prover.prove_plonk(pk, stdin) + /// Generates a plonk bn254 proof, verifiable onchain, of the given elf and stdin. + pub fn prove_plonk_bn254( + &self, + pk: &SP1ProvingKey, + stdin: SP1Stdin, + ) -> Result { + self.prover.prove_plonk_bn254(pk, stdin) } /// Verifies that the given proof is valid and matches the given verification key produced by @@ -373,7 +345,7 @@ impl ProverClient { self.prover.verify_compressed(proof, vkey) } - /// Verifies that the given groth16 proof is valid and matches the given verification key + /// Verifies that the given plonk bn254 proof is valid and matches the given verification key /// produced by [Self::setup]. /// /// ### Examples @@ -394,43 +366,17 @@ impl ProverClient { /// stdin.write(&10usize); /// /// // Generate the proof. - /// let proof = client.prove_groth16(&pk, stdin).unwrap(); + /// let proof = client.prove_plonk_bn254(&pk, stdin).unwrap(); /// /// // Verify the proof. - /// client.verify_groth16(&proof, &vk).unwrap(); + /// client.verify_plonk_bn254(&proof, &vk).unwrap(); /// ``` - pub fn verify_groth16(&self, proof: &SP1Groth16Proof, vkey: &SP1VerifyingKey) -> Result<()> { - self.prover.verify_groth16(proof, vkey) - } - - /// Verifies that the given plonk proof is valid and matches the given verification key - /// produced by [Self::setup]. - /// - /// ### Examples - /// ```no_run - /// use sp1_sdk::{ProverClient, SP1Stdin}; - /// - /// // Load the program. - /// let elf = include_bytes!("../../examples/fibonacci/program/elf/riscv32im-succinct-zkvm-elf"); - /// - /// // Initialize the prover client. - /// let client = ProverClient::new(); - /// - /// // Setup the program. - /// let (pk, vk) = client.setup(elf); - /// - /// // Setup the inputs. - /// let mut stdin = SP1Stdin::new(); - /// stdin.write(&10usize); - /// - /// // Generate the proof. - /// let proof = client.prove_plonk(&pk, stdin).unwrap(); - /// - /// // Verify the proof. - /// client.verify_plonk(&proof, &vk).unwrap(); - /// ``` - pub fn verify_plonk(&self, proof: &SP1PlonkProof, vkey: &SP1VerifyingKey) -> Result<()> { - self.prover.verify_plonk(proof, vkey) + pub fn verify_plonk_bn254( + &self, + proof: &SP1PlonkBn254Proof, + vkey: &SP1VerifyingKey, + ) -> Result<()> { + self.prover.verify_plonk_bn254(proof, vkey) } } @@ -454,7 +400,7 @@ impl SP1ProofWithPublicValues

String { format!("0x{}", self.proof.encoded_proof.clone()) } @@ -501,7 +447,7 @@ mod tests { } #[test] - fn test_e2e_prove_groth16() { + fn test_e2e_prove_plonk_bn254() { utils::setup_logger(); let client = ProverClient::local(); let elf = @@ -509,8 +455,8 @@ mod tests { let (pk, vk) = client.setup(elf); let mut stdin = SP1Stdin::new(); stdin.write(&10usize); - let proof = client.prove_groth16(&pk, stdin).unwrap(); - client.verify_groth16(&proof, &vk).unwrap(); + let proof = client.prove_plonk_bn254(&pk, stdin).unwrap(); + client.verify_plonk_bn254(&proof, &vk).unwrap(); } #[test] @@ -527,7 +473,7 @@ mod tests { } #[test] - fn test_e2e_prove_groth16_mock() { + fn test_e2e_prove_plonk_bn254_mock() { utils::setup_logger(); let client = ProverClient::mock(); let elf = @@ -535,7 +481,7 @@ mod tests { let (pk, vk) = client.setup(elf); let mut stdin = SP1Stdin::new(); stdin.write(&10usize); - let proof = client.prove_groth16(&pk, stdin).unwrap(); - client.verify_groth16(&proof, &vk).unwrap(); + let proof = client.prove_plonk_bn254(&pk, stdin).unwrap(); + client.verify_plonk_bn254(&proof, &vk).unwrap(); } } diff --git a/sdk/src/proto/network.rs b/sdk/src/proto/network.rs index 9c0492a738..3c8919d7e6 100644 --- a/sdk/src/proto/network.rs +++ b/sdk/src/proto/network.rs @@ -300,8 +300,6 @@ pub enum ProofMode { Compressed = 2, /// The proof mode for a PlonK proof. Plonk = 3, - /// The proof mode for a Groth16 proof. - Groth16 = 4, } impl ProofMode { /// String value of the enum field names used in the ProtoBuf definition. @@ -314,7 +312,6 @@ impl ProofMode { ProofMode::Core => "PROOF_MODE_CORE", ProofMode::Compressed => "PROOF_MODE_COMPRESSED", ProofMode::Plonk => "PROOF_MODE_PLONK", - ProofMode::Groth16 => "PROOF_MODE_GROTH16", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -324,7 +321,6 @@ impl ProofMode { "PROOF_MODE_CORE" => Some(Self::Core), "PROOF_MODE_COMPRESSED" => Some(Self::Compressed), "PROOF_MODE_PLONK" => Some(Self::Plonk), - "PROOF_MODE_GROTH16" => Some(Self::Groth16), _ => None, } } diff --git a/sdk/src/provers/local.rs b/sdk/src/provers/local.rs index 35a1a42519..82664c2aad 100644 --- a/sdk/src/provers/local.rs +++ b/sdk/src/provers/local.rs @@ -3,7 +3,7 @@ use cfg_if::cfg_if; use sp1_prover::{SP1Prover, SP1Stdin}; use crate::{ - Prover, SP1CompressedProof, SP1Groth16Proof, SP1PlonkProof, SP1Proof, SP1ProofWithPublicValues, + Prover, SP1CompressedProof, SP1PlonkBn254Proof, SP1Proof, SP1ProofWithPublicValues, SP1ProvingKey, SP1VerifyingKey, }; @@ -54,9 +54,9 @@ impl Prover for LocalProver { }) } - fn prove_groth16(&self, pk: &SP1ProvingKey, stdin: SP1Stdin) -> Result { + fn prove_plonk_bn254(&self, pk: &SP1ProvingKey, stdin: SP1Stdin) -> Result { cfg_if! { - if #[cfg(feature = "groth16")] { + if #[cfg(feature = "plonk_bn254")] { let proof = self.prover.prove_core(pk, &stdin)?; let deferred_proofs = stdin.proofs.iter().map(|p| p.0.clone()).collect(); @@ -65,41 +65,25 @@ impl Prover for LocalProver { let compress_proof = self.prover.shrink(reduce_proof)?; let outer_proof = self.prover.wrap_bn254(compress_proof)?; - let groth16_aritfacts = if sp1_prover::build::sp1_dev_mode() { - sp1_prover::build::try_build_groth16_artifacts_dev( + let plonk_bn254_aritfacts = if sp1_prover::build::sp1_dev_mode() { + sp1_prover::build::try_build_plonk_bn254_artifacts_dev( &self.prover.wrap_vk, &outer_proof.proof, ) } else { - sp1_prover::build::try_install_groth16_artifacts() + sp1_prover::build::try_install_plonk_bn254_artifacts() }; - let proof = self.prover.wrap_groth16(outer_proof, &groth16_aritfacts); + let proof = self.prover.wrap_plonk_bn254(outer_proof, &plonk_bn254_aritfacts); Ok(SP1ProofWithPublicValues { proof, stdin, public_values, }) } else { - panic!("groth16 feature not enabled") + panic!("plonk bn254 feature not enabled") } } } - - fn prove_plonk(&self, _pk: &SP1ProvingKey, _stdin: SP1Stdin) -> Result { - // let proof = self.prover.prove_core(pk, &stdin); - // let deferred_proofs = stdin.proofs.iter().map(|p| p.0.clone()).collect(); - // let public_values = proof.public_values.clone(); - // let reduce_proof = self.prover.compress(&pk.vk, proof, deferred_proofs); - // let compress_proof = self.prover.shrink(&pk.vk, reduce_proof); - // let outer_proof = self.prover.wrap_bn254(&pk.vk, compress_proof); - // let proof = self.prover.wrap_plonk(outer_proof, artifacts_dir); - // Ok(SP1ProofWithPublicValues { - // proof, - // stdin, - // public_values, - // }) - todo!() - } } impl Default for LocalProver { diff --git a/sdk/src/provers/mock.rs b/sdk/src/provers/mock.rs index 390c494240..239127c99e 100644 --- a/sdk/src/provers/mock.rs +++ b/sdk/src/provers/mock.rs @@ -1,12 +1,12 @@ #![allow(unused_variables)] use crate::{ - Prover, SP1CompressedProof, SP1Groth16Proof, SP1PlonkProof, SP1Proof, - SP1ProofVerificationError, SP1ProofWithPublicValues, SP1ProvingKey, SP1VerifyingKey, + Prover, SP1CompressedProof, SP1PlonkBn254Proof, SP1Proof, SP1ProofVerificationError, + SP1ProofWithPublicValues, SP1ProvingKey, SP1VerifyingKey, }; use anyhow::Result; use p3_field::PrimeField; use sp1_prover::{ - verify::verify_groth16_public_inputs, Groth16Proof, HashableKey, SP1Prover, SP1Stdin, + verify::verify_plonk_bn254_public_inputs, HashableKey, PlonkBn254Proof, SP1Prover, SP1Stdin, }; /// An implementation of [crate::ProverClient] that can generate mock proofs. @@ -52,10 +52,10 @@ impl Prover for MockProver { unimplemented!() } - fn prove_groth16(&self, pk: &SP1ProvingKey, stdin: SP1Stdin) -> Result { + fn prove_plonk_bn254(&self, pk: &SP1ProvingKey, stdin: SP1Stdin) -> Result { let public_values = SP1Prover::execute(&pk.elf, &stdin)?; - Ok(SP1Groth16Proof { - proof: Groth16Proof { + Ok(SP1PlonkBn254Proof { + proof: PlonkBn254Proof { public_inputs: [ pk.vk.hash_bn254().as_canonical_biguint().to_string(), public_values.hash().to_string(), @@ -68,10 +68,6 @@ impl Prover for MockProver { }) } - fn prove_plonk(&self, pk: &SP1ProvingKey, stdin: SP1Stdin) -> Result { - todo!() - } - fn verify( &self, _proof: &SP1Proof, @@ -88,12 +84,8 @@ impl Prover for MockProver { Ok(()) } - fn verify_groth16(&self, proof: &SP1Groth16Proof, vkey: &SP1VerifyingKey) -> Result<()> { - verify_groth16_public_inputs(vkey, &proof.public_values, &proof.proof.public_inputs)?; - Ok(()) - } - - fn verify_plonk(&self, _proof: &SP1PlonkProof, _vkey: &SP1VerifyingKey) -> Result<()> { + fn verify_plonk_bn254(&self, proof: &SP1PlonkBn254Proof, vkey: &SP1VerifyingKey) -> Result<()> { + verify_plonk_bn254_public_inputs(vkey, &proof.public_values, &proof.proof.public_inputs)?; Ok(()) } } diff --git a/sdk/src/provers/mod.rs b/sdk/src/provers/mod.rs index 8475a0f7aa..fb11e5a7bf 100644 --- a/sdk/src/provers/mod.rs +++ b/sdk/src/provers/mod.rs @@ -2,7 +2,7 @@ mod local; mod mock; mod network; -use crate::{SP1CompressedProof, SP1Groth16Proof, SP1PlonkProof, SP1Proof}; +use crate::{SP1CompressedProof, SP1PlonkBn254Proof, SP1Proof}; use anyhow::Result; pub use local::LocalProver; pub use mock::MockProver; @@ -28,11 +28,8 @@ pub trait Prover: Send + Sync { /// Generate a compressed proof of the execution of a RISCV ELF with the given inputs. fn prove_compressed(&self, pk: &SP1ProvingKey, stdin: SP1Stdin) -> Result; - /// Given an SP1 program and input, generate a Groth16 proof that can be verified on-chain. - fn prove_groth16(&self, pk: &SP1ProvingKey, stdin: SP1Stdin) -> Result; - /// Given an SP1 program and input, generate a PLONK proof that can be verified on-chain. - fn prove_plonk(&self, pk: &SP1ProvingKey, stdin: SP1Stdin) -> Result; + fn prove_plonk_bn254(&self, pk: &SP1ProvingKey, stdin: SP1Stdin) -> Result; /// Verify that an SP1 proof is valid given its vkey and metadata. fn verify( @@ -56,23 +53,23 @@ pub trait Prover: Send + Sync { .map_err(|e| e.into()) } - /// Verify that a SP1 Groth16 proof is valid. Verify that the public inputs of the Groth16Proof match + /// Verify that a SP1 PLONK proof is valid. Verify that the public inputs of the PlonkBn254 proof match /// the hash of the VK and the committed public values of the SP1ProofWithPublicValues. - fn verify_groth16(&self, proof: &SP1Groth16Proof, vkey: &SP1VerifyingKey) -> Result<()> { + fn verify_plonk_bn254(&self, proof: &SP1PlonkBn254Proof, vkey: &SP1VerifyingKey) -> Result<()> { let sp1_prover = self.sp1_prover(); - let groth16_aritfacts = if sp1_prover::build::sp1_dev_mode() { - sp1_prover::build::groth16_artifacts_dev_dir() + let plonk_bn254_aritfacts = if sp1_prover::build::sp1_dev_mode() { + sp1_prover::build::plonk_bn254_artifacts_dev_dir() } else { - sp1_prover::build::groth16_artifacts_dir() + sp1_prover::build::plonk_bn254_artifacts_dir() }; - sp1_prover.verify_groth16(&proof.proof, vkey, &proof.public_values, &groth16_aritfacts)?; - - Ok(()) - } + sp1_prover.verify_plonk_bn254( + &proof.proof, + vkey, + &proof.public_values, + &plonk_bn254_aritfacts, + )?; - /// Verify that a SP1 PLONK proof is valid given its vkey and metadata. - fn verify_plonk(&self, _proof: &SP1PlonkProof, _vkey: &SP1VerifyingKey) -> Result<()> { Ok(()) } } diff --git a/sdk/src/provers/network.rs b/sdk/src/provers/network.rs index 4e9dc0f9c0..2e737ea95d 100644 --- a/sdk/src/provers/network.rs +++ b/sdk/src/provers/network.rs @@ -6,9 +6,7 @@ use crate::{ proto::network::{ProofStatus, TransactionStatus}, Prover, }; -use crate::{ - SP1CompressedProof, SP1Groth16Proof, SP1PlonkProof, SP1Proof, SP1ProvingKey, SP1VerifyingKey, -}; +use crate::{SP1CompressedProof, SP1PlonkBn254Proof, SP1Proof, SP1ProvingKey, SP1VerifyingKey}; use anyhow::{Context, Result}; use serde::de::DeserializeOwned; use sp1_core::runtime::{Program, Runtime}; @@ -171,11 +169,7 @@ impl Prover for NetworkProver { block_on(self.prove_async(&pk.elf, stdin, ProofMode::Compressed)) } - fn prove_groth16(&self, pk: &SP1ProvingKey, stdin: SP1Stdin) -> Result { - block_on(self.prove_async(&pk.elf, stdin, ProofMode::Groth16)) - } - - fn prove_plonk(&self, pk: &SP1ProvingKey, stdin: SP1Stdin) -> Result { + fn prove_plonk_bn254(&self, pk: &SP1ProvingKey, stdin: SP1Stdin) -> Result { block_on(self.prove_async(&pk.elf, stdin, ProofMode::Plonk)) } } From 8af2e2f1707880abaf3ef1c7a46815dd37264675 Mon Sep 17 00:00:00 2001 From: John Guibas Date: Thu, 23 May 2024 16:01:56 -0700 Subject: [PATCH 22/42] feat: batch sized recursion (#785) Co-authored-by: Ratan Kaliani --- prover/src/lib.rs | 159 +++++++++++++++++++++++++--------------------- 1 file changed, 88 insertions(+), 71 deletions(-) diff --git a/prover/src/lib.rs b/prover/src/lib.rs index 0b0ab87f27..73af7fd6fe 100644 --- a/prover/src/lib.rs +++ b/prover/src/lib.rs @@ -388,7 +388,6 @@ impl SP1Prover { // Run the recursion and reduce programs. // Run the recursion programs. - let mut records = Vec::new(); let (core_inputs, deferred_inputs) = self.get_first_layer_inputs( vk, @@ -398,62 +397,71 @@ impl SP1Prover { batch_size, ); - for input in core_inputs { - let mut runtime = RecursionRuntime::, Challenge, _>::new( - &self.recursion_program, - self.compress_machine.config().perm.clone(), - ); - - let mut witness_stream = Vec::new(); - witness_stream.extend(input.write()); - - runtime.witness_stream = witness_stream.into(); - runtime.run(); - runtime.print_stats(); + let mut first_layer_proofs = Vec::new(); + let shard_batch_size = sp1_core::utils::env::shard_batch_size() as usize; + for inputs in core_inputs.chunks(shard_batch_size) { + let proofs = inputs + .into_par_iter() + .map(|input| { + let mut runtime = RecursionRuntime::, Challenge, _>::new( + &self.recursion_program, + self.compress_machine.config().perm.clone(), + ); - records.push((runtime.record, ReduceProgramType::Core)); + let mut witness_stream = Vec::new(); + witness_stream.extend(input.write()); + + runtime.witness_stream = witness_stream.into(); + runtime.run(); + runtime.print_stats(); + + let pk = &self.rec_pk; + let mut recursive_challenger = self.compress_machine.config().challenger(); + ( + self.compress_machine.prove::>( + pk, + runtime.record, + &mut recursive_challenger, + ), + ReduceProgramType::Core, + ) + }) + .collect::>(); + first_layer_proofs.extend(proofs); } // Run the deferred proofs programs. - for input in deferred_inputs { - let mut runtime = RecursionRuntime::, Challenge, _>::new( - &self.deferred_program, - self.compress_machine.config().perm.clone(), - ); - - let mut witness_stream = Vec::new(); - witness_stream.extend(input.write()); - - runtime.witness_stream = witness_stream.into(); - runtime.run(); - runtime.print_stats(); + for inputs in deferred_inputs.chunks(shard_batch_size) { + let proofs = inputs + .into_par_iter() + .map(|input| { + let mut runtime = RecursionRuntime::, Challenge, _>::new( + &self.deferred_program, + self.compress_machine.config().perm.clone(), + ); - records.push((runtime.record, ReduceProgramType::Deferred)); + let mut witness_stream = Vec::new(); + witness_stream.extend(input.write()); + + runtime.witness_stream = witness_stream.into(); + runtime.run(); + runtime.print_stats(); + + let pk = &self.deferred_pk; + let mut recursive_challenger = self.compress_machine.config().challenger(); + ( + self.compress_machine.prove::>( + pk, + runtime.record, + &mut recursive_challenger, + ), + ReduceProgramType::Deferred, + ) + }) + .collect::>(); + first_layer_proofs.extend(proofs); } - // Prove all recursion programs and recursion deferred programs and verify the proofs. - - // Make the recursive proofs for core and deferred proofs. - let first_layer_proofs = records - .into_par_iter() - .map(|(record, kind)| { - let pk = match kind { - ReduceProgramType::Core => &self.rec_pk, - ReduceProgramType::Deferred => &self.deferred_pk, - ReduceProgramType::Reduce => unreachable!(), - }; - let mut recursive_challenger = self.compress_machine.config().challenger(); - ( - self.compress_machine.prove::>( - pk, - record, - &mut recursive_challenger, - ), - kind, - ) - }) - .collect::>(); - // Chain all the individual shard proofs. let mut reduce_proofs = first_layer_proofs .into_iter() @@ -465,28 +473,37 @@ impl SP1Prover { loop { tracing::debug!("Recursive proof layer size: {}", reduce_proofs.len()); is_complete = reduce_proofs.len() <= batch_size; - reduce_proofs = reduce_proofs - .par_chunks(batch_size) - .map(|batch| { - let (shard_proofs, kinds) = - batch.iter().cloned().unzip::<_, _, Vec<_>, Vec<_>>(); - - let input = SP1ReduceMemoryLayout { - compress_vk: &self.compress_vk, - recursive_machine: &self.compress_machine, - shard_proofs, - kinds, - is_complete, - }; - - let proof = self.compress_machine_proof( - input, - &self.compress_program, - &self.compress_pk, - ); - (proof, ReduceProgramType::Reduce) + + let compress_inputs = reduce_proofs.chunks(batch_size).collect::>(); + let batched_compress_inputs = + compress_inputs.chunks(shard_batch_size).collect::>(); + reduce_proofs = batched_compress_inputs + .into_iter() + .flat_map(|batches| { + batches + .par_iter() + .map(|batch| { + let (shard_proofs, kinds) = + batch.iter().cloned().unzip::<_, _, Vec<_>, Vec<_>>(); + + let input = SP1ReduceMemoryLayout { + compress_vk: &self.compress_vk, + recursive_machine: &self.compress_machine, + shard_proofs, + kinds, + is_complete, + }; + + let proof = self.compress_machine_proof( + input, + &self.compress_program, + &self.compress_pk, + ); + (proof, ReduceProgramType::Reduce) + }) + .collect::>() }) - .collect(); + .collect::>(); if reduce_proofs.len() == 1 { break; From cf1b4bd62a39f8e6591f940e6e9001c4d2010d17 Mon Sep 17 00:00:00 2001 From: Chris Tian Date: Thu, 23 May 2024 23:41:15 +0000 Subject: [PATCH 23/42] chore: get rid of unecessary todo in recursion program --- recursion/program/src/stark.rs | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/recursion/program/src/stark.rs b/recursion/program/src/stark.rs index a7cdd1fb53..c1244c7001 100644 --- a/recursion/program/src/stark.rs +++ b/recursion/program/src/stark.rs @@ -97,11 +97,7 @@ impl<'a, SC: StarkGenericConfig, A: MachineAir> VerifyingKeyHint<'a, SC impl StarkRecursiveVerifier for StarkMachine where C::F: TwoAdicField, - SC: StarkGenericConfig< - Val = C::F, - Challenge = C::EF, - Domain = TwoAdicMultiplicativeCoset, - >, + SC: StarkGenericConfig>, A: MachineAir + for<'a> Air>, C::F: TwoAdicField, C::EF: TwoAdicField, @@ -148,11 +144,7 @@ pub type RecursiveVerifierConstraintFolder<'a, C> = GenericVerifierConstraintFol impl StarkVerifier where C::F: TwoAdicField, - SC: StarkGenericConfig< - Val = C::F, - Challenge = C::EF, - Domain = TwoAdicMultiplicativeCoset, - >, + SC: StarkGenericConfig>, { pub fn verify_shard( builder: &mut Builder, @@ -343,7 +335,6 @@ where pcs.verify(builder, rounds, opening_proof.clone(), challenger); builder.cycle_tracker("stage-d-verify-pcs"); - // TODO CONSTRAIN: that the preprocessed chips get called with verify_constraints. builder.cycle_tracker("stage-e-verify-constraints"); for (i, chip) in machine.chips().iter().enumerate() { let chip_name = chip.name(); From 121c2d5fd9315d50fd75e1747c703e53cb190651 Mon Sep 17 00:00:00 2001 From: John Guibas Date: Thu, 23 May 2024 16:46:08 -0700 Subject: [PATCH 24/42] fix clippy --- recursion/program/src/stark.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/recursion/program/src/stark.rs b/recursion/program/src/stark.rs index c1244c7001..f1838332cb 100644 --- a/recursion/program/src/stark.rs +++ b/recursion/program/src/stark.rs @@ -97,7 +97,11 @@ impl<'a, SC: StarkGenericConfig, A: MachineAir> VerifyingKeyHint<'a, SC impl StarkRecursiveVerifier for StarkMachine where C::F: TwoAdicField, - SC: StarkGenericConfig>, + SC: StarkGenericConfig< + Val = C::F, + Challenge = C::EF, + Domain = TwoAdicMultiplicativeCoset, + >, A: MachineAir + for<'a> Air>, C::F: TwoAdicField, C::EF: TwoAdicField, @@ -144,7 +148,11 @@ pub type RecursiveVerifierConstraintFolder<'a, C> = GenericVerifierConstraintFol impl StarkVerifier where C::F: TwoAdicField, - SC: StarkGenericConfig>, + SC: StarkGenericConfig< + Val = C::F, + Challenge = C::EF, + Domain = TwoAdicMultiplicativeCoset, + >, { pub fn verify_shard( builder: &mut Builder, From 645e61ba522049bc91e30cef624e4436529e295e Mon Sep 17 00:00:00 2001 From: Chris Tian Date: Thu, 23 May 2024 23:48:51 +0000 Subject: [PATCH 25/42] permutation chore --- recursion/circuit/src/stark.rs | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/recursion/circuit/src/stark.rs b/recursion/circuit/src/stark.rs index 9ffc85d0e8..0864cb6b56 100644 --- a/recursion/circuit/src/stark.rs +++ b/recursion/circuit/src/stark.rs @@ -17,7 +17,7 @@ use sp1_core::{ }; use sp1_recursion_compiler::config::OuterConfig; use sp1_recursion_compiler::constraints::{Constraint, ConstraintCompiler}; -use sp1_recursion_compiler::ir::{Builder, Config, Felt, Var}; +use sp1_recursion_compiler::ir::{Builder, Config, Ext, Felt, Var}; use sp1_recursion_compiler::ir::{Usize, Witness}; use sp1_recursion_compiler::prelude::SymbolicVar; use sp1_recursion_core::air::RecursionPublicValues; @@ -39,11 +39,7 @@ pub struct StarkVerifierCircuit { impl StarkVerifierCircuit where - SC: StarkGenericConfig< - Val = C::F, - Challenge = C::EF, - Domain = TwoAdicMultiplicativeCoset, - >, + SC: StarkGenericConfig>, { pub fn verify_shard( builder: &mut Builder, @@ -340,13 +336,12 @@ pub fn build_wrap_circuit( sorted_indices, ); - // TODO: Ensure lookup bus is zero. - // let zero_ext: Ext<_, _> = builder.constant(EF::zero()); - // let cumulative_sum: Ext<_, _> = builder.eval(zero_ext); - // for chip in proof.opened_values.chips { - // builder.assign(cumulative_sum, cumulative_sum + chip.cumulative_sum); - // } - // builder.assert_ext_eq(cumulative_sum, zero_ext); + let zero_ext: Ext<_, _> = builder.constant(::EF::zero()); + let cumulative_sum: Ext<_, _> = builder.eval(zero_ext); + for chip in proof.opened_values.chips { + builder.assign(cumulative_sum, cumulative_sum + chip.cumulative_sum); + } + builder.assert_ext_eq(cumulative_sum, zero_ext); let mut backend = ConstraintCompiler::::default(); backend.emit(builder.operations) From 38acbeac40b3f515d1c791f083832b56acc2949e Mon Sep 17 00:00:00 2001 From: John Guibas Date: Thu, 23 May 2024 16:55:50 -0700 Subject: [PATCH 26/42] chore: remove unecessary todo --- recursion/circuit/src/utils.rs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/recursion/circuit/src/utils.rs b/recursion/circuit/src/utils.rs index 98e5626b05..56943d67c3 100644 --- a/recursion/circuit/src/utils.rs +++ b/recursion/circuit/src/utils.rs @@ -25,18 +25,6 @@ pub fn babybears_to_bn254( } } result - - // TODO: Add this back. - // for i in 0..8 { - // let pv_word = pv.sp1_vk_digest[i]; - // let pv_word_bits = builder.num2bits_f_circuit(pv_word); - // let pv_word_var = builder.bits2num_v_circuit(&pv_word_bits); - // if i == 0 { - // builder.assign(pv_vkey_hash, pv_word_var); - // } else { - // builder.assign(pv_vkey_hash, pv_vkey_hash * var_2_31 + pv_word_var); - // } - // } } pub fn babybear_bytes_to_bn254( From d2785b1a27109a6f85e5aa96136730ff86bf9696 Mon Sep 17 00:00:00 2001 From: John Guibas Date: Thu, 23 May 2024 16:56:59 -0700 Subject: [PATCH 27/42] fix clippy --- recursion/circuit/src/stark.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/recursion/circuit/src/stark.rs b/recursion/circuit/src/stark.rs index 0864cb6b56..48c800aa13 100644 --- a/recursion/circuit/src/stark.rs +++ b/recursion/circuit/src/stark.rs @@ -39,7 +39,11 @@ pub struct StarkVerifierCircuit { impl StarkVerifierCircuit where - SC: StarkGenericConfig>, + SC: StarkGenericConfig< + Val = C::F, + Challenge = C::EF, + Domain = TwoAdicMultiplicativeCoset, + >, { pub fn verify_shard( builder: &mut Builder, From 5dd89923c2f2f93feed128f5a4a93b88612c0d2f Mon Sep 17 00:00:00 2001 From: John Guibas Date: Thu, 23 May 2024 17:13:45 -0700 Subject: [PATCH 28/42] fix: challenger rate issue --- Cargo.lock | 102 +++++++++++------------ core/src/utils/config.rs | 2 +- core/src/utils/prove.rs | 2 +- recursion/core/src/air/public_values.rs | 4 +- recursion/core/src/multi/mod.rs | 1 + recursion/core/src/poseidon2/external.rs | 1 + recursion/program/src/challenger.rs | 6 +- recursion/program/src/hints.rs | 51 ++++++------ 8 files changed, 86 insertions(+), 83 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4e41c0e181..b50ed368ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -263,7 +263,7 @@ checksum = "8037e03c7f462a063f28daec9fda285a9a89da003c552f8637a80b9c8fd96241" dependencies = [ "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -365,7 +365,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -382,7 +382,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", "syn-solidity", "tiny-keccak", ] @@ -400,7 +400,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.65", + "syn 2.0.66", "syn-solidity", ] @@ -700,7 +700,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -711,7 +711,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -728,7 +728,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -860,7 +860,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.65", + "syn 2.0.66", "which", ] @@ -1158,7 +1158,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -1376,7 +1376,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -1400,7 +1400,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -1411,7 +1411,7 @@ checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -1782,7 +1782,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -2828,7 +2828,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -2864,7 +2864,7 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "p3-air" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-field", "p3-matrix", @@ -2873,7 +2873,7 @@ dependencies = [ [[package]] name = "p3-baby-bear" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "num-bigint 0.4.5", "p3-field", @@ -2887,7 +2887,7 @@ dependencies = [ [[package]] name = "p3-blake3" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "blake3", "p3-symmetric", @@ -2896,7 +2896,7 @@ dependencies = [ [[package]] name = "p3-bn254-fr" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "ff 0.13.0", "num-bigint 0.4.5", @@ -2910,7 +2910,7 @@ dependencies = [ [[package]] name = "p3-challenger" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-field", "p3-maybe-rayon", @@ -2922,7 +2922,7 @@ dependencies = [ [[package]] name = "p3-commit" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-challenger", @@ -2935,7 +2935,7 @@ dependencies = [ [[package]] name = "p3-dft" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-field", "p3-matrix", @@ -2947,7 +2947,7 @@ dependencies = [ [[package]] name = "p3-field" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "num-bigint 0.4.5", @@ -2960,7 +2960,7 @@ dependencies = [ [[package]] name = "p3-fri" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-challenger", @@ -2978,7 +2978,7 @@ dependencies = [ [[package]] name = "p3-interpolation" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-field", "p3-matrix", @@ -2988,7 +2988,7 @@ dependencies = [ [[package]] name = "p3-keccak" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-symmetric", "tiny-keccak", @@ -2997,7 +2997,7 @@ dependencies = [ [[package]] name = "p3-keccak-air" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-air", "p3-field", @@ -3010,7 +3010,7 @@ dependencies = [ [[package]] name = "p3-matrix" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-field", @@ -3024,7 +3024,7 @@ dependencies = [ [[package]] name = "p3-maybe-rayon" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "rayon", ] @@ -3032,7 +3032,7 @@ dependencies = [ [[package]] name = "p3-mds" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-dft", @@ -3046,7 +3046,7 @@ dependencies = [ [[package]] name = "p3-merkle-tree" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-commit", @@ -3062,7 +3062,7 @@ dependencies = [ [[package]] name = "p3-poseidon2" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "gcd", "p3-field", @@ -3074,7 +3074,7 @@ dependencies = [ [[package]] name = "p3-symmetric" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-field", @@ -3084,7 +3084,7 @@ dependencies = [ [[package]] name = "p3-uni-stark" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-air", @@ -3102,7 +3102,7 @@ dependencies = [ [[package]] name = "p3-util" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "serde", ] @@ -3235,7 +3235,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -3325,7 +3325,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -3431,7 +3431,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -4066,7 +4066,7 @@ checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" dependencies = [ "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -4129,7 +4129,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -4154,7 +4154,7 @@ checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -4695,7 +4695,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -4726,9 +4726,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.65" +version = "2.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" dependencies = [ "proc-macro2", "quote", @@ -4744,7 +4744,7 @@ dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -4821,7 +4821,7 @@ checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -4937,7 +4937,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -5072,7 +5072,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -5321,7 +5321,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", "wasm-bindgen-shared", ] @@ -5355,7 +5355,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5675,7 +5675,7 @@ checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -5695,7 +5695,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] diff --git a/core/src/utils/config.rs b/core/src/utils/config.rs index 9cb3583683..77e99c373a 100644 --- a/core/src/utils/config.rs +++ b/core/src/utils/config.rs @@ -36,7 +36,7 @@ pub type InnerValMmcs = FieldMerkleTreeMmcs< 8, >; pub type InnerChallengeMmcs = ExtensionMmcs; -pub type InnerChallenger = DuplexChallenger; +pub type InnerChallenger = DuplexChallenger; pub type InnerDft = Radix2DitParallel; pub type InnerPcs = TwoAdicFriPcs; pub type InnerQueryProof = QueryProof; diff --git a/core/src/utils/prove.rs b/core/src/utils/prove.rs index 47a96d1c19..7b90d43f04 100644 --- a/core/src/utils/prove.rs +++ b/core/src/utils/prove.rs @@ -435,7 +435,7 @@ pub mod baby_bear_poseidon2 { >; pub type ChallengeMmcs = ExtensionMmcs; pub type Dft = Radix2DitParallel; - pub type Challenger = DuplexChallenger; + pub type Challenger = DuplexChallenger; type Pcs = TwoAdicFriPcs; pub fn my_perm() -> Perm { diff --git a/recursion/core/src/air/public_values.rs b/recursion/core/src/air/public_values.rs index 5bbf7c10eb..484342f17f 100644 --- a/recursion/core/src/air/public_values.rs +++ b/recursion/core/src/air/public_values.rs @@ -1,4 +1,4 @@ -use crate::runtime::{DIGEST_SIZE, PERMUTATION_WIDTH}; +use crate::runtime::{DIGEST_SIZE, HASH_RATE, PERMUTATION_WIDTH}; use core::fmt::Debug; use p3_challenger::DuplexChallenger; @@ -49,7 +49,7 @@ pub struct ChallengerPublicValues { impl ChallengerPublicValues { pub fn set_challenger>( &self, - challenger: &mut DuplexChallenger, + challenger: &mut DuplexChallenger, ) where T: PrimeField32, { diff --git a/recursion/core/src/multi/mod.rs b/recursion/core/src/multi/mod.rs index cbef76bc41..23173f7de9 100644 --- a/recursion/core/src/multi/mod.rs +++ b/recursion/core/src/multi/mod.rs @@ -287,6 +287,7 @@ mod tests { BabyBear, Poseidon2, 16, + 8, > = config.challenger(); let start = Instant::now(); uni_stark_verify(&config, &chip, &mut challenger, &proof) diff --git a/recursion/core/src/poseidon2/external.rs b/recursion/core/src/poseidon2/external.rs index d41c5f800b..c871bd873d 100644 --- a/recursion/core/src/poseidon2/external.rs +++ b/recursion/core/src/poseidon2/external.rs @@ -440,6 +440,7 @@ mod tests { BabyBear, Poseidon2, 16, + 8, > = config.challenger(); let start = Instant::now(); uni_stark_verify(&config, &chip, &mut challenger, &proof) diff --git a/recursion/program/src/challenger.rs b/recursion/program/src/challenger.rs index 65603ced54..ceea9168ac 100644 --- a/recursion/program/src/challenger.rs +++ b/recursion/program/src/challenger.rs @@ -4,6 +4,7 @@ use sp1_recursion_compiler::prelude::MemVariable; use sp1_recursion_compiler::prelude::Ptr; use sp1_recursion_compiler::prelude::Variable; use sp1_recursion_compiler::prelude::{Array, Builder, Config, DslVariable, Ext, Felt, Usize, Var}; +use sp1_recursion_core::runtime::HASH_RATE; use sp1_recursion_core::runtime::{DIGEST_SIZE, PERMUTATION_WIDTH}; use crate::fri::types::DigestVariable; @@ -147,10 +148,7 @@ impl DuplexChallengerVariable { builder.assign(self.nb_inputs, self.nb_inputs + C::N::one()); builder - .if_eq( - self.nb_inputs, - C::N::from_canonical_usize(PERMUTATION_WIDTH), - ) + .if_eq(self.nb_inputs, C::N::from_canonical_usize(HASH_RATE)) .then(|builder| { self.duplexing(builder); }) diff --git a/recursion/program/src/hints.rs b/recursion/program/src/hints.rs index 6ebfa8a8c1..e6eeb2d73e 100644 --- a/recursion/program/src/hints.rs +++ b/recursion/program/src/hints.rs @@ -90,10 +90,11 @@ impl Hintable for [Word; PV_DIGEST_NUM_WORDS] { } fn write(&self) -> Vec::F>>> { - vec![self - .iter() - .flat_map(|w| w.0.iter().map(|f| Block::from(*f))) - .collect::>()] + vec![ + self.iter() + .flat_map(|w| w.0.iter().map(|f| Block::from(*f))) + .collect::>(), + ] } } @@ -206,10 +207,11 @@ impl Hintable for Vec { } fn write(&self) -> Vec>> { - vec![self - .iter() - .map(|x| Block::from(InnerVal::from_canonical_usize(*x))) - .collect()] + vec![ + self.iter() + .map(|x| Block::from(InnerVal::from_canonical_usize(*x))) + .collect(), + ] } } @@ -233,10 +235,11 @@ impl Hintable for Vec { } fn write(&self) -> Vec::F>>> { - vec![self - .iter() - .map(|x| Block::from((*x).as_base_slice())) - .collect()] + vec![ + self.iter() + .map(|x| Block::from((*x).as_base_slice())) + .collect(), + ] } } @@ -386,7 +389,7 @@ impl Hintable for ShardCommitment { } } -impl Hintable for DuplexChallenger { +impl Hintable for DuplexChallenger { type HintVariable = DuplexChallengerVariable; fn read(builder: &mut Builder) -> Self::HintVariable { @@ -420,14 +423,14 @@ impl Hintable for DuplexChallenger { } impl< - 'a, - SC: StarkGenericConfig< + 'a, + SC: StarkGenericConfig< Pcs = ::Pcs, Challenge = ::Challenge, Challenger = ::Challenger, >, - A: MachineAir, - > Hintable for VerifyingKeyHint<'a, SC, A> + A: MachineAir, +> Hintable for VerifyingKeyHint<'a, SC, A> { type HintVariable = VerifyingKeyVariable; @@ -459,14 +462,14 @@ impl< // Implement Hintable for ShardProof where SC is equivalent to BabyBearPoseidon2 impl< - 'a, - SC: StarkGenericConfig< + 'a, + SC: StarkGenericConfig< Pcs = ::Pcs, Challenge = ::Challenge, Challenger = ::Challenger, >, - A: MachineAir, - > Hintable for ShardProofHint<'a, SC, A> + A: MachineAir, +> Hintable for ShardProofHint<'a, SC, A> where ShardCommitment>: Hintable, { @@ -513,9 +516,9 @@ impl<'a, A: MachineAir> Hintable fn read(builder: &mut Builder) -> Self::HintVariable { let vk = VerifyingKeyHint::<'a, BabyBearPoseidon2, A>::read(builder); let shard_proofs = Vec::>::read(builder); - let leaf_challenger = DuplexChallenger::::read(builder); + let leaf_challenger = DuplexChallenger::::read(builder); let initial_reconstruct_challenger = - DuplexChallenger::::read(builder); + DuplexChallenger::::read(builder); let is_complete = builder.hint_var(); SP1RecursionMemoryLayoutVariable { @@ -626,7 +629,7 @@ impl<'a, A: MachineAir> Hintable let sp1_vk = VerifyingKeyHint::<'a, BabyBearPoseidon2, RiscvAir<_>>::read(builder); let committed_value_digest = Vec::>::read(builder); let deferred_proofs_digest = Vec::::read(builder); - let leaf_challenger = DuplexChallenger::::read(builder); + let leaf_challenger = DuplexChallenger::::read(builder); let end_pc = InnerVal::read(builder); let end_shard = InnerVal::read(builder); From 8bac5b3cca4d49215627a6cce267d46a4101fd1a Mon Sep 17 00:00:00 2001 From: Chris Tian Date: Fri, 24 May 2024 00:23:49 +0000 Subject: [PATCH 29/42] fix clippy --- recursion/program/src/hints.rs | 43 ++++++++++++++++------------------ 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/recursion/program/src/hints.rs b/recursion/program/src/hints.rs index e6eeb2d73e..353f760b91 100644 --- a/recursion/program/src/hints.rs +++ b/recursion/program/src/hints.rs @@ -90,11 +90,10 @@ impl Hintable for [Word; PV_DIGEST_NUM_WORDS] { } fn write(&self) -> Vec::F>>> { - vec![ - self.iter() - .flat_map(|w| w.0.iter().map(|f| Block::from(*f))) - .collect::>(), - ] + vec![self + .iter() + .flat_map(|w| w.0.iter().map(|f| Block::from(*f))) + .collect::>()] } } @@ -207,11 +206,10 @@ impl Hintable for Vec { } fn write(&self) -> Vec>> { - vec![ - self.iter() - .map(|x| Block::from(InnerVal::from_canonical_usize(*x))) - .collect(), - ] + vec![self + .iter() + .map(|x| Block::from(InnerVal::from_canonical_usize(*x))) + .collect()] } } @@ -235,11 +233,10 @@ impl Hintable for Vec { } fn write(&self) -> Vec::F>>> { - vec![ - self.iter() - .map(|x| Block::from((*x).as_base_slice())) - .collect(), - ] + vec![self + .iter() + .map(|x| Block::from((*x).as_base_slice())) + .collect()] } } @@ -423,14 +420,14 @@ impl Hintable for DuplexChallenger { } impl< - 'a, - SC: StarkGenericConfig< + 'a, + SC: StarkGenericConfig< Pcs = ::Pcs, Challenge = ::Challenge, Challenger = ::Challenger, >, - A: MachineAir, -> Hintable for VerifyingKeyHint<'a, SC, A> + A: MachineAir, + > Hintable for VerifyingKeyHint<'a, SC, A> { type HintVariable = VerifyingKeyVariable; @@ -462,14 +459,14 @@ impl< // Implement Hintable for ShardProof where SC is equivalent to BabyBearPoseidon2 impl< - 'a, - SC: StarkGenericConfig< + 'a, + SC: StarkGenericConfig< Pcs = ::Pcs, Challenge = ::Challenge, Challenger = ::Challenger, >, - A: MachineAir, -> Hintable for ShardProofHint<'a, SC, A> + A: MachineAir, + > Hintable for ShardProofHint<'a, SC, A> where ShardCommitment>: Hintable, { From bdd774df5f019d4eff3f6a45d034f26c14b1259c Mon Sep 17 00:00:00 2001 From: John Guibas Date: Thu, 23 May 2024 17:34:30 -0700 Subject: [PATCH 30/42] fix cargo check --- examples/Cargo.lock | 290 +++++++++--------- .../program/elf/riscv32im-succinct-zkvm-elf | Bin 1987796 -> 1987784 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 116012 -> 115996 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 127668 -> 127628 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 190348 -> 190332 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 196684 -> 196668 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 2162940 -> 2162928 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 295340 -> 295352 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 200548 -> 200432 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 1175064 -> 1175032 bytes 10 files changed, 152 insertions(+), 138 deletions(-) diff --git a/examples/Cargo.lock b/examples/Cargo.lock index b5faaa8719..c0b7500c5b 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -106,9 +106,9 @@ dependencies = [ [[package]] name = "alloy-core" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e30b83573b348305b9629a094b5331093a030514cd5713433799495cb283fea1" +checksum = "f7253846c7bf55147775fd66c334abc1dd0a41e97e6155577b3dc513c6e66ef2" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -118,9 +118,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545885d9b0b2c30fd344ae291439b4bfe59e48dd62fbc862f8503d98088967dc" +checksum = "8425a283510106b1a6ad25dd4bb648ecde7da3fd2baeb9400a85ad62f51ec90b" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -158,9 +158,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786689872ec4e7d354810ab0dffd48bb40b838c047522eb031cbd47d15634849" +checksum = "7e30946aa6173020259055a44971f5cf40a7d76c931d209caeb51b333263df4f" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -198,9 +198,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525448f6afc1b70dd0f9d0a8145631bf2f5e434678ab23ab18409ca264cae6b3" +checksum = "db8aa973e647ec336810a9356af8aea787249c9d00b1525359f3db29a68d231b" dependencies = [ "alloy-rlp", "bytes", @@ -246,9 +246,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d58d9f5da7b40e9bfff0b7e7816700be4019db97d4b6359fe7f94a9e22e42ac" +checksum = "b155716bab55763c95ba212806cf43d05bcc70e5f35b02bad20cf5ec7fe11fed" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -257,13 +257,13 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a047897373be4bbb0224c1afdabca92648dc57a9c9ef6e7b0be3aff7a859c83" +checksum = "8037e03c7f462a063f28daec9fda285a9a89da003c552f8637a80b9c8fd96241" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -356,9 +356,23 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.7.2" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dbd17d67f3e89478c8a634416358e539e577899666c927bc3d2b1328ee9b6ca" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89c80a2cb97e7aa48611cbb63950336f9824a174cdf670527cc6465078a26ea1" +checksum = "2c6da95adcf4760bb4b108fefa51d50096c5e5fdd29ee72fed3e86ee414f2e34" dependencies = [ "alloy-json-abi", "alloy-sol-macro-input", @@ -368,16 +382,16 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58894b58ac50979eeac6249661991ac40b9d541830d9a725f7714cc9ef08c23" +checksum = "32c8da04c1343871fb6ce5a489218f9c85323c8340a36e9106b5fc98d4dd59d5" dependencies = [ "alloy-json-abi", "const-hex", @@ -386,24 +400,24 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.61", + "syn 2.0.66", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8e71ea68e780cc203919e03f69f59e7afe92d2696fb1dcb6662f61e4031b6" +checksum = "368cae4dc052cad1d8f72eb2ae0c38027116933eeb49213c200a9e9875f208d7" dependencies = [ "winnow 0.6.8", ] [[package]] name = "alloy-sol-types" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "399287f68d1081ed8b1f4903c49687658b95b142207d7cb4ae2f4813915343ef" +checksum = "40a64d2d2395c1ac636b62419a7b17ec39031d6b2367e66e9acbf566e6055e9c" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -518,9 +532,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.83" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bdb32cbbdce2b519a9cd7df3a678443100e265d5e25ca763b7572a5104f5f3" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "ark-ff" @@ -677,7 +691,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -688,9 +702,15 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "auto_impl" version = "1.2.0" @@ -699,7 +719,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -821,7 +841,7 @@ dependencies = [ "bitflags 2.5.0", "cexpr", "clang-sys", - "itertools 0.10.5", + "itertools 0.12.1", "lazy_static", "lazycell", "log", @@ -831,7 +851,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.61", + "syn 2.0.66", "which", ] @@ -994,9 +1014,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" dependencies = [ "serde", ] @@ -1026,9 +1046,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.97" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" +checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" dependencies = [ "jobserver", "libc", @@ -1101,7 +1121,7 @@ dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.1", + "strsim", ] [[package]] @@ -1113,7 +1133,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -1143,9 +1163,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.11.3" +version = "1.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ba00838774b4ab0233e355d26710fbfc8327a05c017f6dc4873f876d1f79f78" +checksum = "70ff96486ccc291d36a958107caf2c0af8c78c0af7d31ae2f35ce055130de1a6" dependencies = [ "cfg-if", "cpufeatures", @@ -1224,9 +1244,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -1290,7 +1310,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -1316,9 +1336,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" dependencies = [ "darling_core", "darling_macro", @@ -1326,27 +1346,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", - "syn 2.0.61", + "strsim", + "syn 2.0.66", ] [[package]] name = "darling_macro" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -1510,9 +1530,9 @@ dependencies = [ [[package]] name = "either" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" [[package]] name = "elf" @@ -1629,9 +1649,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38793c55593b33412e3ae40c2c9781ffaa6f438f6f8c10f24e71846fbd7ae01e" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "fibonacci-script" @@ -1756,7 +1776,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -1902,15 +1922,15 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", "http 1.1.0", "indexmap 2.2.6", "slab", @@ -2116,7 +2136,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.4", + "h2 0.4.5", "http 1.1.0", "http-body 1.0.0", "httparse", @@ -2290,9 +2310,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] @@ -2449,9 +2469,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.154" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libgit2-sys" @@ -2505,9 +2525,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" @@ -2575,9 +2595,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" dependencies = [ "adler", ] @@ -2846,7 +2866,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -2882,7 +2902,7 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "p3-air" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-field", "p3-matrix", @@ -2891,7 +2911,7 @@ dependencies = [ [[package]] name = "p3-baby-bear" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "num-bigint 0.4.5", "p3-field", @@ -2905,7 +2925,7 @@ dependencies = [ [[package]] name = "p3-blake3" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "blake3", "p3-symmetric", @@ -2914,7 +2934,7 @@ dependencies = [ [[package]] name = "p3-bn254-fr" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "ff 0.13.0", "num-bigint 0.4.5", @@ -2928,7 +2948,7 @@ dependencies = [ [[package]] name = "p3-challenger" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-field", "p3-maybe-rayon", @@ -2940,7 +2960,7 @@ dependencies = [ [[package]] name = "p3-commit" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-challenger", @@ -2953,7 +2973,7 @@ dependencies = [ [[package]] name = "p3-dft" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-field", "p3-matrix", @@ -2965,7 +2985,7 @@ dependencies = [ [[package]] name = "p3-field" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "num-bigint 0.4.5", @@ -2978,7 +2998,7 @@ dependencies = [ [[package]] name = "p3-fri" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-challenger", @@ -2996,7 +3016,7 @@ dependencies = [ [[package]] name = "p3-interpolation" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-field", "p3-matrix", @@ -3006,7 +3026,7 @@ dependencies = [ [[package]] name = "p3-keccak" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-symmetric", "tiny-keccak", @@ -3015,7 +3035,7 @@ dependencies = [ [[package]] name = "p3-keccak-air" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-air", "p3-field", @@ -3028,7 +3048,7 @@ dependencies = [ [[package]] name = "p3-matrix" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-field", @@ -3042,7 +3062,7 @@ dependencies = [ [[package]] name = "p3-maybe-rayon" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "rayon", ] @@ -3050,7 +3070,7 @@ dependencies = [ [[package]] name = "p3-mds" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-dft", @@ -3064,7 +3084,7 @@ dependencies = [ [[package]] name = "p3-merkle-tree" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-commit", @@ -3080,7 +3100,7 @@ dependencies = [ [[package]] name = "p3-poseidon2" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "gcd", "p3-field", @@ -3092,7 +3112,7 @@ dependencies = [ [[package]] name = "p3-symmetric" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-field", @@ -3102,7 +3122,7 @@ dependencies = [ [[package]] name = "p3-uni-stark" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-air", @@ -3120,7 +3140,7 @@ dependencies = [ [[package]] name = "p3-util" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#da0489b75025ec17f1100952694d8b7879c2b43e" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "serde", ] @@ -3262,7 +3282,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -3346,7 +3366,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -3405,9 +3425,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.82" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" +checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" dependencies = [ "unicode-ident", ] @@ -3434,9 +3454,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" dependencies = [ "bytes", "prost-derive", @@ -3444,22 +3464,22 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.5" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9554e3ab233f0a932403704f1a1d08c30d5ccd931adfdfa1e8b5a19b52c1d55a" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] name = "prost-types" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" dependencies = [ "prost", ] @@ -3676,7 +3696,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.4.4", + "h2 0.4.5", "http 1.1.0", "http-body 1.0.0", "http-body-util", @@ -3923,9 +3943,9 @@ checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" [[package]] name = "rustls-webpki" -version = "0.102.3" +version = "0.102.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" +checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" dependencies = [ "ring", "rustls-pki-types", @@ -3934,9 +3954,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "092474d1a01ea8278f69e6a358998405fae5b8b963ddaeb2b0b04a128bf1dfb0" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "rusty-fork" @@ -4076,9 +4096,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.201" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" +checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" dependencies = [ "serde_derive", ] @@ -4104,13 +4124,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.201" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" +checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -4142,7 +4162,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -4184,7 +4204,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -4209,7 +4229,7 @@ checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -4678,12 +4698,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strsim" version = "0.11.1" @@ -4706,7 +4720,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -4743,9 +4757,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.61" +version = "2.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c993ed8ccba56ae856363b1845da7266a7cb78e1d146c8a32d54b45a8b831fc9" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" dependencies = [ "proc-macro2", "quote", @@ -4754,14 +4768,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa0cefd02f532035d83cfec82647c6eb53140b0485220760e669f4bad489e36" +checksum = "b8db114c44cf843a8bacd37a146e37987a0b823a0e8bc4fdc610c9c72ab397a5" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -4896,22 +4910,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.60" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.60" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -5017,7 +5031,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -5068,9 +5082,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" [[package]] name = "toml_edit" @@ -5142,7 +5156,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -5381,7 +5395,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", "wasm-bindgen-shared", ] @@ -5415,7 +5429,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5714,7 +5728,7 @@ checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] @@ -5734,7 +5748,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.66", ] [[package]] diff --git a/examples/chess/program/elf/riscv32im-succinct-zkvm-elf b/examples/chess/program/elf/riscv32im-succinct-zkvm-elf index 9484a6e6eff5ca07d11d302444a204964a4e8884..a844cc02ee98cccbe112004e93296893f200fe87 100755 GIT binary patch delta 4692 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 F{{qKU6_Wq} delta 4706 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 diff --git a/examples/cycle-tracking/program/elf/riscv32im-succinct-zkvm-elf b/examples/cycle-tracking/program/elf/riscv32im-succinct-zkvm-elf index 0b1f4f4972e308125ea6d6f7c5f3f63d87d13d7b..d8af5bf0a0ab2c1f5fdf36645f17bce6a956eb3e 100755 GIT binary patch delta 3822 zcmZ{mdr*|u6~ND3*GMwPunuj(61m%;VX95RP=X0Fz$7}RQUyyRz9PO7L<~r&MZtW4 zZ$!mFW{ra_PVLmTj7qh$dFV(gwc22lI!VTv+LkoC?YBlkgTa96+W(oyWi6?&gu`rFOSd? zgaZL3;UbYEaDn9?cJ$szD;%6Ak`dC0VZvj}yB zKCf0QJDNW~mNgS!lA64mPq+B zEmfAMzynnt*G9v4tNE&M=3J49DPh5k)P_nAT)x^1fAv|BOX$;M`n%+@3Xx5J^->=n zef=JFpIWeOiAYj|mcD>n@^9d`*Jv5EY3^7iGI&8ta?DRaURX{Gh_ln`$2=!89KHFO z7G+k8Bz&Z0xaB9KS;I}7TThFmJ6dv)n+y5$8IcRmd-RW3>g4o9|aMp_d z=41cEH_wxT5^^E_Um;Y15)oZoX**II^PPoAGtMJ=!QozmglcgdT zo3)f${hnHpQaE1!qu&)NXt^D4g0v&ZqXFh;8gd5KBoJ@N7l@n)-)Hrikx-&?!d=|+ z*^OGxAvXQ_2tK^Y<0X;aL{;tVp2KObH6eC7D3|AnyoEQH1M&!MegZZ>6MYr@ChU$$ zK#stPfA_{qNWFd)d<6^Nh4c<%QkJ3r*Irf0QvYHJ;;^t>McP^@u)B)vGGMHyM zmyO(<`(p(I;H_)<>tFyLj)OtVx9TFbUsU_Uw|E&fFL{Z~ zry+SX05`D)^hFE5q^gzE#7MPc*Kf~%W4_3ckF`vW*#)E?E`k#+zXmt@_$J&vMth^qMQZ&P0_yx|YKy_HqCjMcf%^FN7+T>LY>a_)IYN_h&o zdw7#JflWNAfuG+tkays7-T`^65eGkFXIlF$aH-G!Pzw`F!tp|{z<&Re*779Kr^XsX z!#764TFnmy=CNCPwA9$b3ZpwT-;R*16G^(Fk-8I980`)74a{mmE?2djwDRNdCG6sH zgX`H%FlojnkJa!1tD$5A@*@Ymf!e!4mbm%b7x?b1Pt=y?9 zj4pUkr44b4NviR(7xf#dQ3&+XCr=o8Hi}&IWiF4xV=ZsTl_|N<=b~wTVYSC9~j!a6Eya zEQ2M=I1I4`z!embgxH*)H-knV(9#uSN6AqH`e0n3r0&~(110ametm8!pByS!Y!j@5 zH6775z)#^s*v!2N_$N4n`84xvcpKU{7PEHoyA*zhNV5ok`LM|x%?afxPmrof9iWML!4~` zE?P~8wrc6KJi0;T1_^Akd^ed59Oa6czgPli5oFM^1Pnqv@~$;J%U$jtbd&M#Nz{Lb zIZfUj8vRb#e}&Uq_@6`pxOJ~+E&AW_3Ty$Nt*67x*u+$8(7u_k!U;082G`)elPp53 z?_fby;4p3@wyVK#>O=|9)Smtv{~1RZ`bB3ba4& HBKG?a-CTs{ delta 3839 zcmaKueQ;I96~NEFJRmv&-(yk@nl_sfAuXxq<7oqBAQ_SJ5l8~5q6P@^6(KYUB18z> z5F#HjKxkqgI4OnEIt(zyNNLuVn~w_rnFCiX z)>32nA^2pC$4#-!Thwe-Jik(8{fM~n$tC3Bz2XRqX9SNKf$M0Yw5LN{&KNMZ=aU5xSfFPT0#l%v)#%IekziJ+0 zto*=IkqS7G|AZ$+ikffu%a@%jjHUqQGX?2|H31|FG8E4t_%K^!UkWcSzMb`yOLA$C@199hATDuhEZiVbVWy<1l_4E=-91?biMm@WriM z6nFmvGK`xL@fo-b_dJII>tF#5)rUOW8u&Auf`MMk1D}d6yMOR{eF%dXQAzREfd&aDn4>GOhAcIkg|r6gu{e`Qn=3-z|Uag zaFBI)8r}nswS2oHQi*JU(Vg{$m3jv!rk0S z8^F)GQYZJ_P>}QRId6kZY{b9|%uK7l1FrDtA8V##2{@5x(z^cGl%zT29#YKfssKOZXl9 z46_L)%y{Q98iq0&$~##<{A;hFURf`40y}9|Z_GxKkKmx?Cb$>wXE|k)NYP=}k75pCp@HxAm{ zM5cN2Y4QOJEd*eyU;-GvnbScbQOzgd@jl)Mm-zTIc(P|us$=CN)PbP$QVHGiy4ziY z3I9X*Bz`8~$8i5CTt~Rb@(3}R{zXXFijk> z4(nG^q0PMGE$6Hfxk>;VE#E<8Ctv4?>A!dYe`g`v{&vG$^1Z9Mme0EnbQAGk2-JUu z^2`4L7Omy9)2Asad|{p8usV zJUu`6|7+ZPbK}#RROQVjN1N2bn@VCM*Q!Y1<|1dE`eWNbeU HC;t5h{$_r2 diff --git a/examples/fibonacci/program/elf/riscv32im-succinct-zkvm-elf b/examples/fibonacci/program/elf/riscv32im-succinct-zkvm-elf index 8d210ea746f1f06942b6801c1f789b06d3a093be..2e43b761d283e4c2e95f6fa7e197b519a8eb20ef 100755 GIT binary patch delta 45964 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 delta 46407 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 G*zf;HHrplu delta 5354 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 Ao&W#< diff --git a/examples/json/program/elf/riscv32im-succinct-zkvm-elf b/examples/json/program/elf/riscv32im-succinct-zkvm-elf index 218af530ad586ae4b01bbad23b7e1f55c86edf81..e95f0998035f11d0bf06e6337f580ea287b06261 100755 GIT binary patch delta 4519 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 H#Q6C?0UVup delta 68967 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 diff --git a/examples/rsa/program/elf/riscv32im-succinct-zkvm-elf b/examples/rsa/program/elf/riscv32im-succinct-zkvm-elf index 4edef68abd335d9220d9a66c448c3ad13a6c4d2b..f480e818f106ebf43498e2341c1415a2b1111a71 100755 GIT binary patch delta 6565 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 delta 6548 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 diff --git a/examples/ssz-withdrawals/program/elf/riscv32im-succinct-zkvm-elf b/examples/ssz-withdrawals/program/elf/riscv32im-succinct-zkvm-elf index ef27bf0f3729d8a697d5f422bbc23b9d546185fc..a43244f0649b244f54c0fadf5f19ade5b30d93a1 100755 GIT binary patch delta 32462 zcmbt-3tUvy_W#)%27%B}9x5UZpoWMz?}wR=3g&~8q$+&KtEv`~V&Vn1Ob~vkwhi>2Yu}IhJ-(a{(+RDf z<6D_@P<55KKqYbiL2qT}^XXidH>NQqDMl?M)v5$H}VN_hj#~F1_2ox= z{5O!VD(kl>nli~-(KCYzm%Ph*X3^@QzMVb4A+)f>w=%~~sX%>Ka$k;3?J~)$N`!N4 zBuSMZunN&ZS>Ap6G-|8#9@A%0NL&G`PWN>(yg;aJoOh4$F)EDm^*8+)M~6&cV;&-1 zy?5I(IjhQ+Mg3d6>uf_at4DjIRe~cy1$RXYUX_4eqU9ch6`--1R?^AWZO}hdY5sHH zwNsUF`J@;jk;}4DZb@}tU*4@TlvZc>48xx#)F16TJOWqYXJ2^{uC`Bnv7>OUuJ>&m z&H2y!Y`3o>ZN$bxjraK2UR|X7`AMn*DEA|7Fk%c>js#HO@j4niy+?{?r1|3<@u~-9 z8)8KpM6v23U&)=kufe{{hY>V=podC_kS>M`{d2Qlt z6=tMpR3Sp5cBazmG@r$}8P?w6JLy`AYd>Gbl-1Cj>5H8PY>V}+nGWp#)u$=v{G&eq zeVo6~H-0APzvw$#!TFE-s%LS2g)gyk1qO1LcjN5WXmydd_(2`D4fig_MHuSc_uy+; z!p({ap-I8xE+jII81pl}B@bbALN{ODT<8>HeEa61kLq*2;ws?k&wQsJ0T$lyRe3mn zy)R)t=P&YYe2nvFcnvl03`m)jgdj$A5yjM^zY`oWs(kKXb0g-Gs&PBIkK)N8@vA3! z4Yj5$;ht+)I#v?1seDUn;l1hsKEt9>B&)jDHRK1&-G1iVxES(6TW`@5U&Y%3inv$v zBx3QBZ`hMO7Ju`dU&4L(p08#p&!lZW^)ilE`*tqp<9@_fNL5z&qTfSjoMi;4?#q(+=i6yB}(L@oUk2mqf8RA@yWcj;$ zSHAe^RmH8E$SqU7)f*eq#el@jb~h_-p9#FUeI^#S@A&xF@KV5$ie$jlK#?x@Zrs!- zYD42B?~zSIa~tgode++Y-yakl?P3y>RJHb~;i@)CDj`}Q(_@gMvVls?YVF>F&G{6U z%FTljMDL!>85|wk+%wDejV$Bzs-lIYg~&6}Th-!J$c|n$)vMl;->!DHSGAq8lVXZq z_LgiJKy3@WYqw;@H_nr&)&KOK+?4J;y`{rYTZ$tgjwW^PC76$5xY4Qw-p31s?C#4k z1cIE#uz8U?FAn>Oq`3D2-kLb!yNtLioG;P+>zHj0>Cd*0Akp5cx)B{v7I;W`#FqsE zSfDDr$LgM%!u_dIRn_y37BMdA8)0rn6Q$nM!5gPSj8 zXDt`Z$ytIoy2g$P8-*B0ixpCIsIWCVKe{vt>qvIq#!_$hZ8JL9K1HmQ?2O{wde3hg zH=@>_{hF#Yd#kF{(IJM4E>x*%g-g9nJ99e}KFy(bp=yOlUZnDRqj!~2 z|48rDUE`>&o7cbV4JwTAR_)Hsu-%&7Jvv72EYTasV~TN{=V1{{-tBw(dH>vGeaYkmq&QkE7KA@4ot6YSVkq*6U1#&-1N;9H~8Gba(_~Ku7u}1$nmZoF`kl);ng; zBx>u39>!7sPu|$QBY43o-rJK_$BW(W-kVN^Z@fqLq9eNEjagLqkGJxT5!Cjv*Z;-< zTKMdWH&bchbKXvGnyBp;-IlH{hwI>}9qFMCT444}dq@7e?3qzX?Y)yfMf&mGYr{>8p!@4Sqf zHpAP$VKo)*^c`u)2OR8+KIo>YjeC8nT?kxf9ym-e?n8esZ*@~D-Ph`Qy#A(K z+PK$yuIVRgOZFan?;{#t;H`TpM`yj_saX<)9QbKH^Q5Ls3wem`jCkVC%x$( zPDpFqgM6d%lqd-~y>X{^*@vkU8h46YHk1KLM7TRBqH26aib3NpuSz4U@UIH;V;XlS zsct|X-k{8wd%}4uK1z!ZYN+>i|LA4vZ}1-eD3=QFc&~gkBF6SscK4Mre8#7*_#}p^ zhIlJJPR+nYNd|Em3O945k|CAb=m6mG1*xpCc8U{5os~IHi*|Yjhk6) zI_Z~x>1aJ6mFs=Kqh@1WT|;iWvH6t1BxF@yY+)*13P=&@lR zBj$K}M+O%3!p@UeayK$6Ejfa3yFub7PhwTw$Ox*+Whb*qFLt3D8Gg00KZ44N)i4r` z4y#Ejzn)cxHJ+H+LSx~FU}JwK8O0kVW=V~6vceiapVd<1&y>civ&p=xM&W-iIEt0o zL0z-18h~w|qK1`sZ^0Y>T|qrZx=VW0J;D&FBpf$Cwp?s%hTZOM&d1 zT~nDem*~<|)32##doC%Xsu}gky@{2y;ZszldYBdGkz86hk5%W9PdludI>XCKm!VkWNZ11lOIXZ}8zh`{Ojvy9#aBb zBN>3zafDP&mzj7q9kkm_;z10s1Pf-P|6gpe1uFbK*>(#&U;P_9ZXx5S>aWaTMY0G# zF{hOb#nS-WY9$A$@FlD4M^^Mu{WVFY#%@Z@mqt7j^RiL>QMRyB@%-BCtc`4PKIy^6 z+)QH93YUv}iZR?r{)fb|@CYp|T+S+P=3ZXON{67d)jpk_3*X4mf^Sx_?VMlu3~Ra> zLq^_3_lLcW&+{Sgro!v&bbqoGlcv7%7DSCU-ow@mBxNnlhy)uFwDx7O&Ms7KV;UPt zjd4qZS*R%11`Q)0+mJKE; zQGDu_=95m$KbZ8nS+#4@%=6v;BW1W^{`~7RKW7M6yI1rz?`DpO_Xly)5M)m6ewJRq z3q?IEDu8^gpVbubnR1|hPXXzGxT zVp5}CEySCqZ1KU%WEOcb2U+59j5y}6EN?h@huTiD^TRQbg|<9bjrH?KkREu|Q_1Q^ zqU!tiv&$n%My~B`UJAUm@z5TRHIq*co_MIxk3~m28lq#xg&J=un5_tvSoo1GDI#xB z+X*)8Hu6MP^$}n6vjTPmDn|lzU}Ex#E526~^$6?P#oI9O>W^9XQRJQYRUb(4ZTyg( zAH~Z}2}>MJa$Cx+qR|))_)|xtU-Z8da#^a<1)B>?lVVbZBy+0ZTll@8pYpljplzbF z*EN=AZ#Y`IdJOzsc$5{7fu9?{W7}P%WBZRH%EM{4a}2TqNpNxuQoQyD7JWMp%L}ak z?c{A*`y;z@JL#FGI+vt6AjmI6io`giW(f;=E}YEzkHz}aSjy_g^5XdmJ3W>>6190# zDRbUICd8llMH;5+xB8|#c*TJIv3HWJ4z=%!uhqo&P2A7IB-Z~G4pCKQvV^~LmijCR%AUIi_F`Q9OIqmD-!Ir_O$l}sVf!!1CPPS1 z33*xR^Wemm`pgK*7EO}+Tsx_yK9hreo`&4jeYOkfnH=h~XDKP6g+17nQj*VJFD1id z@L-U*!7dTc*-41FqKs%Vux-TiZ*XfVx$~%G1~zgh%g6w19qZK&gog?}*c=z11U5bi zQacn5YCa2UZ)L|^m|L|YC4TL&=6qEVD{}K1dK;VSCaXK_x{W6__SIv=r|>m%9NRvH%;LEFR0$VNB?~z|BI7GEu9+tBw@xF2X``e5{50|oiK+b%PxT+N zJ@+EvZU10r@8!lFsyCFQaL^P#yZj*Ls>;vOA0ppVm!E0o0?+o>=gi@iGels;bBUX- z^0R$&c`cY(pEwWdDQeDeZ%jHrx3qEH8YBU4E2ra2{eSJ!Di|?JU03CaE;c<0Yw#RFfXG zb`Hy_Chzm>#cDis4Y`XgnU7`m*1K52W3UF-m5)iArl!ZpH?;6BR=0qBN{8OXs%pRo zK2#&}SJ#sHZBXmI3x__!7T1#5ZNzXCKEk3GVjr@wmQ^k!+H7%sEv)jYD*A{o7R1*v z)$N1U#}q!ynidjWyBJ?~_XC3YpL}JB@v+!N=uPEg;};>Nr+P`HOxEGDB;Rd2!-(QpM8hw6B_@g8<$FRSbIQcUwWA=V96CJBnbit;_Nz|s{WWnY}p&p97wY&DSnx~LmjrXxDPa)2$_A~WT z(l7PQ{-hW+;t>PI{x)1Owlw=$#Zn&G{mj1b7q(5zZul}T$%!tZr{D_Yjuk$_= zUv^3FmHy!IlIcfS1>+mKBWy7vLpyAW;xY5aY>pMLZC0nTlMHK1<57t|^lOQ}@Q3>3 zHN+W5s@dH2#6c?SPpl^$3E-s-q+7=JG_^2%#)J0qY0l!g6)qvUn_B!8jsKE1KAq`a zBw10;G&LK&m-JyZFOs6J8@mKsjI}$b%_+$awWwsjyhyf@?dVS<9OJ{@L1^YZ;U-rrSB#AA1mn4uJ_WZl#ruM~OV7fwT3a-4%9Cj3BvV#5b zE*VIhzF-5Ih$;RexHo|d{Ad&QfClzf6X{JV*^f;`Pj?<;8Sjx%7=TzNXG%jQUJ{I-&w z#E(fVt^04$G_?5dux%N|IQp-FW+w=u;48i?^3~avy)Er3S;a|KisqcD>JQ)>d`&kN* zhVA&8WRp^M^lNf++|!_Tgyd${`8bli36R%|&8+Y^xwmuobCM+{T(dy7VW`;g2qyO4 zand_(4#=s1OW7Z2oVpb-4Uo@s9>S8@4+~q*G1Cb$seQ*^;4#oR--NSc{iYLSiz;Q< z>wgAff%(BT=izK(_U}kiuRYxY0bVcp!CA#P>p)BA1RVT26(`n}?~oliYWDVbB!gff z03;{bAK!_?%sfqQN-fR~1iMkA4c-O`!?M|=(Qsn&8$AaEIago1Xq zqWNSoeLPAmwM$SIhG_$VYKf;F#(B8seb(V-D?4!pbMy-P{S3*bY9q_|o}{MM7z2R> z-U0_7cyg2=R2kU|-;p$x0rwZ#wC`cW6%$)}mZZgTWphA2$6o!ObV)gBZSJ-@u+Fj* zXn{QV<9p=ZdDiC#(k*5CEr9?JA3wx!AOMG%{Rf2O7+B510nh}R5{_gvnJS7u{{!hr z&)>qsk;V@HK%%K-Ap7P!?0V1rKw?#O0|S9I?7~^nktLob(JHkq5GZD+&ftrZD`-ES zY0r}EuE~P}fl6*hLA%6o_w`o^LOHwtEL^mVJq1bZS$3Qy-MZQe0)e842HdtiXi&j^ zfe1}5WbJ;$Q_B(Yn#ycHlIX50hr+XbY8AB8D6!z}^6;juhS`6FkCw6dKO#e_hXn%N zc@H?$I4dEsjJ@9&TrnaL;C|pn7tAN33lBl6oRObM(r_o(brM^xurGss z5p>1tymM~sEV7^9rWX%Ti5|i5LWRMi6s}=+@CP{H?sBUq1VmCu|=JMoaO@`xzQ{GULzCxSdV>86#WA=HoJP=N*AS zDH?~5Y%wP870|g-e((<0f)-sI$`qc6+d;bsxdtv27EV6YL*T7t-hJiK)G&NU+gIiDnS_xZz4pX7#u8^;} z_!6)-vIFNx5?y;2pHIlrb0ju3d3;C(x8w-q)Zv7|@D2A#6hA z0PX>AG5h5__Hrv(=L=9=#jF=F5tp!u7f6?0O>>&(?|5vw&Vt7E@VC@6V zhIU890;sqr%=x0cy^^@SJ=dEzliK=VskH&E-KrTfxr^>)#AI(#4jJ0rkrZAK@$2-_Xz?XqV`+?sBE>hG14=5D`yd@D!5^ui?xEff4 z_8j*tgFfH}8SetF>=NV;7Sv7*7zA!FZ?Fw`J8+$h_qh1$9JOGRvEYV5z|k_E#?D+O z0nevXAcm)_-XL?klaWw0z>3}Dfa}8WE7PzC=&BZ)WHtW)J_I~W_QNC7k!0OM-JAnX z2e!%b_uY%t8kpMwv#Ib$z3boP#;DuJln8>_7IMf$;Qqjhz2(3*;A&aX!@z!ET*UF; zI}r}5&jgYN@(FAFgLKn9KNE2tiVw$8)VQ1aR$x9As)b}C;euH(wpgjv4;w$Ku8P{ zsF3{-_6lLx1^g36fY~A{+ycB6SjnWbz~|lwWm4`OYzV?|IdH<8nPSFsgI)tZujs!M zg!3TuhkzP$oD1mYqL?TGz?Hxye(;eZoWC1*8K#^v;>*BQ4Vi*pHn88kRVF&llg=Fk zqhG}$GX-xH;cy@-90OL~QF4Adroc4tQBXzxt-w{lxQKWbZcgKSRi2;(b?5+abR9Aa zn72>&H z06zuXKTQ5(VE#T*!wo`4bgaTN!zNECWfp?KU%J|4fu7Y^prC+b?$CoUNI9Z~3xTQC zFc>3T0wP!VF7QTRzHo4S+kB)b4C)L%Z(k0aj(44+$ADi2{?Y>hn=J5sL%7UN+F>_p$7)zms=zf42lt^gAbB)@D82;;UW~MLE`i>i0r9@MRME*Mt$GkuAzg zU#{@UM={A1g>YG$$M~cOg)Eu_D0~(Bk(^WaAK$C2K9-+!z1wYX4rEfu&^27LSRD#emeqx z6@mX5fjjUCFCRRo@+0twaO{DAJDdRgSOk6{0>2S~Kaaq_Mc{U6iaAnFf*f{yhSB&(J{v6o~E7;gH9%KLWPN9li~` zM3G177M{S%0AOqo#no^yaNhe^|0l|Xx6pxda1VSPfqw^H`#~nmmJICM4IKb022KDj z3d6O)`_N%F*N*{g11<^Ue+69rfhVLurN)jXOh5yy{D#LB)WBj*BetAGa`6Q4m4h4n zNCaLNf&UtTzvtM4lOJ3`90sQx9Op&g(Ghr71YQ+^vA+%;qDLbzem)QOFB;Gx3nM%d z@<@MRbr^O7@BCOT)DS6Wo&y%b_>I7cVfgRB%I}rjgPnOS_3duva;)aaPW za|M69Phhu=49Ox2z0U`4yVur-0L8ku+W^>;bj`kCNMe2Yen_E8}*3@Ut4a)ydcj zEdD?(VUOShLHUK6cknc@_!G6<;BQaD9U0hG^DISWN?3xdRA&n1GByEMWrp~r!27a7 z{3n2Ox`+60K)-TC3sDyWpR-GebYRNZd^}RZbxKGc0p7@lx2Ij&*Ws4`>9yqLXyIoz zyFDG)L)#Z63oYN=X0!?p} zRn2@_5Pnp$imHSL;4vC0O56$Uo0NxIpO|<+S%xuv3*4a36iz~(N zb#O0y05Q(j3Ae153;-6_pkW)J01XmkY=05;4Onz46nx4qCDFbyzrv1_$5?JMO{1N4 zY-lna(B6&oJPc7~n9JCzWR#!ttPvMa#}#<}VU#{Z;FjI+EMAWpLec0Cyb;(SSte{i z#}|Q>#q{@$&GF<-&GDfKJW9`pBpoQM9Rkyv69NlaZ3^91xB+DUm!V*O2%HS8jN&qI z5wH@>Y#3M^#vcW|lFdz}_ju;w_A(rx1al*>^7#f2-p9aBG*yE6Z{UrM{DlsbV!WV&SfNc`?2%mz`079~y4Q-ysyKZx)_}e*eFlaL} z99WLN@D;Ge66#R1MH&G28h<>W1$-O^D9Nx3_z__06rhaUk+zg55!=h0M7CV z(_Vrk1W@zE24h}^0r-?g%mgU(0+)y3&w~>n0Q!{!qh_CVq4QOL0dW|+JDqk> zy@%UUHW#-Y{()N!tnS2Bp@XhgwmF@??RgBfrwJxtK8hw>!b-s9_`$oZ#Y(VjM5fSP zHu-np~!DaeEmpc=hHxy5CuCH`=YI@n$#%pMojHwG?d@RVC6G2juZOhr&6?SD-X^LTnDTKclA8XjI4+jGl!+~tAGe7xSqa;545<=6R6_$d zamPk%m4Opv+;=C9-ramX4CgoCvacPe$S?FdSc--<(osEOgb4WMXLmue^%H*?rkA3|Fkek#@m7U zXNC&@D`5V~p^}U$n;?FEC^`oEHNgB+#1yH$N4N(B{#_#XBsX9oF#ksJ1{v=F=HDyI z4TR&s{M$tZw;6=ZEwH#0^8ojCj#^D8x?~W1M_bk#nn&1k2gLL_=k@uiJ}4D z0P~L^JIgq3Flrt!f3?UBGyrb_Rt%mD%s-Tjlle~o^N%LuWxNZRe>|zQKMBk~q!jgg zpzwwv_`DPZ#bOh1^r?^w?ZEtN%Vb&M65t-dU1VGjj4v>Q?f(YMKg3Lx`E3iZ+X7ZR zW&!3OXmSsG_=p@J)Pyxy3e3OURARUnc#GVC%bx~r48u1TBKd)d++japH8NB$<8Du5 zXLt`5Ix0<`o+~jqkks%X#*f)l2f{iukS09-{1dnn1lB+S=Qllz0(3{Hf|=JM2gZfA zb9cXhE%3xp2NTyJzf1A$tK9w-tfV=2VFMx?@a6%H28@dxCHV;lo7j_F^7)U zrY%ERabyY=vf+0F9|KkfG9R8*4!*J3$adw>f!gmQ$O*iZ%Lf^!_%@u8dk-%HU!)(QK7uS`=g5gLHUPY>Y_fz!kAQQ({~d;-`IhR*=^55vCz zj|pLx)Q8?q{#ozpLuZn*#jtfBI**3!e1?|4i47Hu>m-lm@;=Pa-4dUVz294y0N|@+ ze(c*=ksp@a&D%cNRx=lGV9%+wcK?Fl0V;rH*^guXOQRfGFF9KFR8Ry-n?SAr}~YmnO>kTCCy_nUGX+pMAaDZ1ORFjh zl38&(bP8@4LJG!-Zd(Cd6NcXc-VQ8gA*9X%F9vQS%O{P&Xn(GMR!`%JY5+h2d&z(< zrr~xxdyn6)#O+k}BW^wWal01Z@+Zoze*#widVmKl`F1=UK)bT_833&O9RcT01KtdN zoZNmTu=0lmoWCDf`O5;1e*#wi!T{JKq>M%Vg#pS!ZUbHl+*VfDiBGzPlGAujyar6b z7u|#4od*_x36}@fVN%9~;Y#2(VR$!iTo7Yxw0l2h`HIlv&;7`T_@Dr`PQa&OfKmlw z8wBBB7_nl&2;lz!N67{(0scLV{}J$?VK}i7RYH;Xz~ZqWM59AR;Y#4BFavHph^ifi z?}dkygQw^3C{q8(2>vuNd?Qa1*c?V)R#qS$15;DcohZqXXsdIXK2_G}FHA zH%0XG4!hG#yY=`M@Jko)w^uTL1-JxVjhE$r1>Ok^4~z0ztU_~s z%@p2|&K!ZuBJfiYcuzCTKDE#e?a$Ug=QE*Kq2IAf z78I>hu+;)G|74Q;qTQX%yS7GPX9Rva0>2S~&qUzFan1C50yj4&1l$pLc?8}Ufq#g= z9qww@LEx4MJhd4vxDfC*BU}i)9f5z0z{x!9^1*{Sa6EJOqoX{P@Z^!T_@gj6t6l+a zctQG*jC*!^M7vcH*dKv^j=-sRE4@ldF{nAFfpTWNnRe6OJP{Kc{l-F^_sg2g1>T9k zzpz>~^SJND7ALG(rwPrw8xnzMMBry4a6<(Cdjw9qr)%D%IqkNQ&0?K1r5OdFg&9S20bXfLKGDM7uAM3EOnqT zPR$gy%kBNZ3D~(Rc&ZcI;CcAFNZDim0xo_CsY>v0$Q9n=g3D%0MV#YVz$J6AL6aNY z@5a_;KYsX@J2(bh-k=sMFPHByMG&eFs)ZwMWETTh98e1dvizE<2mw4aOvY`dVW)?; zV;25!$`!neS&;XpT39Cww;ETwKa;%bEej)H7$SVd~Wzw z`M|cm7?3=GSAiQ4b3QrSV=ez;7W!KRgV4XI@R0|wmK;D9%N_g)d;}w2D=T=Y5`u53 zg(6x0;dxm0HifeMFTf|2q~ebNk09%@ZLrDmT3{vS+`yHdxU(~pIw?VYvFXW1@bzb9;(r7XmV!Ym#K96l?2oF6vg z@ry8`PeMufF|h4OC}}SP7k{J{fBfJE)jxqs3Hf#M06IO1mqYtzAcj$r2Nr-Jbi$7@ z(Gso)UWS+^g4`Z4ec~y+p^#s+w?~qF0xaOAaw#sngGZO*CDhnVp+F8%+tqmW&;x(} zEb|%g_MVwSwT#ml=AY&!{PZsqHZVL601uN5`UbcJAv!B7T)YM@&CL|5WO*-el}p+@ za|7BvgAV&=24~62=dfnxA%t@KyPn6iLuFJ#{L>4_!ozqA7A@yM!UiaOI#c{R3a+r% zMiiP_yeyIxR06MMp(K3cRk(ZzeiD}rdgnFpQD_#+_|& zQ)cIDh5RD>jF~g?9WIAKZ+Du?oO-KC?=~CD>@HJTnbGdHJ9TEKF5h_Fl3Hs^qMjDD z>aSm|-qe!X7PabhSBrYCF)qFSYT0XvTCQL8Dj#^R=~;v3y44!4KVDjkFnPi#gJb3_ zm)?C}rJl_hN{=OKoJOnGVAohJMypj{W?-ea(mw5VR+GW)c54i7tI@61Xbai>V`=A> zGbZR-vqfvsxysynhr@2x+Rbj4!EUh|%S=X>U1u=b^Mj6URnnk1pqZqnC8a?JG!tz} z^7;)8=3sN39j+b|dv_R}>@pY}W~2^E_18ZvLug#B z4NE5n&NCywb!)Fbb9C45E}b|o4`0YywLpLUS+2c)W3?zE9%(6U)q+qJZ(a2IjWrlN zN_A;ft@iqZtG)gxc(CTk+lf{!&|SX;y5REAidGLQSg@A2BCE*{E&Q#EUY`XXUPJZ4 z>Da1T?f-}9_0&d>RK>N|pEKI)8yFu~Xjga5ae0F4$n{&GyZ)5Xx8{S%p_MGOr@E%K zim`_4p5$!cSeky-=6d>As=kW&%vjpbW!2doI-^!+(VAR(YndUqPtaIhTAkKqH(AP@ zCW}d9aOtqeHft<;tIKXN*z<#l(W<0Y+$Y@H;y%G77%Z0i?!R}Y+n{w!nP+^UOn9I| zJ9*x{58jurE3@0}MxE2-Dl_V_-xr?-G>rU6&He2zyTO2sfl+I8Tbvqu&~BIAVYOS0 zT34CYU~rd}*~|2Hy~F9Wmszb=v!g6uYhdffQvDQ%PE%&km+ACIi^in0y8b^j1nWZU zotfGEVya2E3@aQoX7ZTPcWBL1oeqcI?SjMgWiF#ht7DHA(~%yX)nRg)oY?W`GjC(X7)r5H6!08+T1% zEA8~GavUAxahi-}2BS-3ahU9Gx7if*9UhY02B*Vrv6u{clc~(1)4S~!m&I;zJ2gm& z{9tWqRWca!t0g@VN`tG>)uIuS!NSt2WN=f|f~2eYm_jAH1=$GEV7Y2l)X2!)G`-$9 zo}ML%PP^V}v6eY3PNzv{HtSfQ3ACdpk}5yF^Z8sc%jKAPUj_c1y$AAJ6w`~5ZdFW5 zw3fyCNVbT*8e3IYe|`czSeR?VgP_A=F}n*(5CJdrw$MyJ!DGvi6pEQ@P(R-MkI)fzNb4J0fky+y+|ucxIQ-EO>{K=$bz zdcD?#@``_x^8r^SSJsX7-#{lOTD4_nybEzV%}%{jC$wOXuWMw4D&<}kb5S|>ZT ziFRV2y+pgRo9d`8QHP4?G+NvS6DF$Fq^+;mNbMxisB@rFYRa@)W0_Oy((-1WL}+rj zold9A?QoPiG|u{p&9sEv=+bK)E{)Y~HM=Y(yPf5|1X+h!XEiwS#z^CGLEgYMbY}H+ zv;&K&qnYf7O}Lw1N1sb{YmCSMt=^63x{S^;mT`&R+FP&FX&pMJQ*YLlVU@Ee(Qd)r z^(8OUDa6zK>HO-4^L(vQ@|GD-xH_ZRqBokYSX50WqeY5X>l#eg)*wZ!brqIts$i!M z(ImEdD;=4rG1#>hlUuK|W1V$d%h-jjbXxybb5j3*qyt~N6LkiS(QGmsj9O%^$?0S# zUZwLA5hSf$Yd65z*djXh?BpIgG`FlwZ#3A=Wk$DK?=oPKzP90G_R=XyEx484zKxDa zEYq2x*iznJuo_I(vNERwn-2Ej z4%(Y-*+Eki%?7Pjuft+vwpa}ojgzwq6YV;@mvQR!R;||V!iJ?j>vbA~EOxp~X14`- zsL`0rdUj|B&0`K9O-?jg5dyacFFMPxGFtU)k&ix>XfzsKF1sEqhuP>vf_L6Y@Aqi* zX1&`Ay>_?JV#NPzmy}tp?$eZstk+uME4|KWz-nx;V2g5{3Z&dl&evY8fx%h5*|1%- zYogVN%BeN$vFCJ`nXL}VS?hMuoWwG%TVu8BG;V_q1J;Xv%wy5JXD; zgr(bPVEMc0f<&{}%^rVGtT9+zjxwW8r(_MUj@Zg-bsE%b zt3g{ot)9L`u9ajhjY8w6Q$1IY?mGRW6x;t=fjGB3_qF8U>oh^0`7Mm?Iu%&+J>m-a z-)qondCn>e()AC+ z6Zs^l{og$ySJ~?_!qej8sP=!(Y_0YB@)EC5uJuf;`yW%=p08^?vs-&GzqT*glDBCW zw%~1Q_O$v;r}z_lV~xeAH5sv#V1J9X#Vl2d)-}lfY)OMh+*-D(Lh(jRDy~n1QYj)d zMDuZoZxRw+MmLsP>`cvCv)!t9OB)Y|)9QA*O;)W&$2SZnc?pS7BWe*h9xX9m@l!o} zU^5-U<~P!_?A#{Wmc8^>+OuD)4_k5?>9KLpVf(8!;wejO(wH>th6ef|JK?8&6YWNW z#%{M5%?7u_YBp~HY;!)kPDop|lzF5_?Xq$$~|0{t~LT-yY8pn+yE=Rw-5 zm(F3wivn$#$!^u*DXdJ6_SOEc-*b?D5|gYo=`N46hU8#{Rw3H>3@^ejzF3OtKf&}~HWtvw1>qqqM0qm8wQMb^hA?&BNQ5iAEe#2jW z{*AS37nKzw{-4QTVkUmizx6qOiA}d)sxI& gN83f+MAouD_@#>VxH0M`)$t+tP?_C+V^q@r1IM$chyVZp delta 32491 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 S-R)Dx^sN{-#{4hh{qX;FOsInZ delta 275997 zcmZ@h3w)2&`|o+*ZC}h~%r@JMugl!0%_X^?nUO+s%O#fyiO3|SqF!c|65ky5P+}sf zsLAC^s8=YuS*21b6BVVbbWw@_bDrn@-q!Em=hMgcyyu+fcAoRx&UxQm`m*oJ6McPN zaov-R3e${s!qERm8TenEVPMPfWmGqO1KJqAC--+Uhqm4NcYBXI65q|!B+8g<6uzbM zV~2=-O4d#^jcnzlW_e0tjPGsdOLZwVw{=A|{B6Wfh>11}pF3#8M|+J4zK&Mma|`iz zH6#Avss_*)Ck{&bMAubw>yPm`dXn9dVA>g~qG~f!9#JKA6VzALudV%uik@%8$7Gp6 zh-|;ItK4eZ={!7*hwoNSe6A;6lbF*6NgQn2Nj#ty4|pjwz#78?s`3EA1D**RaEJ%| z!vikzfThb)Mw#|JWmmn~l;^Q4Nt~e`!(NusC$Z@B0G;vCQ3m+5P~@F@G%UDa#WRz} zC#s@mGt(*9X4h^YOyh0BV7$RkM=eX~tKLYj>7mI+Kb$;V_-Tmq3Jz&5ZroNquAMOL z5~ge=&66F1vbqqUf$`goSynzC{wNP`s_ssj$MndB%1KTVbE(6qM{u?zv=&Zl957tmK>bcH>~Ai<#znZnv~E}BiGxk28+Ub}t}-GnquRB#zldbgd7Wt8 zP_3n>l(a8{F{U#{Cn%gtk@JjKaNe~lrEwe6NaHC9Jf)PTJk$8v+Fw?hvKFU|anaP^ zIng|)1o=*VuC<|Jaw`IpLW*E4C0_q!hJGi8o+Ms#zGYr7aM$=U?o3zS zv|&t%jMtM>j0Lme45w33Yuw?vL*k2K3@D*Ryq{(`3CQq`wSNjw$IKd0$ZRsK`pHUC zZ4%N|db8f@s~tVy$7UinMpI`0uG;MEr+#Xdq!#b2;i<5+whC3UGui!pRXIB|Qt7#K zZUzz%A3a~FBHXw1%s#71-bnM5nmEsCq}uq?d7gb*RlJd&nyKMA88a%@o{yYo995Z4 zT55sNG#s8$(ePZQ{u8RqpT@Az!pV;^Qf-Yx7R;y^_f6zj`Mv74Yk-UQ4dvU_KE$8# zuJV5D(qtT2wkg2Y=gPa=eJnp!rKPFr>i%jjh>yYBO57Ynr0-GQW67x%SFa+Ob&!oi zk*JMLP})i~BT+g}DEnAPk3%9{r3zk1NOkn?HEu@s_D0UL*Qk=$5>maIeP<2!?~d#@ zHmkDNa+w~dSlO>OR9*MD^vRv7^wofv*MYZTwTeWLJn#)6uI%pNahqru^>(zgnq`}X>B1x!M1$;t{2qzB^W(fdkvP!R`>@|8y<3I-yCVCI zbmc6}Wg2kZs~2UZ7LWm}k8*k?axBIl{amgX3Z;H6a8HiZ&T5v&T<1OEU5&ep^^_j5lbA}3lUSX z@{Z~eLm44I=U@C+q2)exeXq3C zOxkSI|Etgv9Z@e=u`qVq(95-X#!M7LC55&>QRjONa2INek~!|8*}K)^oB$t3RNl=A zNvL=;3?riw4{xdCIWFDCK^4_|n5%f3RetY);ysPxeLHfVy>i)*4sZ-Iw7Jc8D7q}qDD^w<=TUr~9l=c=?x4JhIg@i9U`J_Q@2 zRR2lXlbxhCO{&3k*|$MllyHf(CqibFXsoVGicKY|q>fx~9XFDIGl}noq|d-&#t#b`;5cJ-C824I^^xTMc4E z+pUldWU%q7?1dEd&6L(EJvUCR`Z=+7NTZnO2Bc98ttx30VK!PR-_-6d@xN*h8=Fst zXBQH`QI+;dY~XwvQmuv?A_+5UsgiBl;U=pEcPLLBIkr2Ypqg0ZDIsoTajaP7DbPA4 z??t1P4oB*W9<_Bi9;Q_G$51ap3{dO(CBfVT;i{GMHTV(&YUP}O(gbl$<(bA?P>~=K zSksI{|J5|-0C*EcT5O4?&1r-Rb%Auvc^wK8MS5x;*|vvJk$#BeO}+@FIFY@zybdRR zS80GB&f)-9cpIR4lE_Gvq?d^(y_1on?Kfd)k{INUehSsBIeeTXQkv76*c*f1)!dOX z!;q~i&E5%h>xp!p?Q8=XY#3W%T0JqWD=+P;AefXL^{r<6(G9tViFDE^N974QUPfJ{ zb&~eByaQS!i;kUqB$IoBuEXmS=tfDP)Le5n$f%ScTLo-;2j5F836DWbbOce2*go{mPO2?_VPXV~X5H#de9 zckP-=hzecBO#ziEmU(~1@{f$adr(=P@K!Z zWwMI9-z8tRRGIguyJMO`W-XD$4Wo&YfR!3DRn?%hk;q8ecJ=CH%D%k|>@fwDdgTUJ7mA$fM(k#uSb*2*3zm&7mrCpv@1>>8v z{7kv#gJW1q`z|2V7c0#a${x{57i`MsW_Z?X=^l7XIjcImOdeC-kr^Hm*nxNzmzN}V zsgijKZf^zn>SzVfsv*~_k_Q)gd|LVCF_rnyDo;M8sw2ry4medeEdM9N7NShCNuwr_Lv#2-nO#nn9}= zk?QKkGC|^pOoryD7TIWcas=XzGq1fVKxKl>H#Dsz_);1Ugxv*nVxuK{Cv#XlG7&@`#>T zc8nEKT8R?KF_IF=kF;Y{gZ{o-Jvk{seerjEbDrESXo0Kk=!0r8F{s|$-$m8^Cq0!3 zPRB|{&r1DG)zE*kJln`1Oje8kY2-56KyCl0b5cB6o7l)Xb`=$MIg2-9&iYDybyfe% zon07)T6{S>=>S=!+L7b1qITx;Bp&BnRC)hqGe6GNAU{=h)JOB!HgX=OXS@DQcj4Di zXa03Vaft!Tm67~h{-W$FuKBU0)zuN_?1~m>;8^^}$gC7SzFVJJ|ivBr}esBb*ogeMqNRN3il_xEgVcX(V8*&T+z z00Z@O7yd&Oq!V4vWHLS_+W1gFbU3&K)Q@#iZG1?6PG?p9kB*)KvJbgrd&q}5pCXN+ zD4pinH)z`vTW;u8!)nOMJ!)}5vikgm+G_02t(guib^Cs9$-m{TWN&!x097!xfoZ&? zO26yw4!st$yyl&Eq7i%kKSc#z+|-aBHGD3T2`t@|UN{vi$?R)OzCwAY6~&SRGakV9 zVpTfrDbwDAIy0fRK04rVJd<)fEUoVB=edreodas_PIr}L6Dp$;#j+8VQCVWuBg&}s z%&A6YR4Q>AJE)Ax&#`8XWmHMl{LKH*nqR1lT0y$sCqipzzPv(ZRQhfINM%%mn9N6} zLR!Q9RjG_hzp<9?+m(@|tMm`&R^nIwL?u;*|D#qW{`n6n6N9=GEU7ZM-$M#zd>v9K zxfNLoMc54I9UWowl9f_LmGnvOA$=;>?!b8vISo}*83mqRpf4-Y+&OizKU7g=updxG zm3|w$gB4Y3+s8w?6Rg!D6bTLE}(eOeONLVy}y-4B|*+G1Zw##ndwL zUgN2lDk%hN7ce^sR|9H9!4IjDTvA+JbP{9LXuCdzKMeaR_1<%?l{Nif$INFpeDbTOpuSZ<`qwa>R5X0$BR)~a%S$h9(J9_fTs$wLMb$Hsy_WlSfMDv_3 zss#HpwIwxHXe$&n3=H>rsuhg=*{iC(=+b4hSM^_PpkDsjZQFyX4$APlQ?-C`&nELk z&yD7~^4TO#8{mU9F+_<)@oMh932OJkI2hSL#JR$Z=WL6)x)PCXF@^t9wzXb| zKZTESw#6NPQnq!P;-cY^;;~OrwnagK6Zf5jjv^qHK%C*=3Y% z(QkQzvMv67p0X_-b53VliO{MMhSK!J_zqL9KCrBjNOHM-pYyIlopXQl5)k=Ld%APDvQz+-aAk&p`xYpWP}~!{&AdyQA75}B&=Pc0TB+3 zyQYTfmHeO=)hqe;Ky8Hh=UDPw^xM8ASg)kEGlD!9{l-fiK_g^fln|DOF`NwTxoAC% zc&b!A-4j=I`mtp0u)xdv@Mv?R3xe~-!~1G zE=$QKHRcR0k1Wzm%Fsx`oaIVqXleZxs;p;{lzp#9z0t246J!6Y%KEu-xBpQU{jyS- z$nVf3g)%bc<&5&(ndQmRmgm6Z%4yz+VK`r_iaR@da&#(TomT}blU2VNEt1w7*v|Pq zxHk!g{6yI;(p=ncs?9U7ZlpI-PIBZpqg-8{F@VR(T`I32mw)5g$m#-@UgMbBTafOK z`B0U&%;w+Ddn$A0bpDNZ0P+T8B+Vkjb7v$DXN@XvmCFiZFHq$JF#DoC^n@z73yZQ8 zE7+*-+au>mrAqEg-LF>9UgRmI z`0PH_=AKm^FXdU6Q5l-6J-3YVTu%}5w<>N(l4?KthOQLL89vm=e}ZreNFcWcQ{R{! zy)nQErSjaLuXc^b6Cv7NH)4Oc$oa+%Dr$_YI5}fgw=sAUuE!d^)xGgoxPII7(c4J^E-MZ$@ULbn(x*j9evW`kHq2p zqssGJCY{zBukg0WK3PS1$0x*c{`UpWEmh9Imdv;FEBeT+RD*Kvt4PZWk#p@h@`}tO z;=pnw7khQxK;3w2H3nmxA!Xf0`{Dzwtj^mZWo@`B5~yKdgnpBXpRgphlp=Y&c7dgW zyr&b?Pan*zMuh@A*uX+T`P0MHzN69;r}YP&Fdk1)Yc|HFmXa^*jbaL2 zf?)R7P)wdrX-zcF4_$)b{+B2wr{7pQ)G@iFu{R(qp#+cm@k}}Y`I}99sjft-ub=mt z_S4HYp|f}igYZ_SvkBwxR;IC$!fu)&mypNHr{o`x^&5u5?tD^UG#8ls(?ZI8)!~JX zo=kdv2fDn}g!4#4$m7urVirg&e3ByreuN zO1!*RfAbR4S)w*?USrzdkUs2R-GJ^|ar9K7wa4k9DpvPZ5A2LrH$3Cg^OlX~IR zIOvRrzG}@gv8l{x`-s4aF}I_@DUXz8Ac~s3&Ds{!rx0{plPyQ3FF1UA^X&NJY&HX$$vfarD$|Z4;KQQB~!w&31n$EZdC*7`&yn z8&3=xW4527uB>&Lwj1i0N$uVlr&=D1OD)jaWB-MV6{=e^hTl|4iK{)%=jy!@S9^?a zDQP2DVqg(IENY^8_79;{-_T~Mk`5V{C~8`;t~C?ud_%`)<3gvr1V)+|HnlSGwuinl zAW3iURhiFrcV~U7@-8&)L8hV{i4TjKCgQ5&T@}`(Jxy9P6-`p~U4n6;dNyOYNato% z*Kg)?5o4@-*h@}wD@9BO85xW^Q|qbGooDBaASbD|J>n6C&wGr?wg;~R&*$qB1k~A% z&e5Q&MR7X@VkxP0rT&AeZkLwKgIue6cj?^eG&!|bD~;P5gi~{e#OUkVO8u{??Oj}1 z*gMswE(3xv`*)r0A(b}@l+!iAl~<8E(KU^K8ylB(!$6C2$=*S*c_iWoRbIC=4t(TX zb$7Q$sXhvShoX$jf@8gUEP^k^vCQ_v>R7jaJl3v_veu@E#X@j#>~-A(a355o1HUmD zvAd_m^9~&p+Vv;jQ2AZblBnEI_3UsFKcdcbAL#~XGgR*$8J_kODUGE$mgXy`AQHcv zqBi$v8FN63x=?-D;~UQq9Rph3)xn-CJhaNrITeVDi{4ICulI{(6j(seF)@n=Z~tOU z%q;0c(NIiG&#=U*V`2)>a#~VM%+K5Fm^f)YiM%S3#&d8D zOX09c9C+}dLt|Pc`!foSNds`}>d?4^HVocx2@8!G7hXTb(0H4UK&*sHFn^=an8snz z5kupaf2#1Tyqpr39}sHD12EP9Q2fC&zo+L*tw#rw&8=^Vqr4hnI~sM)j}fOcv;1Lo}=C_ zi&t%baCJ$(#@RaK*u_Vs%*gr(heOYtb>wik?0hijaJX+Z9hDk-Bg#n;&W3?MO3sF2 zDS0fy*>L{~b~e<&bVoZIA6e5v+`S=Z!~G?ER4U0t%n2Qpa_>T&tMkw0l&jNkJZjNL zrSu!Gjq7_wG#{_dc#kzqxDw%U81e*)S9sz3@kwbMp&Uvs$4h=Z3F!-kEi};>MJ}g+ zER~MbLoSB_PY#}xG6}e)zq&@uq{N&dj3GCZsj*?$7(6KD;e9YgZyZBebvhrG5{-7N zFa-)Z7n*|=SbbPZwF74gJC-<#V%w8rAq_I#rK=cfz~?#-ukCud4tx!Rz}W4$Fvvuv zMHB`ZPbw7#n@~y^$Av-eNT9;t0kVdnYCH8w0}F%g616cr&_B2>xvM(Y1*u{GMRmbK z${@5wWwS+nMiSKpdC~={3-a@Ss4mFAv0jR|FnCNAzJ);zCyH)i&~N)ZR|DHuvOGNS zGp+`*y!UZ6kaWU1Ot&ydCv07Y3Y7#I-v?L{Y(+fggc4&0`UPFWpx?$JT@X~AR@F=` zBZKoHf(n%Zc|1laSO(Q4SDxJ;?Fa_G?bw7EWJ0=g znNQz13|S8bnnTvZAr|k7upSI9kF3YquQEkfx?w?2ol(oaZY}z#ygwU?gCT=Kee#;n zk(4u#Ee2_q9sfTq1_Qj2EQVJLPabBAkxwe=CyPNEVQfc@m_V^GybwOy`^Q+m4Dj-(-3%I^XnCnmd)wH~IM$I^V3&&kZbng=I7h_Z*#X zQXXdGt-`R3hWr1Z^G*7VY1ZB6NfMO*-GC-|~yF^G*HQTo|u-zhA#H!thTA zH3mZz{mKY~`UN$HUm0O=KZmr&{uI0((I8PDLWZ4fGPpN&g_sv=6P<06>NwlT``G0F zA4M)hXPXRuH|Y<>$x>UQkhNv7Z_(K%{l+&p0&j~@+xT$V*Qlv`mG3)D*k;kGCJ%g$ zRES;LY&z8>!thp;KGo#OZw5~_^R)6Br|49(fWooY=v1>zn-RMe-}t+ok{7hqc;k-& zEN554jb-d=ytG~BMz|V!hNl?%#vcc_7P}hmm`$!`J^7&gpqrpRXB?eD6;h5fr&8Y? z>}zPCF%o@Ek2(iFi5z3!LvDs)4J0>1zwJ@vX88A1ax*+;GP@aS$cf};=(o{7%*`Bd zBC*I$>}F^;8ENchNbO|{ax)}T`%hflkegwA8Fcb=fb9N-N>ICypP_Mh`$~tnzp3yL zw^VOlCljHDJPs4yi#!g`#L@zm*qZ1R=fFPlIE*;~Jx<#ga^ml+@;~v_#=pqFaBr6O zFQ>(af$H}vhO30_^Oj5Obdx$#pcLKg`QKg+dD3W}~3f6gRQk{2FrGBA~y`7cH z1fR#^TKC9)tW|msXL%-&TC7te4maYLGO&PPAMTuVnx4zZIrdRicG$fjdf?GYeP612 zN8A@X(EE2gf(e!8KIhHIaq>I0_{aeF1(4TO`4KGYYn{dyINH3E?Ed~j^?wIXgGkpu zQ*++QNMZqJSAz91)p+yumXc_-P9BWxcV5#q-cC*EK%tWA8XNy-jhEI!Zbb95Px*er zmyaJ;CGU3R7qGBouS>c##K1HDaXTxadzwnRLnt7tq=|A9m2?^WQ#kh(D(SK|EFhYTre@SOaR2{yxMCc4Fj+S{Q=uhTPo1m)|Ld*?Kze4U>UrhL7SRCH{RVCplvQ@%b+ufYLbmEoY6`|wp~ zJkO%v@>)92`dE*%+DDFa@MSbS&*C|4C~2qPPA5v*`FCGR+IdVaCGGUvmXx&9Z#=ru zNjs@u;l)TCb{$IEX#wOPl(chcQee`any?$KPUs|yv3Mw5r%h!|t^_Tf(sdf=T&9@$ zWXGEB;Yd}46-v^X$`sNe9v@9Q6t68<&Wn_!Grpfmbyz|T{vXx(Fr+$RNjlH3#z{J< z&I6dFFENc~l%JQ9mK10k_pbPYog7a&&Q6XR_L~t-j-JW=xbqyjH;dd`=!}Q^wz7MphOw4XDcUAEAwx=i_FnRFJZU-kIDTG2K8}CmjVDZ{ zc+3{|anz7_`w=g+({E!L`?z>*jt+#v5QFx`JniFJiwW%A$|%^ole}A=HgARw;6gTq z<~aCj1Kz7xPu?wbjK_#=@@_QFo=W!RcNK15eB|Bmb+a(<#xox!-QbzCNH;9& zLuxl?AmpG;Ikhi0+oIuLq2g8Le))kCr5PWWo6!wBOdnUB9BVc2a{y{AQH>p=vR_V-Bg5b0R3ylpTq|S8XaNdY*vF5OQe@>zm*$ z=KA>Fm%hbJo5Z>rNt^StIySr|^K4;0gQt}||2P_>#;tO%sQ>7mjaM?qJs%0i_#>oy z@)YUb$7JPa<55*-25BE5yA)5G`h)+if^tj9E}bln#9@Dn_nz@B){zg#W>Q@K1_lm~ z=xfhv-l&3D5{0hG9lfG&J*xq?NKXkFtbuO2--2Jxa9#{tc!ov|(9P*LE?774TN-%d znSbw~8_)FHSsQW0Nzd?Ic75a7pzXert{d|6Rea-_ayxz07dqNxxJ7j1ne#QB)r3x~ zxPKWPZB`K6hv>$$p;K3<0+|if4{5CP3?EkM`-U{ZnN9Z%xpTfw;`k?C*~BD{;V-2d z&-7a^*6;k|s}^{^i1!Q)I&{Cc61deZ~x`A~Kv&R7E5=>-Ak>SA zGAItB$NH5ljDt>J(T5jvBMHPeQp#KPiP3(;*hyg!=>$4@eRd(qF6rWWC>UZ)Z&5Im zL#}T|C6FIeFvQgD)vixXo>eo|CWoiLl@JPsXbjdfbU@AH4?$c<(H^h(=xaTUYKyiv z9yaw=ST*b?L#h!L_we{5e6fe(o~Cp-kx6WPPr;8*+Y*@xB@<)ntJ@!4<$09y{vuUn z5q^I{ucuwC`Y&=-!d|YXEgHb5)^Z-!hH{ZtQ$^$VjYyC2RmfwD8u9C}_I`DF5x$mA zd+Hw5;<0}G*$+eCfBm-7ynMCzu}1Czwu3U!HX#hIGff?SEX##8V%g(UQY*+->TUgL z^#pz?hs4%E)nC$?voj|SO{VrO;Vd;$1xxV4 zkmkeLj(q4dfv|q#8nt1`7#D9nRb^>E{_S*BBbKJOW^p$P@)Wnj#J65eeWIk7Lp_XN zb#XKu#(Qeh((XLhsHV;@?bp*sI9nr4i_l*o&QmzgJ?vt&{IQ9*gZt5jagS7@3qPdf zoA04?xLD5+u|u8Q?yPUU$zSV>LesQ zGs3I`!+#Yud5ZC+KX0fI!UeV-d`Cokh&?2l$Iy+HILKQra^T+j=0NB?L2NPQS8#TM z$nbF9_axMxh_7DLyS{QfY@Uek&E*lw+u-a(fw%iK6z40*oD^ut&tc9aahGZAgY%OR z5Dk|z!FwCNZ%Ym1CYX4e=*&=^Y}jy{81Hciss+_2>sKU++w1)mlSQ)duz7e6;-+91 zjgz1Ff14s2nN2cj*4?Jz@-7AJIvgQZzB@5assU0D%N>OBKF(R`&F?o zha2yqc)kpYF1L4lOi4g=@1XoK?+S?Z(C6_nw%cduFD`sm{I8hZkeD)F)RF0gl#a=$ z{+zVab9)mk|5r@nLC!iFRBu@5JwO^HOQ7Br(T@kor)f~#VX={roK;|75hGnliXr7% zk%Qzi|D`J;T2v#p?RrgGHHDixi?rg2QMKUl{bn;y9x3*nQ1*)$4Zis%Ubv!lmI3(*gKp2_Fw#PNO?uk1;stk!U-s8u zFET8TS1Yjb1LSQK3EYrpVcJG9j2rehaCoB_6idV8&$u%jD3~t#!qLGZ9&f<;^WV^R zgQ$0ggYTf(ySUV>3b`+utrGCUjX;B_&jhxbc=)6_ya)1%#d`Q>epGF6dWc-sRe2kf zB$)WdDk*NJwm&T)qlMWUjtoZa<*7G?k4fe+hZdRzyfvJQ(5=YCa|O+itOvIjnfp8? z)Yt-T9yX6~k8#R>`C)UA@Wj#19STDqH9v#z+j`QVY?)aPD(0A5d4m|wz^41m>HMV< zdoa|$-|XzdcoRnJMyUp2$G~dcAXTuF;KcnV-p-^&>Il^zFz0iRQ5}{)VB%MaXz$H| z-ySe$x&Y3>w7F)MyPcka4Z7haK{SICbIlBfW+Xt|JoB6@i@7@=G}oETgzdm4+gy~x z9AQwi_I=djXf|_2-Q!~l3_O0+%ltO3-@Bo{Nj>6Y9Jfy%!maxbc$cHPkg>3T&=v@3 z)T}tyY8B6isGre*lP=g@{r!Iyxq@ZoJPa!@i2Ilx<1wgLf$o9~AW6chA2fj1LH=yB z5losT(oK6SES@Fsdw(y(-dUnp*f8X7u@y3Z6^$UdAFexVbPa$03=xB$ApAtH`BdmJ zL)1w44B0^4!f!#v%(Q?88o%j*9wGL!|9X5FnoU|3e2}-n_>^}; z>3Dp(Hk0^__MaFpY6&>K$xMLW-H_W-iZ}Yg;%<5dt@u;^_qvJk!ei)`yZ{|~hzEiy zRBT4S0kzo4xtt5AqCLUXEHzi)G&k z&I;5kZuBiK4*t#o8EW(dJJje3PN>nT7*LUT;XA-}5SVXd!kkc}4eZjxNKDRBr~nhc zmPg8R5c;n)@qKE|zcIkSYo$3X#{IBcGSppb&g)r0#j4sE&NbDa(^Jt!XK+=j$H&OP zN9}51l-ij4a{uK%L+}UhoElKJ)=apCfEf5Hr)!oRY_%tm#kip>=$UuU{5I!-T!Az4G-{Q^JBL8^cs zhne^#h8)z5?)beg@ryE~F-A9-c0znChJpM_4C1XS`@+hv#C&czJ;3|5c*5Pp9bx;| z=uBxxJ8k^(q&OtFWyC@CQ(~(-E(#8w5}&x^{(zEi&>i!nU!dX}(LJ_YlWybpt{U!! zg5jbo+&kJF$PtJ!$N%1F6QdxSAU}fhV^9Hk_B$|ftchQ^qD9>WyT+P3+@9TV_c(I} z_t?)uT)wtX8VLp!1^EF0*mE`?he-_pKaR6-yt&8)uoUXviq?+tEQa2yEVZ18XoQ}CynHhezMhD#V%BhRKXV~}hTn#Z4=2+&V}OeO_1%xa+!&9~HzepYjgUd+vCpu_riMM42d7EV!ef(BP1Mv)jnTht;COdx&p^CeLPJW} zaooNFBj<*Wd3_}`6`FCQ0DNzoUom}l7by8cw1#WCVVIqlYPL_n^h#iwHQ&N0BnoJT zJyOS6Cpq4hdjH#dG%ZtHFMcPB?dVftApG@*m`_=dj0XEpk=C5WGsDUd(Wk3D^A{SR z>n1d)HW0ByllW){$v8Opr?~$HvMqnCC*{EgO!SLXw0@ejUw>5zH6&Oi4bku91~%jtj-#m}ydrP2Wz zcfYApdsL6`N5F*|bhqn}=-5krNg!nuKgx zB(^fWl=3FnaC=~;od^A=m;pZjfr2S!V7p52O)>9t5#ZU+R5PtBb9jLe#ArFn9upQX z(iR~cK?f@x2{2aZ3j*H)AvM~=?NiP1F0|{QY$}G4yei+o<*5OrPIIV#huN|r^LpCK z(4UCL?PI)O7i+oKFf7>wCfPcxJG3j63YkOoR^8 z&}7m~J09v!Hyg388LtyhCh=5b!onBoRpQBliPO#JJfzz4dWgHz{G1mOFR@nKX*P#h z(?xH%a1ql@@&fiq9kydc z-swbw@k`iF_t7?fOJ_P0q2y+acb(_If(sD2T&%+bc>#zD%zltk zOrQ><)zsvs?$BR}F4D!ikcsAbox-Wd&xU>{rn}#i`X5-NH*B=?gC2domR)l=>7a5E zM5n5o6S8#h@?;=phdox+!0j+s;|X>-AiiI z6s}t<{s9$Vr6U}anD|nHg`PAs8_l_+wGTh3SCWmNQ7fayVCdaTyze2sG^Rnl91P(I zojnE$a?lks?qNEF8w@w}7N_}%%!UrRfo|tI*qe*N8jo!aEBlB;?yv?hv9B28_SEwq z?u!M4*b-XvN6_ZH4bEUp_v1*v5iI%wrX$=@>7QitfH6DjrH_igb7)*{sV0o!j7ifw&7&Qp~}+uXT7K;TIE1HKF#+ zP%%@yt)s{5;Gu2eRbFdnE?l==*A-)6^L9+wY*Lbc;QV$m(xuge{yQ+pq8@uOoZTVP zIuT9w9~i8S(~+hdd1Bd)rsGb)@6}T@n$U(KNFI+Bhn?a!)BX-N?8Hh2Z|t^Eu@hr| z2LB-}^al_dpZm}F#csjl?0T?aw-}a6kR-kjx?d_6yNeaSz4#hJryDPlt~=G zVZNULr3E4dKA4H$xS*+cXE2~$+0Z1(OfG&UDh3*iGTVDH$ycp{5u?yd)1GmD@-G}^ zW?^NQwo@+by~QllE~5r4?2NMYl77Vc_jVQ?1y$868D~Q2eC%2~BG*{0$>lNz+;lVA zO&Vms7Cy*XplfNj!aD_6>j>MYsQwIcomT$^aOX1g3>c?oLA^Ps1+;9=Oqe)F%yw1q z4=A65HT5`JnwO#JePSM4Lg!2Wru#%Amp8f7Uv@u!G6&*+6}>A(**-nj8Q`y|ZDP=1 zpoa?I-qjNRj94HVEj#E1`p&ek@Y>{Nn;Y1w$-n&-*=DYAxjq5iaxl{*ri@Qudye_L zheCh(Je2k})2`v31BjxVik{ydw`V{E`|;T|_^ey#8J5B>_r?MqPuc<7a|5t#ECTky zAc>{-EFABH(Lp|~Y68^jYtDA(04(oo_TsxS^t+>8-ViI%ysmLeYdE!XIXXTSUTu_tw~(+2V}Qc9{BT`j(9jMjcmOleEn zN8or*j2daKvmgY=SOC)`Mvc62XLHoJez~V3lvTsRe7TmOaW~YD#f2x?N`TR^*yANF zxConKF^SBh#syeh-5lfItNhttQQaJF>RS9jNS-f7yTQXtFn7MLv}?ff6F55`t3`|@ z8S)lj3{XLfwgI*;KvQ8*V=|myfZidWG-Ef|g;?Zal#fGMA)0P7h;lyETNnUszXS^x zVk|?T9W0S7L}N|RFeJ$NbKib?^O7G4~yw$6G`m!!+HT8y##8)-=2(* z$uofZoW9^)gr5kchS3M}kxx0*!$HyWtAz$)mNa6KnBJUc;rZpb@G3Jx%y%K;Cul3y zz6+TpVh|*l<_KoVX$*IpW;QFb(F69Hy6ULKfTg$JO!EoOSg`8(sHO8KO}DHG6;;ek zf14TJ2OG{ia4FcZ--2$Qz%cnHzG@O^7_Y-Y z4-!QH?A=hkN}xyXfV?VZN4E#-)KyR&SVnL7k*Jphw0|4R5s|)$mK6^!sT@(DnX{82 zf4@1%6GyB6kly{-@KYP}eY5CI*qedYsZ{qk>CmAqR*4I!aSJ$YF>RF8SfH!K0&l&lBr=x{V}I9C1UDxUVyx=SZAh&u?cs=C$56K^~*5WOL zg^#0)ryhHG@nZ8f6VE7aU##~ZO`Qqli*YOPVy8pBC-B&fX?_{{>juG*&w%{|p1~2B zc9g$h36{0lMmYKYl}pWiA}3D6bB1YsK|QhjblD(q3P+M1ijpl0^#xAhbe|kd>LU}( zTsVh0m%C;cSx*@4KGqW~bR_9mqj>^ezYG*Oe~ID?4aQecu+eM_UsQ-A`Yh`P24v&Q zY8%Zz;p4t|k>gN(a}G z>( z4#l922HID3lCTYa9BOugwnH%nk2LfQ?Pq=7Xo?u}Vtx(HJ)Ha>sO?X}2IDPD9NZsD zW+GE@v@LsMJg=P(!IIG7E|jD}s(BfX-DLuNf44}}N2ASQ&jHLChyr7cn=?=g577~7 zd%e2&Jwt6l(AgDSkIutK=42xrzaA4CUcOr(svnwrZghs;{cst1SR0tz4_DbHv+4th*WmmPD3w%rA3xNxv>cLJ}m;WTLEXW5mTZ;8W6u)^l}BX zz(0Dm7-PCu_fCMbMkF+6Ht~i_!(Ux<8Y-ewpM%Hp<0_!d&Y%Sy3|>F(7h+QOg5|-6 z(bZpNmzja*e8hiq=(bx2utaY(Jh~eLSnjC{(_TY^M-8I})(gxX*DyHD=T9C(>r+Qt zruc^s<&cGXxaeyY9p_#oba1`a9xbjJgWn*ZXtoVEFnEGODvFgrImx^P1^1u1GHcrIY*q`sjaBL!#DcSJ(`1_^j-cillIKPtRo*oSAJd;z6$n(fBU`W5CJo8K-bCh{w}@| zmz`sp^)T^9yv$ai_kz<<->1s*l+m(#;P{Q`U`YpLZ~t}u1y%`&b!RFR48U3q%js4> z-k$m;(ACRdag&%SdUBr*q7UlrKub{cE#8*Gui>y^d;yo~jZmL^lZyJB=b>Z}hU{z& zF=`pNmlX>KMbEEISFX5E!SO+&=Zc=5mLSh!a>44>6dpZ`^hvEX_EQjd4liynhb7=U zCj#FV8|in>iLJs@Mz()E%=uC5!*lwG(adtk8HDye#O z6sK_RBKye8#leUfSOHo(Fse4)7Mh)6UguW(Kh+uJj-Gsf1&iUW`Q9Uez^h^uMKQdoT+b$zjx_h&zsO&RE%8uE}mz{5!TfZ_a2f!dS$1B{T>!#C{&RtaPU1;9|qhAn!Ycd za|5O^Q1-sAt7<_R&%)>ruslh_jOza>PttR{8mdWTd6LIhh0+hu9y6rB;P?lapK=do zYDck@%#GiQ%Mc&^mOuIzm*MqJCdEz#`LP(8%EMlZC{fZgtlMLWvJd;e?Ycs_fPSM_ z#{%VGe!daPk70<(@Yg|`PsEN`YS=5#$~*@Zdqg7N5;p-$loQ~NPeqq;j#fH}eqdZN za+k#$q^OJ{a_X}^ID2`hFa0ChJk;kzan(>V(r*UX~bdUKEzO@T^d(lagO4-@4e6QIP-&8ub*IZ^gZ^7;R%&DeP;y<>} z{1{J<^x^TaxdIhi>jJ(Qv3xGt6>4C>b!jdxKW!kpF^rgp>%{KF)+L^KZmG4pKk7kI z+srA|(r~6C$C#80!5l?@OXslEXG}qkzxsdrZbsL00?Id;J;Tq!F;pxk9jnUqsn#!= zDNwZ(?;?@uGdlW*mYPijST$o3;fWVTTWCEAk8fy>{Ux8DVgQCiZhhz@6vac}9Ex6hh5&e6oXyVU%&)jNxY~p+&_>P$a{Wq7H?V~&e zWRKeW@zDybxqfJ_fY&}X<6+$W}=CA+zQIfB;i2ZC)l)KhZ5b~2l5m1DHAISzAwycO?d#iwY1i` ze-a4~uBuw@U*R(F?<2Lc@EWw{$+-u-&8+dB5{<#w?Tx zzDN|@VE-8Qmq~}kM`LhNN)+B5`P}P1m$M?DV@kv0XKI>PxLMId;G9On@xZ3wr1`v< z4kc&IQKo~}F+Re`j;OU;YcXM*NZ6+P?V%PHdTl(T2};R$iD@*}N8$|7DBDCn576ke zihLfRQKCx<(r9$jGHC+v9`-SX+k=K;E%RgupFbjy`tbYr4b@(afMjus!D86E!x z17vC#%fbE?GeK&|C2-Y%~F6RW?> zfu_-g@frBZ8x3FXVSLVR#)r8wac{g8h7WBK869SLdl>ifW#*oH?t-`(RuZUc)(y2t z1QNe-D2xeJqU(UKnbpi+C)R2yGL8r3QKA`;bDMaV<5w3?UW!<{GBO4~Gr7)p;Jbor zQ-C!u3#D}@IJ!9<@+}LO>V7D#Vxe)I#d0CA&h0E0Y8Vq%lv+#iI9Up7vY5i#Ad@Wl zJz6j~iH#Z&{!M3%2N5*ah>~yu;=yK9jp%87A%gHYtswI!ls}V?mleN6`BTGAfwCkt z!Xyv*HRRVrBV0h1!Rz*H5xu4av9@ye9XLD$^_trbmYF1Si#D`C?D6#aEmBnHQ;CccoPuY@^N<) z{1IGqA1(TD-UJS<@*!6M`|z(Fq5?InZ6%p@E|lxWO|`A3O=l3uc9wgsK;8gz+Mxsp zkkb>q?NI{MK<%E}9worC`4_z3ST>`5uiI zm-#Aq5w*bUxzxN2d5Bz8MY3N1_L>S@|JKC5*rBOFYPOL8#H*SLRPr~%$iQt%7JzBm!kSJE{7cs4 zwYcXFw*JJu@iMACUQb`IvEC$pWY$kZK@*K^T5&_<{0=Cg))dHWh@4{;MVmldub49f zDl)8%rkups=%GC>3>#iPBVUt8vYxcFvG(FlfXQcFCZEy>lSEU*hiDsXgh_be9`PZM zZNm`C=8O<)&1B#Rp^+4Z(D@<^p^?VBI*)esALQH`me4APJ72c{{Cu#>`O}sc|R6Liv2+tDY$9Ect57CE{b|!7!^+K|9Byy!l}vvQ7n)rSs*@FAXupj zQXz|3_joxTXWe6|Jj`Z?d-}22p=B@@yJqLZuh8ri=!G;!u;XVLy#2qal5d1PXUCsU z%X)p}b9DUl+~^zm934N8&t=C?nB@?VUC~ZEH!>sqFdMwxEPQ3VYZwpmD)S%-XSU13 zC&`w}173O7vEgK&?sw*f;pX+_=au4CJ3#A|u<^)SfCu|>^IQZJF=0W1| zi}nG;gYyUTfL9O6{PQ|sN~+C2@nHPv@-V+gfCv2ZYat$FyD;2gJjhD%Yk&uPTiEz8 z9*kEbp9grrv#gR7YlVCAjQ%{;a{s^=Rw(DBqBUjR*bLtKXia%#Hp1NcXid3iDpXGk za3eSS?@qI#@r6ywkG8OylhEb4Fap9EIR#FCz2m1s-u1ZSr$7ZYCxd-GTAJBV&|7Q9 zbg<8&RP)J4On?^W(7aLuugCe)1H{Ni>|!!WJtlB^Q}>I2iA8^fYGGd!A1$Hh=jOnM zOxc?Mhq7XqGQ6y)DQnla~ij`C)whVc$7 z8KHHafP$Maq$vw`HbtKYBtg!GXRX#$+$3T(5lO;wd0xysKko9ph*tyL)mR!vgDfH% zV)96~aB`rv)RZ|IJNmjJjXqu^R74==p@UrZ9hd!GP%#WC=mqv5&A!C5MQrwj(m|U2 z{%r7Qs?23CM-3gp>NuAgMn@JsOXm`c-mA62=*pt6pifL-C^ZV1o&)wM#DPZ!!!*jj zH0mUQ({9$yKQ!v6MN}AO=Q8UdlkqF-AvN$Lq@;(0S(dUM5@!2X4s~E{b4;^&@as_8 z+#2M+Zvj`bK4mTE^L#rWx=lj!=ZpgH)7B!`GTusq9=BN|;ppd9 z%~(m&?vA&~tNZhAwQ6EoT%wslvRC3&cl=jhqMm^N>dUdzZUD{%YmF)K7RyAvrJ6$h zqt-JnwiIxV;{GPEPF<*9hFgkBJ+6hA2uo&J3(W)f`AcuJHVbfOTY-BA--3OM)d;#j zYQ?#*zQUIm1Ay^n(WOTNfbsl(=%N5%JR-v|tO%w&hEZ3(ULu(Y&SaE-O=bY!y+8(% zL^0EEFW2<170+t&JBg>lsFxU#2C26nW9o?&IWUa+oDrIO6qRvQBT7s$!krvDGg>j3 z2jvCW?+gsH4A_rGlluoi+)NZDu1)DoZS#kK_bKE!Q!k3qPcPgsZs11HtH*-D^sMx0 zYX&r28ttjM6<=(@NSmiL^KZV*s)K|ratWIsi5RUrBd+EWRwc4ONSMbZ4AbJ^q7VvM z14iFttru4Dy%?7N3#0GFv}ZrBz|1*TO4gU1@G^FM^r0v9c}si@e!PL^*<)4JXk$WL zbj^5tuJlJ89QspIn_=%9>m;T}tM9X}5j{XYhyt^(jif6;H^!)1pv~m#k^KR>oxS=w zLpJcZTniU3RFQCvHzDo;q}&g_g#ob|uR`2hWMDRw%(Z6eKXc_K(nPbfeCNYf0+usK zss7ZYB_&^o#Eg{1k(0pklkUDZvKtBG?%A4{wW1K@L#T8QfIS`8*{j!C&eQ~9d~%1T z1>^f`n3#~a;b8-dAGY3tALdy@O{bK_79a+bZzKlAm>Jn0pa$ROD0xterkf@Q zYiAu)n^hXgGMRCtx_LicV6?!I>I{lHD^u4=-Ht79qhH z=Uq~N2%E=Sg!|9Ar2Y}q#01m00Oy|#$j>G-2e)q_F2<$KUVMp-lx{F&Vz(Fs<)f@s?qT;>O^bVH z!5GfgElw*Mx<0aQ)G+$8b>n5M7PM{;c?$J+W)9?QZ&1~x&VD=$e;9RkAyS9tt$J8@ z7QlZPIpY8ZWZcR56#Q!9)|GGG1=o^$=ECwVXg_`m+7EvG zw7=fVR&8+;5o3gB1z|)Qe?(G;o4A53<3o|panb3yGY@>vXn#C6jA{o1tKh231uRvA z+{hf3DmCO?EL9@UxVExXtwfe86YT5^BOr`m=jE{HyjO@YGF}i#vwks@LjPj<2lL;-JKzVadYgqV1K;C#uG*Gggi!Tye(eT0& zt6A+(xt69#RJ$eCw;nIqr8^<>6)Ulwb6X^l0cjf*ke}Tzm$O6KmaCtU!adEcK1`u(p(#wt@fp$VUmMIQfzNGSEK`ytgBP6_m3~1LtA%b z5`j)VSUlBwj`LkP53akzN^_In2VnFaftAL%Rj+i4?Te%%K&OLOR&~Fu7ug@6Q@^41 zijHraLT0IsZ!u3>gE~nB*>#}$Rvk@O2YYRRFuP2z?X0jmJdeGAt9%fAW3|m79UKI4 zyR?M*MPd$6W_-+)*&jys2Pi|+M3mW>b!f^AObK(XOI;tSIAgiBAj`Ns_(q~|f09&qXLh0{~y(ql6{Ok|Fx zX9{E=wvuCnI8Hj|A&c{0s_(6u8->@V>C2YyL#Bwz@USnN0ww2=!0}La-s)mH|A6nT)x*T(x9qI-NCM`s^D(!b ziJxA;)SCf+19=y$_F{;hh--f%&%|rQW#3u}u;asN&3Czhl?=N zV{i=0c~|96st5TOtj4D7#)Nc$@?Wu_N~oLxBdi1o@U=!sP#cr#WcMLKkA1mdAy!O>*+j($F>%JrH}?TBBp9O z$$A1vdN$i-aGPeZhiRYz|IT`a{!%oFhIzr-OWAi;ifL4HwA-2ZxfT+)^C{Sut*&UWXr1uwLY%O| z{Z`^|9*eO&jkO&-If&}+c8-D#9@Gb0^JGkeGoGj-*I6%uf+|sI+(1f7`a~zeOI4!U zvP{tM@IvE0xvXi;)^Z2{8uFht{xZ16rKF_Iq3j3E`brm!Ps;_tv|{~adb+WGQmGNY zs2$Qzrx2V=sAkRsdRkYJ$QqG#5jCPYYs9jP)?`naW=j_6!AatFMu9J}k@|e~x7E^= zcvm1csuT45$2w`^ofYq8tB+|6V(3P{;_HMLR{w6Liqo*`cdMuP9WMQDfj9@gKdj-k zPvD(7Ja^oWH6D!!%L(1?jmD_`PpdT^WfO%)E0?i@jJ5j}BoS9jEA5&q)_8HT_^Q=J zR6x_K){x{VyvlXiJ*6K)7c7_qEa+(tYO<{H1z}ufSJwCq2wdw&pmmL?n!Kh4R+WFp zt%y5Q%gDIouF$fuS;huZDgJY5p{-m(YcogBN98)l0I*_?>e$gkotSmehHmr|ZfII1 ztdJuCEn)Ug)~yMc0lHh6M%%a2F*t$43MMh}ZWuIY64O*b>vS)1l7JEovn~Y3=ua%c z|MB+a0a+E@|Mx!6U3eZh6cABV6u}J@w{Ri7E+{1>Wu~bqg{CDXrKOq0RRou;D3oJm zg|AvxR+!7Rvbv?1l@+CyDH`QomY8d0`TNYwb03}u>y7X4?S21vxXjF%bIzPOb7nu2 zd&=EFRI0Qg0F60RC?7|IZin*&19K~Xo<}rCQ8Zi@{2r3yQpGVDA)sej75U0%_7L@S zl}BmIMp3+?uB~);p>mIc_hBYdh*!ZmSpNB z!}3=<5J6s}~-iGpaGK%(yp zqQ6}77kd|Pol8b5V|_!5Q%h_G?s6I5(#a(iuuuGdxXe*x1s(u+LKwph#jh2B+*~D) ze($S?1^Rd4xQ*zkPJHhTc2C)AH)lOAgQ{PkWINWJa>iDSq;-i8sNq_4w zam&-+-DPuTo~crSh@bo_P{147-K;~Rj8YZeMnjdxF5^2PmA!&-0W^(SMD)Gbf(}(? zx^TUm+d)y(Pkl^m3&?>T55w0#!lNf=;vP}py+61|2!Y|uNskklJ_<=bLSs%~P{mQQ zQxQyhIOJPdSLx-F28kxh5t$=cX=Yaq)&m+U=N6kHC92ZJWjrHFvP2-U;Xa4;4jhSr zuEIA0xHSrE7QR-&^Ggk5TPoZD4bw}Q!&__!m9Z66fJNlC8<#c?*J2oaYPSZs4-5MVmz{o9~8p4mKp zd7LyhD9&Vg?ae`P8601`ptw%iJhE?4WHE~~9=<#dr^T4`b40Pa1_2m6Q+`k!r)c~Z z6vvUPEU(=yC{C3A#h|zn1}FVCJ}8nC#^XSNTEq#P1wnCToXC4YaW-eVWl$Vv z22%m9bcr0`91k=xIr-=yXc3nxvR1VswMZv@3UI$7Oz_~x+u#- z^h9Rzaky}0ZzaCjmbj!P=#;hL7s9k`IV?}b1W1!2V_6P&E1K0A-Od0UzUZVx#PZ18 z7?DAJ3jVWQ!5OwRBcq=K=x! zF>5XI?rs6!9@X-02^DE6I))L|(%kh#+Jv9}gk~KoNK_hAOG9bpGV2#zskH8?3Gm@j zVOmLbRH{hJt8+P-0dC6ft2Cj?p9nbCe8wCfs|f@*C? zZ>4ds+%qEcD%_tit8ubL+#A$N;k~k~n#A3w1mZ_KDb4j5R0LMZ?)D8%vPFXx4DFRgoi<62DfK__DyA@r_OjE;5%rz^zp%-rm~ZM_D<2olMXC)220YEjxPHLO0QJ9`-oy!Zm2SfO)u?SskZ&n&oyE~Lfk3)JZ$2{FnusA^4IBWoEH>8)Q`zbzEC2|~V zsuH>RI7B{{o`1=K#Qt#E42QTePslx;)rk2ZlY6{NdO(PrN7^%dB0s3~*LjR_2TeN& z9z~vsRD2LTij)bI{vxCz0=JU+qSA~S90FwlJC^gv|F=gn9#K2PIeU!{J3w#))#EVO z6FG2tm#Kxw(oe8w;D#&H2p%b2S)DzzBei*2iK{2_v}f)|Gef&KrOIV!Bmyf}TsULr zI@^%mdDNXa2WACAoLCPYy z%2N9IuzgG?o^`6j-cH>f_w%-mjOUyb9Gu8{4%PAek|-oVcdTwL||#F4%!o}_3ryeWl# z=3v1&nA9zPB`FeIeff#Qm5H^vV6JQ&9R1Yc3fnf|YAhZ3)SqECDW8EWgBz6`##N~Z z821!qDedJcWR8cF4J;IADV^ZB0_LDOogS|=ahbPK=meMpJA*Rbf;r$g;4-;l0&51? zlNbU^AP^6sUDraEJYb|24TS=Vgh32#N0&5!D$*d|dxnBB0o9iwA1(K!jO)?-zq{6- z(1kM69geXcP({U#rNnz2DpCuooa=y@%_w`NlVUd!v~JB)B3-z?HD#MJ%15(-AolE3 zhZvTA()0aTLIQ}HIC%P~ALTD}Y_n4)^SmgNc}CC~^|pfzD$4~X{Xk`}I0CZ|QtCSn z3FF%U62@*`17FahGzYg)CaU2RhPu1p8t3vvHEap2hRt;18V9TNW&l>UN#JMPco{B1 z9pn-`Ao0q0zUVOrIgUB-YQUjnKgZa;s$JmVwx6KvcVK{drJ4D(^0;3pxm0%C!EM4L z6*F#$+*Cd!j9dTjAsHTH&*a99|1V)jg!OqMa1ZRqz2bkE&PhLjuE>FxO_*^LP-Bbk zhR$J^i`zCHXFw6}R}RWU$e5#aXfHAihCy>>M#n|5o;yt2y(^5l#L)~F-_7ALxXx7k zATucasq8_hJb^99A0w5b#=TI7jw$HAFJ zqd53|`v5IkKs04Nt*^LtV=}YQzD8_Q8v5u&vKH+lYSgE)ZBQJ6%}WD6aEM}Z!8=}_ zV*W;1U!WQU{tLA93si$hImbI*@jqNAv5wcZ(z}DkEs;PKOoaAXV;k z2;zck#e9D$aouKtLs0sHb}VoR+MiVsw0BUp^D!SNrN~6{|1oF~Z|zRV^)JwKSGq`p{p-#dPQ)))hR? zYUu$wxdekD&XJu*dv^H?kxR;MhY8b!I|8J{Fy+Ouv5~t`3Le01&_%nI>qG#GTl@k_ zA;9jWkzWD<4;Yiln2b`0z&J|14k{rKjPa{P#r04L0Wpfo9)+co>%hE#9!6#! zv$)qVL*=7n4x(MxJCvk>WIv+3%05}M=P6@UI{*5C`6??weKQQ_N^cO9YB<245>ws*(B=7+~Zy+1_?p-r#( z=_zRR*L!h-nWKOU(DV{C1QGa+%n~#&9>9}57fX~Db$P(R@;N-SN2k!G8OoiMIL1|n zR;^VU`O0vVwysrL#EN`}`1mC}MMX1r`!{AyzPFx2A+KXF?7j~5FQ9kPjvNdupuZ*O zp}!*XGgcKCY3&eo(ei>*7t)8KE)1Am)F$;~%Jo8*Y#S2TK@BOvH* z>Ntl46u5E$GdQb6dwhMILjuN^4}=ARWnv&aC&Qn-1aCb!#9)W3RLst2Hol!#n(NoD z^j972vS$l}6Uwz2rkER?SJ29N492hA;P8L}Tg>dfNV$s!z6yFgfK%4yY%!D?I{%y4*a^E_H?jc=c4M#i4@;V}nYE_oc(B1u|q)W>mMRD zqi1Gf_$N5(Ld8p!u5bacYpD_|C$PrfRwUVNg~cB9q|y{h%&maP6GQfs$^&vEN`4CK z0S!gVZ~cpoWu?8)U;*TzkbO#Ad%=kY%~3MLQ(EM%@{6WPBl%8~IpAzj$zChvSpj5)&d3ci2%3%#StaO}e?{~@!57FKB zD>#76@SEkd%bz0crHlI&9H8Zu_8G$uXOWx@xUf8+Oc#nQGU77JM=&q~_AS2(6nqX9 z5D>UT&iWh?*eF!Hs0@lF^1RMfKn|s5k0@iP*$#igDw_Mb!>qAFs5j4I5Urf%7Y3$K z)1clWO&GoN z7-I@8y9HE5au#jB1yn`K9dzOrlu!gFQuM8;93GIyQ~IswP({jET5~JvrILYIF#Wggv(Zd^%k7D@Ryx!Z8Kd|>hK(dbuR^WzNL;zyK3Hjs{rXpnlxV7( z>d>@9MPm?9wF0_Cfy@mbZw^fxd%wPZ(bw!ajD1FQy>)+ekea6`;a8{7c-)G&LxJxE znZLrw^MH9QfHt;+d3Su@Zw?k|A1(gPp^eo8K5`NncTmDnN5WV=7HF`r7|K*NRi(Rf5joTmdZo89Uc^K)Vf z#v!na$|r_JTO9oGpiwmi6D7fwV>U4?;Ef-5$k`O^`K|s8^JwcRP z)_DM?xcnoCK%`6+A`k&MTlg6A7GPPT^gO_3XrIG;iZKz>^suhJy^pkBVTCV_WPGcrI+)41(#agdOX((DR7p%Qe2zJgShdWH(iYNJb z2w|;v9({ZtR$>Ij-)Pe}F!(%x0~~CrBfLA`j0n^2We$|wh48b+X9gm}IWdP30UTF< zk&VsyB>yIjm+1k_HkZpQ;=nV8A&fPu|< z|GJ%kwJ9Ubk(}{1C1g30gTC{&A;31V&fQTAxC6mNg4DN_P`dps<#w0x0xi1J&kMZm zv-vvDXyfQNn@I~SMU=YI0mIcBK6(^j1!6Vet(A@pq(=g@56fd!14)6(q}8i{s)CQe z@XiCHC<1qj67hh27cCos5{ZqOhzBI!@`FejNf$>t6fpeY zlOmo1XB68DQQbUXiiu#jGZEad0o9F(V5KWxkl<;$pB(D;bHeoT6nI~8rj)*lH47+X zJ6rL3RG2=20OxU->HA_k2KhL|2&;!#*zACww2Ys9ok`n21RWkQr;FZ91SZp(<&ZlM z;0(i_#oYERisK+9wv{IC?PXer=sK=KUp&ogR(IBA6W^GZAGavCM ztF-hHhayh5@z%{V+ULYxgTQ-+GKw6E_9@Mh>_O2QZKlBn4#N8T8XhCTcN6PtMDiWf=xUT!q)ZZ}6@dw& zvll#c)9cl4;M+u$eqy^b|Hzq~QIw(`Z~7d>n=)tJAQV0;~;1 zpYbykN82Z1oX=C3zK-#iz9BVQ=P!LY*DC>4U+C4Gbxz@JoN#A*SRy%uDc7AMfB|;) zdWV+rhgjYcT>Q*O_`Wz$V{cM0j*-ul!S#&`Hj1Q`P;xwKRqgs*jFfBXh z&@tzWmQ%u2c@}kh7gfgt=KYlMF6fAq>0&of1g44Iz>nTV$#{%(H}CI6>SWQHL|_u{ z@A~^8%?zrvL0n`TEBZSDdV}cicmOKS`#T=M8Dr7H*p{Hk*pFu11$`G8`vea}nIlX# z5DgUrQIR28*Z>jeDQrN)DGvWe_bUD|^x*w92Q?GOo&ufc0l1q;&USb=S_bfLHVWV! zulQ8)ZsSC(-#Q4CDzk;{Jud$$L*+(vMj{OhdzEbH_Pa0*=QcPT+P{!-f!V4v!UhV4 zPSBx^eulmmgF~KTz&{&IP(6WlpPy94TMjAXYeuRQ4#e|;!I3u|O6C`W64vjy{Shci z@#2+3N!lX15uPGhRPel`Gsb$_{JhdakhRzH{T*SjL+C1GF<mRb=7;qT;_IbaSL^j=90!+<*n5| zxJS3%if*f3>vEZiR#tm;yvzg8w?5I^UdMZ&J=z=pM zKs2N4yQ)KcSYD)xL^Yn~0B=2xMJn=hv8bCGrFT_vtYQGhOI_5PMIOwNIhJOLYI+znl58ILou#?S};vq0pc|4-K2)Oa4e1GpW@ighFPIR%`J)8G#f(^_9>T)Zn*-Gb}amlgs8s#6frz zG2*NvpfD9$!i9v{GcWNPGRL9B@K(u7{6{bX^A^GHz7gQp#=RxR?-!%hr)bmlYE-RC zM#TJqNr?)^sIBX>)A|8?;($rPXtlpf!Xo`R^+uO;gOATW!DMXQvSoapcCrWXIh%}e zs2Lo`XM7qyKDP!VfNxBW;7kw#gKNW`3_%|k+yZhQ%nkyDxfY&fG_DR@R_t2SXtfFR z2;eIM&u)&Q?PJswdL=`}HvcJAjbs-#@>6^cRPUDIzLPb?p;Vj+Thx;h#|weWXp(me zM>~R#REoJp#YRCl0RmR5gD{Uh3&OU~WBucmy457CJL-fF{Q1Z?UeS7FSk2;x&I%RH-8A;~D5G1K>rrMCXB+XR2 z;<0EBxARuONijTc=UTDxYo*v$%lUnSSc!cV*%Bi0xw3FXVm9W@LX=1qg+>KeFEl(p zaS#JH!p4KUdRFuVRJ6R$ns%Fd8kWMEbh~!+w+A-E`8y-KFF_ox%N zQ>AGtW(+D7+zlL_!b(rXk_Fy-t%g(87OD(Ks$Zywt)};@A+mlr4osu5CCpT3x=Op! z>Y3`}{z&5i5xMyRbsFF#1$~7XiDOHGZ!8 zv)hHOvXS%Ee3!A@s+g~4D$LM50?oHuTFV|$b7ksuz^z;HkEtOpm(jpVd>kWuy^`Ux zi)qsnASRu)ltT4MU#v98TDe&LN(G+8Wok3)si*MDI|`4$JU9G;vvSch#p(}aPCz5H z|Ap3uJxOJSdQ)TxYn{g9ejAp^!Wf5?9a9_9!WC*bGqJ@h)YulQEq<#sljCkE?NxU^n zJTo3eKA|>?%KHn7r>uP|)Vgk3vPO+ZkvFeV8#k1)GxzYOH*Uc35f?^<buw9dl_)ZP(L-qN>uT4g`wE}DT4ERF zgi|gY!OX|jHRlj3Lc3m9C(3&$c^xjOi86jb59>Fp!xVWP#q8B0tfud&+t5(x z(EIABh7t}h!|wQoN@Vb1l4jkoMV;=F*VB$tb)J*&_HAl@Z5a=8exY_^tvBW?wNHO( zTbKsUd{>?+k>}r z#7PYZp^jG3*Q#4jTH$76te%nlyJbP7TW05WTZ!<1MdF*=-S_pS4~U`i3UqKb&ackV zqV!xoP@7FL5#A{MG{^V?C4UR^=zh@3_*Q*@jlNK0E>3iVmwkx!~0?;}}!-YyAzpl6!?JVKyX^)*WR%!+F-E`^v|JjVR-?fxlsv(e4$T z5e=1PjQA?ZGH?;$Y#7j>o5rY&*&2=qD?l8N**X}Hu~6Xo@^U=bPT+Wq_XF@41R|a*syG4DjlEdGgyd&}=Qc8h6dpdo z`q3ACWSjQRqn~_Y7QlSDUfJjM*ne z6`{pABNz@U-Nt%qYy`8pi+P=ZLlsnq1F9-GTtfyv3@}CqMB*F|MjK7o;}5zQ;{}f1 z98MV6;8jpQH8QB8Qf*JoZ&Bk#4919zF&cUbBN@2!_H$yu?6sBgOL2aA5e+{;*EZTdy^_(mk=GTQ#DTI8}vSQ)>mFUq>XvS3sl`n&p&OS*#! zepf%&O&)oOCjG%ml>{&D&@suPvOgG69J2mHz0W1}r%9JE<2RFN(Pgu66o=xVybrQsd(_O#ul-8D#R$>b5alUcYeC-}8)E$Kj|Mw|BqIV>aE_coTN zuWSWmvGaHq+Y_9{%o4QT@`9F)`#g+Cb0vk=(qL`x5#>4;oCil-Ie)`Kv~U^gHoRDm zGn0j@?R*eAkC}&t^hIqg+-2jMO>Hm*uXa4LT^&RkkCRack@hSRIfq5s4~s}+x`^D% zA@hBZcZvMwC2@3oHF}S%*O>4m$_Mq;WncqC4_2?T~asZQYDhcg=&c{F2U$ytg%*j zkl{*aEXL69H{yAW=4_ah6cy~zg;^L*%KW^jzSgjraAq0gz{L+@;KkkgD47`sA092~ z(fZmB_SWE-2HN#5X&78DXuI_S-mX6&-012nkFa)xX$vt9J4hoVv?uipzIfD{E<|WI z=>;qRAJropYI!1?^aLGhhz4x#rIC@WeI27&>}y`2;z$iEbv(x#bTLxHDZ~ww&`5jK zWoFanM%p!c1|ux>qR=QbSMxaah|pT;-+KQtwisBF$jM&lIi^9a& z!zjC{_O`%{OW_@WI}NxOUy0F4T39e{V>8{*jB)xd&0=3T176t-#lk6*UCo#bI#X(M z?NuxbTNj#Zb7YqtL$g{y_(oG&-$J{-u6c$}5sJBOIgPhIp;}TUrMF}n97?lV0;&BQ zjcKJdrT1ED7ku2q8*wbS7uA$W6|ve(m;H(bun4)e#HDgCJgsQCjPnM)n`ACai}Q2N zb4jVz(m3r7*=3}X(pr0;9rWDZ8mvn_=|XEPvT-a}g{W-fClpGdZCR68X{EN+@Dw8l zfgjje?HmyMJS}U-iuW+>YNx?nF{=Q)jWVOX_J)ry50hvvtF5OxbjmE~-Lx8C~mG*RCQm$pq@2C~QQ8oNmCbDX2 zK?z+Txe1Bdg-)DXb0eJ0hzf1cu0v+C+iDhVDA;^4sn1yElIoD1s9D=leDMer3Bc3pGEhlHY^hLsx2dH8a@lc>j8MSNqnq={-zIM4%I>a>KTGL-VUVy!h9P}xx@2fQ>c8&qEDBhkWJa(7E)LK4L!FE!!(jc(HDnsBe`(^+ zm(;*~E;yrseRejnX>YLJGgaioBFXxG+O00>LAD$pP6fB9b@UQ$rrWXpA(CF}4{$UO zJ|^WUW-BuKgIlvJVKu7}mG?)Nje74fK)cOlj;G=QuwGK1qJi2Vm)VoDS}Q4f1|N=h zqk>Dy1QC!r7NuytG0sa)(J*Ryn8u_q_=jj^3Q8m$rb8*rwBT6nASj`^i;O{9!v-dM znp!DT`_&?eS6>EA8pL$|Gb%uOjx+<0CaOH0OICU(_i9gr%tx=rK0#E2Ftt8zcS|nH z<{i|>g$uk=Y)I!i$WyCO#R56+P3);$r5O!TJ8u-KA9@hyq{B_idm4uq=~kiobuFHr zBoIsilX?KahC=l?i1-oQ34$R3>Fa3BV6A!g;NFd`N^r3mlh~LVW9yD#d0sy8<|`Jw z4CdQZG8mnyy@qxS)|%zmZ-muiWxAzWnT%V(v!_Zf#%lM~Z5y&NcxK&RkWEkgA0(R% zVVK~@hAd}~PzK88W)#g^g~wh|s4fTzTd-BgCz6-nyq=YfZF~p;n#(OSRl62_DNYGr z1tmf4_PAQ>)zVzRNBw->ZOrk{3a}JGJkFeFExuaoFE^AP0Q(?2yCD|3G$9uIemXG( znrCdF)HK%Px+yD-jVrQgej2k|S+qG#8`V*o2pjP|q#us_crDd*iTvgSESz~6KH!e> ziF!N@yhgj$WsIZ6*PtgeKCnWr)xHGhBdKDj)+7S6X#+OMsOygF=i>t_f}!cmR;-{N z=}=`UpGKy`@|jOshtjnhVfnC?cfB^6tLU5r}p`1cy;w(8e7 zw$1F2%n;3$IY_(1SrPK*Q#3~<){-(zYuQE8a^nF1sOoaZ%Z)SZB43&|{;%^%YiQ&! zG+nGm&mG1F&lhRyFzwYG^Kn#bKh)X~Y*`KWO<5mvr_4@;+I55MdO&vlAUo`u@}~0> z;5!1oM^&8kBjDly*Rd+j{z2rG<9rj+4Y_f04|n|R9*B=E)Mh78HkM9@z!OW@y=UvW zTfL{}wqi}kkTP8xw7`PkIeKhPJ3==e17oQyjxcAxa+3>`5nU%y1@ryp*y2 zMlDM2o577*j!-hWhcE%=tUoCSn!6|iYXUyB7S$f9wHstS#KyE?3o%#5NQ-;(=khSu z#kT1@B(`0@A+ZT9hB#~oEi!77Dm)U|H_@z-+MA7yY&^mC73envJ;)aJS>VFSpqsS# z9Es0rG0#VnH|qKx?_A0o3}2$L3;Yd6gxit&PyS+{!~GWKJw zb^T~I>U)ddmauLag9idN^DL&3wTqt9T2imES|T14v$Do&_n|^y*~g);vb#}ohK7S4 zo3yCN0c3XgcS{PT-GaUe8*L@GXzd#0zT%6&$p<$+FmtXia)9{eVrj;Y zdB93v&S5?vc3l9b0_!2>Cbdz~UQKJ9g843XQzfP*#<9$Wii=mDk|Nezn`g5GJGXG| znM+{{Jkr5um5V$BkB6fJ`wbNik{{A)QKwtA>^jWlktvtyhe))2xn@`wd$$m(S z@Rj&6A78zFd<_zbT^Zz-2_iB#&Ibgat(n>t{msNM_Hu-zDw$~>@8!D2#z-)r>AamT z7uySPbIGi+m_?tYjHNn!$BjqpF)FBdJdBmmo)RW7!xvApCcr}5&FRntHl&TF=-V*p z#0KKB+q5T`54FUJte@6s#zZz+chky=3{Il*iEKQ524}TVXZDZi{`=_$XW}@e-OdJe zheY?!Bkld9+`+WwOPX;98_n*d)puarfTv7CCc~OydY(8L3}NbRPG(~{TrFhrSTNZ$ zS^HhD_=QcGHc@$&c54H3JgTB4nh{>sV-zKfqwZwA;w_YQCy(k7=kfxJmugeYbQn%t z$}pz0-cz%tP1js#ujgpS36pd78>+ut_s6>ff(@>XHr=&D7$Xnd~@^n%Ss( zeP|kH@mK-QhqZ}e)nPwG17~8ch8uY{VA){p*i0x9tK$dQBG@~0;Q=jQGaupAQqon8 zqR$`HuJ$kwQG85|r+M{oD#zXjy*NwT(Ad0y6a~#oWzCB(d3EJWWxd6@n%NI(&EzO{ z8l^e)en^|{HNJ4#BjJQeRAek~i+g;FXLEgvXOB`vcQqWVW#~9?+!YIDxZlo)nNe)D z%ol*@uw;flCY)?jYsfCWV|DDN=9T;n@GCD{BIEIRZ7qGahNp3QUA819(tD7JbeEJw zOJ{3$)ioD5W#p7RT&~22K%SQNcHJ-~q*8tz~1WC0<3HiMQWk1^U3e|2Vj=1i zPZ?cU$mYX&l=v_U52w_J(Tog}=02>w+Sq88S-aYzId3z@cuHHu+R8ebwn)3Jr9F?g zjbh%TkLEo!WKpQ1jqx~G8uL*sNK`VrX#7IOk7}*u)wKOlZJfN6+B~N1lkwD>9|DgT z00QWrV<0deCWG1QGKOP$tOdmtXg9G*xmmz${oS;^K-=gtuO#zvt$%+h)87FZp3uMS zfOs*?_k%hh&Z-$o$`efU>eI9*H0<}ba<`o=V^tYkv*Jm=b2qzZp1>%am!m_nQ&#JkUAhBH=La)i=XYcZiorEIhO-Zw4w%~wC8@Dhl$ zbT=(3(FV&0$nNfmpyMUlOPI|sUaPI}d?g@DaoYZM2sv-NHSKk+tLphCQpV_6?w3g= z7HrrzRAy-rwc05M*hDn8%}TubX=!(Lw9&ROXyUxsI@5K=0o;)t2-9M!HbBHiGT!6c zq%~_WAR@Am^#JbO;yd5~ZQi7fX!=d;OX`8x)#`!F2AWG0B;^~yUfxkke1nO^N_|7? zuXyv0iFlkhS^PG}o9YP`F3d0eiO0_?JxOJ6!_1aeQsvtkJ4l!Mj&`Fr@03W+J5Q_M z(FR1-iEX*o#SB$!tF^A!cCssJ8^oqP>YgQ1-pvlv3W+ddYY?<6SLD#^bl| zVbyN;yIOoySBAqn9FJ*69x*(ele|*k_zauc-ED1<+<|7x9qv1RtZk65q(dKT6XiaXwnO^{AG-`vyXF(^ zRp`v`L0ToZK zUD_(=|4#${e`+_6H@?&!Lvq=d8aYspe#L1d?9mG4A(p)d1{_H^_wj%{n3nC;M$3b! zWR?~Y_5svNADj{!|E()Y{6COl_Gz(k17Z_CmtxzkMfZ@7X0=xGX-|K4zRmZ4KZGOs{Bry$IhzEIINAp@e-@-xYnD6YoE|8c3frakJ>tXX8fc*jYsAyu4S5h zl35L_;-q$vVcL3H)7c4*9cN)C_fh&e{@Ha-n~ub^^IAQ2JZ#Jb?HhJfF8QK103TC) zwu(>4@7h7YocLXf)a6~4qU!Iu7C=y@qqsdh6x3Gd=<4)ey)_-1-v`9Aa{-e|I$=?{QFa&!Kf z)k2TA4m8)FkwFE4ChWVkrS4|mWwH8Xd?_SOe^{PwEsoQFW6=ez^_@&i z(hFI9NN0V87x8O)>*rN@hPASvey2y@&5TK&NsWf+FQD}H5SC%bqm7E2B{R zTKy9S3G*@Af}ooNf6;aNREGUJeFzhQJwos6mUnF&t)GX0tP3~m(^(y5k7M|(_2cyE zZhR9m^@FTJLT}Ss%MVkJ+w>s-o_m|#oB^+#h}cE6VYuaRe zqAWjQm1pU2P5da0xl4Z;pM*mFCc0&cK2u(9l~2)6b48h^$FlF48M>R5_`)20NWG9< zK0`_;OSLE(|AhX5$o>`1_ONQOS}g{7#HB64cOOk#qF-uS1RZxFqsJ<3jpCQ$oaWjP zONe3@6%^^`0Xd)a-u0LA*!;Yw**9!nUNP+=a16a#s&A23Yp^)PDd1`$g#S%vJg|OgFZ_0IA`N$RT?DFMYgxEqF=!){0)Mcamk?|70!t z&e!$tfHi#`LvGDlr;lS&EZ?B7&~UB8+^k2o-5J|vIed7^N)oFVHRULV(h5mz>}Pc3 z-94)jHRUhBj|G6Y^Mh+C$BW+9BXf?60}>b)hjN4${Sc~J$yv@X{kc%JU4o$0)}OAG zo(@y%IQcI5&v7f9HZ|g6(J!gDOW0Ubcy?2Cixh85Fop_I%pUoFg0}I~Q*+{J07S`Tr z^%htY_|5m(Dvx!`R-GRnY_mj}SS7wtmDxYk#bN?54rH^hR*cf`LvfK75GN`7=E}>TX|C zt{M}e3599-!Jumy=u>=fGJ!WLSa{l3!U>4E*1RsMU3 zkGiHtSo`e(XyY1zzQ;g2)CjcS*WmRLHt_E4lyvvk;C1ls%Xl5W7g%qu5!T&%^_b>| zMF(D^48!*UcYKXNcQeo-H3A)84$ymR1iG7n4z3aC@cjUtQX|ma0Hv=!6Qbl(p92s# zE)E4KRw;`b7Zf%88&D`_6s*6nBrRwIgZbCLhl!{F%mX#zbO{3;Un9_nZvpzuzo&dJ zgBe`|bS>%EZ}k>YH`WMr=63)cP$SS^8R-2r0-bpfp#5tE`YQuXsS)VRLjWCBBhX(D z>D}cRM+1x>F^ODw7`aE*D7W_rI?dkSR_WM;BT%R&LFj%xqBrri$GJ5^I`b&#zrsNO zS_5|V^AS#JL z{k4Fu`2hk-{5wn~Kj;IZuKzoz#1nu@{yV6W6Z!}l?-UC20!8dJ1IsEX-f5f)&D?L=x(s6&ma0D0!c@TzoZWrm|D`a zm-OF7eA^|ZA*1A-76`OvlgU(fNNf2O%65maLFOiR$Zy`LO?>!lb5D5uEO-)nKTLEt z(T=(yO=QbDRyX8hISMCf;Cr%!J5u|N52{%wspV~?9ibru@&qLV3uX5*q zkj?yZf8n6o1{{B`sG246v@PdF8rE3L?)N0gM=4|`KF7$I>3IMXrp+@wkuLc-?V9Cb zhvAh6JwIShUHPB~bLwBLkvSgBsn60L6RE#b$ZXHJ4#zFVSAO0J_QiY_cQDyKw^MMF z$ai7;aB&^s5voVZW-)Co%up$16ASdC=qQ6Jta85XSjJ- zJq+0F09bn^t^!H|wzLhU7keI-W2wB@b4iZ3%9ne(y5x8YUFm6#PvS~ca(vM$&oH^Q zb;Byp%QCK+zTk;OsL=~x7U#4UulB@7)eQ?NaTnsaT9~S{ql2{=dMvf$ipgrv3c0Q| z?M2TEGIB+~?5QQo?WoNf&k%g3u}^!;UgLRKmD^L=>z*yR+Z(#h^R(QX)~xgNmGOcA z`*g*fGS2|H8$5}4n$*7nhv8i~H6e=aijBdl22No3I51*cE_cPY z5@G1#)f+cJjPejF+31O!kOpf24GqPt-_R_k6?wba5E*ecJKe8}xFy$$xB^x-w}^{l zb_{S8h%>PQ&GM@0BCZl~hAiUFrc;9DX^mw(wjgcYYk3CA@=aKBhsKPeJ)1m}<=WQ3 zH#}42rlXx33*wHQ#5b>!m?X87G1jg(JyVsQcd`Y4G;QBaI;nxvw8OO0yV&LcTTd7H zjnIHJcr||)6tig=K2hWOjGN!&Gios?#%ox9=>#f!7qxpE9edZ)yu)o`Ud|Qlld3kc zEmPc|w7&?zpGnofHR`)6xQBstRX0dJA`^?Ycp`h=5vJNW%Z`GG z`=tL0K!&th5GOG3H1nx|w8@md1qGQzS@<-a#BbxVcEBNxB>|AP)5;t6 znDLRPNza@xtyscdGe4{nS;$wcez4B6icc|dI<8t;?s1W(&ZhMrc{=MH@bGLpfj}$| zM9jH7*Om&AYxf*7KK4Wiz|!0>JX2VW^nL-jWG>D47>x@rXzxHn!Nc1-JR|Vgv;&2G zj85!;X2HSNC!U+@fhabo@>o8s-(ofL6DZ%~)Z@je>EK97_6si$kmXJVhjI6Os*Klels?-1=hAj@w&f2 zllGz{yBVN~D#(fD@Ql9peWn;`ka~TwXav z@AEX}`I7f}M&lOg(tWULz*_F<+Mx%Q6%|+wg=0|FD`I1oYglH)a*C`8tQ&gpuU?u= z+si$@J507%-R0+HvoAW2sfB8Wf(!S$I1+2}r*U}}70oGezbCT(cn2$sh7G!dM(&4V z;(3Jqo}DNO+W|9Im1j2AG>$w^-N1Lm;vt&^ST06LRpA=>faiy(eZF&UaFfB#@r!L^ zcgmCdXxBHMq1BV6&1_fMow68;i`;nYD7*vj8Ud)+(BsU!5NQw`6 z#(7pSc|n&qP{?8E@S%n_P(%oC-zD#g-g-Vs`M%=2*6`%nm+%s{oX&Z$j6 z6&uIFR5!{v4o-1y{x~|0BV-@ZwKZ5EBGJZq@K|}k|^9@=C$`u>` zxKp+(&{DBeCSxI9_O-Wwma+OL6nGbv{{$0qwCE(d?=NWCNdz!JJP9TG+S+pxhC$v# zZBBvI9!fpsX&?1927(xpcE)jgzM05_f4=oAWmGp#@6iS_K|`md+#ql#0& z0S}@-dtzIBjkb<4o8j|zBXtukr*v=9IcS8wt(>O)3>)+{ZTi{Msq+C=8kPeB$2VPK zP=&5-`;+qV)$$MXTp`=O=J6r%2dqY?G0bXvBKBXaaEtGoUxl8fd|Sv52Xb!jZ2kQlgz_ylItTHepc~Giv?poSIS)nD z4O+BjT;^|Ugm;l)Wbx)4`@~vh=RIMHe3NzPHw-H=me};Wr@7K4w&hCt=0{Il(H|Z? zsx_Y^2(cbzjQR=y2PuDm(RPecu7IpoJNjx=&5L7p->G2~pgm;(9InS_`~gn8(fU8Y zX;-WK540zF--cG+SeLw)QeEE6KWQJEUEU@hLl9O|sKVuqgj#VmT3e-734(#x7+)*U z0@SLN+nb4&I^XS`?72c9%IixP-QM;&=2D)|}E5@07OXv942S z+(?$^m1jPo*DYLt298EvI2VoF*Bsoet2m^1+soHbsOn9MDz{Y0WNohNy&EJLAKpd9 z$|}r(>P_h_Zz#u$)4wH&`u7!UcFl@a!SE0L^D0QW1}|bGdH7!@o0@l+Je+oE-cI0E z(Y;CXjg+i=yUHW1Y~9;hi74|O#XiV2l(h#fe-y2$f#e!>%i_Yf8&wU)_xkz5z-& znQDijX!o<0)v!V7cwVcpr5CYt;ctZs;9e53ynD;arP- z^VRuQaYHZDdpZ^gnm1GJMkv)f8rjJESbdwd+jV)Xq$CZ%+BW#8Z-fe3Pi>;STW}rr zM3i@QK%bY*IyF1W-{)mC_KpDJO^v;sE`zGap-P|JSJcEi6hP@sysTTE)Wkal{dsw; zw z`d=}fDa=pV%XMd7X}Pt!jTdJN_S5!u-W34OYL5oH-zskJZO?XncXaS#ih_sby1?S$ z4X-Y+mEZVPo@;06cf2<#;7b%AF-@LmN>UO_(@GDL($!1#5BbO*6=c=#tuHt+1|%H8J})_QINAVt*Hx zulHd*6;4?Ly_WnlwMy}}md{XH3bf*9+A2aPQh@Jg${57c<`3ebiz3u&uy-EP)(qxp zyF_SADi6&~^$w5~YkMl%iaHe&>8Vt3wf6z}9;@~c?+`E6PDT#*_I1hit)(N-Xypj2 z)lJ^sGWIeuMtNgBGlO9J)GrZ&QxsZWsXlRYO#rv_lDMt9kumiPxrcGMUtq8LTI_~rhoPdmx)}#px z?NlpyBCF7!Y0~YyU%_!P&J8S`tN#73nM$@D_yg70V9lHZLTT$)F-l1*dcy|WV zQK;uPamS}fxh-*7Cq7T=diZ@QQ$g>;>NzAYj^<8=(TSrn@rlj?jyTK6@;P2@xhnE|PH zvF6V3ZgDm3&lZ`mx*=mtPxP%gA(a$@f``oSMB^U-o^;y!0PqZ?=vk2CFq$#TJ5e5F zRm?(t%4t@shrBrVbb~c;ws(lz^OhCC4e6WK(z#wsl{ZuRLQs91ve;)e&0mQA1@{LQ zdSi256tF2TW0oijS3BlVE_jAROoYi&UOApz-IM0)8qOyAr- z{8v?_=ajzVBk+Eqn(Y7#t^!bB_YuH4YnjW3ASEDuqc0tIr2Odvs?t;L@ZrBJpaA_? zdYCN#9&3I0u=gPul1qIAb^^<;vmW)nCOZ-={oLwS0BeO&cE#fm-A=lQ&xF;5YN*Oq z-~>C;;VN=@K6$DiRmns8x+-1$*vHN%xI*PCj`USkdg%wg^iQo>Pk3=g>r2Zl^ybP< z@tzo59I*wML}r-G2mN_89D9vf0!y-o8J~$5xNlzqJ9&U66`?^!)21Tm$N{=o%dQryYCR`wc+0FY}(4 zF$#YM&EXIodIrt+5T!oLLs`!v1TXF^bePVt&`}!s970EF)^iAbPZccmJt@V|Wvql0 zdz(bvSE!m!y>6>2RLXr;L9zEz9UT2Ac-0%*6w^2yXkoL0P;Qu;1cFl8tEe5BPT=E1 z7{jHsKL{%3HE)v^(|rO4-D01gF*76xYz)9~#)Y?`lyhXh=8g26_XTkvoCSXsK^4ws zSTMvF#7Tb^R75aOFDgOkcVD7p#gw3RqTE^QFrxa_TDs2rbV$?t!ccxL1HPbQROzm! zhEe)vZ1BU8>Skd<9bL@@65@69dwn z65@hG4h(|;5J#c7VaRjJjJtwp*djfl3W4eqf*QfwwMZ9dqj>%eGlf`EP!A;z{x<&n z8jELzLxt1rZ+jcy`0uQ@y|LA*PoU+VX_A1p5ZTCn8`dqHD&B@l)TfJY^By7L9oX9@ zI1Y`mTr4$u7lYWwl>RP2qA2TKZ`V54#lk6CQbX80ZP0bJ=3VIib#(Dv40MLE#e<}K z+rb*DPhke+VwAAvK8yz1Q0n0n{fRe@KC!*+Fh96pdk5DU!8;itrV*6(o_A=(C`|a2 zFg1~xd9M$_2r9u1VtI@;@O|$kchj**3e7B1UAe0k$nI5F$r!&&Oh}jO}| zo^5DAW9i~HZ|?~7#xcA%205J~v9#<1lyn@`-j3qqd6w5PC>Cv&ma zl^eHEcE?>EKp<}%l>r04)2xn1or<#`F0*U5$MT~A>3JeOZ(gAqA2-sy&lv#Yz9B<5ba1Zk~s zr(oSE9{9C}+S5Uc6o@R$AGFLG`IYx+`Of*713e0AUJ3I`U?xV24PR~~amIGf$B5Qo z+J;pC9#`nyFdv10_DPWz!?SSP{4g(WF5T#nM0g|Ku-OPZ6eDFe*r>#YuQf8~D-8s` zCG#ocYc!PwI8%fk0ykv$^3bBa-YK31qL8HzTgpB*WSmb0<=)mE=CeH_&H|R;IGQRJ z>Ik$O=JRrTw?X*jP}BJoz8~tdfRgv4dstvC-jC|4^GsogAz7`#^PG9FSoQ($6nBeP zd^BI@2No-st{A+N^~JBF^zSftTSt?=^A4{69V1hyJ%5yc^`c+M{>~d)f4ztv^rnc; z-)5cp&bzEpPLFmm(p>z~+Q&%S+r~(ZI{Z(6IntRnF;Z<1PQ!N-e*aqra$=;-tz)EY z5Ke~_&Qz0t^xtME2jZRq(J#gC466eC0wu5-%ms%3>Hl*W!Wfi%WI~Lz3&fUHlR%IE zt^{&;>2`pDa1fdc1~!3_z)~*zuQGu8XT-8l>S&057W@8}Mb7A50FBL{7oLNE!trZ` z$PFHi!DA%SIGkdEKxu7JgNS@(bDms3+jS)F5~#rWBYF;W7)HO==oa5*(b zlnBBn@Y{sakE|wvX^8(DLVuBt`mbrmV-S5vw;0L9?*{w=^F{yvGLZ9ssK>b|^&t>W z1+fd&s$k9kCj&LEe^%OLNMJrA-Uy zVcOr+e-=uc!0H^t*l#tM7y||l;r}(&7zhPZiM?S%@Ee$nmeLD(`~1x>=kEaikLjTx z+6KQ#Jz>uA`#T15{tn>(n!cw8ss@BpA%zpwBoKW$LpguT;s2F^Y>2)9zmO|qq;h-% z^KS)nf#HNcsQ=)I|2*6XCC>u!N)TIIO#(Mmm%u+=|Ew@u!9XGi6@!5tU?i}Bo2oJJ zkJmpVHXfx8hv=u_+wC%u2Ql=|)PFciwH^f9fEfGr027BGg+=)PhH4Cy0Cw{L=*Peq zscazXKMjFpgZ{U_;{NE!@H>;!FGkA1KmTh6#)EDn(9PL}($Afe;*U;= zfy1~IQ~`d01k?Wq46H<<%TrMQvp_7SnglBT2MnY`0-IU=C*YS{O#uh~4|JlE)qgR# zkWl)qMsO7bR>wc}e=!PbpsF{67W=Ipg!<101C5Yys2T&w;4UK#-7J37u7Nong0?*L zpZ=l#{~gkSAUX!WrB}yD%724_oWChi2ncV+Zw90gjb9+MX^0OD|Ns1-^LLqwA^KhT zC0+{&;1>vg=BnUuU|J3T&j~{KXPHt_>ct=&gVJuTRt0naV+s6C{WFHnfPoAUDnn_{ zRFlB5|CE8htAED8Vw8Fys$eC)#(ysIAc_BJ{SQQ`E`VSU5M#d#FcFUMX7+zI1}Xq+ z3Gd^2BdJY znglK&?JsHM)Lc}5jRZJKAo?==Qb)i};1@`+;NLKi6A1X9{NDy8-weV#Kx}C>2^fD} zCI3wQGsaJVfoKrQ0t2n8Np<~SGVl-8KVx7LN}Y@<^QDqD?#K82%fo4 z{0hKCZG=Z6KBgK2YaoHzW08hm%s6!QH$!3>=>OTD|JAQ@42InxJP_X!{6IJ7e@2`Y za{Xvj69~706t;5-p#GiGUqGVs|9|V72GM8Xx1Ci1ekXDQ#9#bBVBic&odB9UKr0*n z2i1R~sFVMy6pA7G+MqKF3@oZ%|BL?z3>YYNC74LZH+*!?f4|NvQPKj`b!~jv?*hbc zgMmr-zgrIe1S;DiNTB>S7?O#wW|J`Z#Q)MA|Gi(%pCK=v01d@&>v%AL@1Mc^LvcBO ziaZ>I6%f9F(l4zhfssi2hlm3Y>i^G>r9<@pkGJ!I%X3^G`17_lZO@CgwXJP!dsl61 zt8H!Cgb+f=5hq9JIE_X-+LrAdIpPVS5pu-SA?L&iaYE>4p*b5N6DPz%$PsdcOq|fx z?|Z+0y06~j&o-Oqvun@uy{`MYuj~GQKX31!e53`bLS&lWbB43D?eewtBW>G6sgqYQ zRw-?KKn+yw!5a9%_E)7Srvnz^sD;v25r`~V{GRI*KivKvXOy~wAVN9k?a3-1R^y`m z(vkr2zrNPy+?486ik%KC2q%%r(0q*6!ToyC-WEPsT{YO6CgA zyAy!5J2(07iNSFPQby?$0%{-+y+7SgoUNTn^rLASsQPv!;R2cfk&eQ4DgfGF-n6UN z*_65h$H}TD0-B(DX9D;o?XQA$Qu-ns_2w~K2Gl@EKtMlKxL?%%D#KcwWD!Io=MsYW zAtyhf+x7O(p|k_4)HqX;LlALr2iG+L0T=`oR={vZVlL((^&)o4f09D`4_EAYZoSZD zbR#iHIWo+jH7uF{;~uhAtm73{9LG@$tpPP)bzmG8(H?Rt^UR>?-AJoy0z}w&{`(aI z7@*V%6s!(k1;c89_74kelf6&_HB@~s&a;tnnZIiPf?pwkR7%}X5Si-i)=glEwvg@e zi?7=#X$5WFi!&w0CG05)APs#u;`7VMtWgq4(SO%Gna7jK*<0QcCIL18N`_{oV+`l9|?1^=(M}6*K`NZJ~Q70Be|&EJ|ID z<0MrR0ZmY~R{{ud5<=+Nxd0cmCJ?Dn;6f0aoMPBICifpalI>~_YYU;R`b zRyL*WSEa_8l1y%lf!n#RM&!){qzzrqP({+NrKw7I{lD}V39tX}Vg_B;u>K9 z_YY4`H4j((JQrV0E#WwxT4)KVfo5#Gl%KVWrB|63QT0_w_;qwr&eCD_E(T!9n|JoQ zpHi3Nyb@=*0W}c1YfZB2?XQAtr0RQco`m!fhzz`Vmjc+0_E*jlDYcWTPvzWt)$jmh zFh6^}v+ci$k~ZP631>>O38I5qh(X^Q5I`X{&~+0X^v?`!#Lab6`45ZrV}@Uyg8WE+){hx}vA*<19?Nh%KRHHz3;oM=ZclWx5QU{ZNHO^84Y9PedBzvv>RnP@=zAl_+AUOdA&GQDZ_u5|t5KgI^2_lAb z&ke(yK-rth_i+0+Q_@`8x(jDYT5(cA0Lkc`h}Wt2oI?#%TelJA?JTR6oVkwq>#r+T z?q66?kcJ8#5IO(K0a!)|jysSxN}nB218L~@Za`}Or|R8E53&i74!i8(ENy$_+M>Nn zRmtz*?{bv3C!h(+_i_zbsuV?Zz16ww=uN{wlD30*Js-9s$G!^qczK3}C0*Uj>j$sZ(i!0?x*6SNX6S z|LOMc#mN8;tE#+GK@j0^CVE#u0JYRW=mWeMjYL04`dVIgedyY{A}LV&qlZtnTR|#-OmJu;}~k8C7=d^e;^?1XCoAu?@Zcssy-iSQB8ozdujNZtfEvibu(tzhc#IK(SP2{W(Hg;)7v}$;$aL=qpxXbZ0%+tVl&4rukvc@C zEe&94+v#iTC!DKHYN`H+jWh$-O2`w33+?p#|xcT*Bhk_jN3b5TG589x*J&*hE% zr`um;kcHzKq>3O~ILk~E0s@k@ox8S%XZS-m_2MLrwk{x;>|g9Kz~2wGe=b8!N*|63 zDg6%(!whO9<5?ctkxkEWZem_<-g&WhCGn4?4aaFblKTu(Ir3xaen4;SO5z_)+we4- z2^<$w3!#W~G=NR=@N3$CxMKG>_<0^WkV+&Uk$IN?Q~=g4w3W;>@H$DAoV;3bRvFL- zQhuUI_DK7yVB+a~E*#|(KtVvE8h$*0J=6XwfILcFL=c6XgMX^ZhXwZw+P@DcskC+f zX0LRSaXJBHp^pv-ppF_SdYK6fDgPHu#X0*G#8UtLN|N&uwSzRY5Flse*ZQ@bD?c$f z?m#LieUi5ZtfA89Vc6TjY@+Hrk)&3d0LgxZ_V+st`xOGnrPNh8PR3W4Y698*)xSaj zVU)fIKfN!qy$fvr5MQV8*T~*D*W)9HAeuOryvX{$H=M{kb0}>vRbE7imE=+C1On*b zy5>dE{^}-!sG_$L8Is*jf;U*z-r9>|{XpjZuhTnmoXWWo*_#1aKa_bz8`Xs46l$R} zpawdy{m?zTsk44CvvR7w9*KLCCP8H8?mZd+?JqO;Uppyz6^`q0Rv1tN(R;E02#7z*r z)It*aU_?48qXv54!`6xIea1D{t^eK~q5XI7MxL7A<(jf0%{;^ zr<&v!w7&|ln5yr^c{Y+C(3Ax`6TmNNe-%J9rEVjL1kU{(!<#_ae@=F}{o5$1o3`%7 znUW5iR1-iN`fx-#%%=uQyBW?%)hE1=!8z~KVPXX;_Bf}0O!FXBAMvLd&cg$s{f8^| zJcr`A38|*^sR1>RVPV+Y0klx{JxJ<*XaYp~vj#pKu8_t(b?v6qwK$HUu)V{ZfWQC! z3N_%O^tt$Hr?Adp9gz0#{S^Y(M5*%$qE($`ja$Q_*>g>iMxjEf@?4xLDZo!M0W@)4 zCIYZj8+Vg9?n?|v?lz{=UZU*#RfO+<@i{VZ8jhrYL6nGJzjx2Hzu!UC=ge$4PNNpO z18SfPn?KziJzJuhE2;WMB;hO8bVNET+)Dvi(n%O4ufcHx&WZzSAa3t8iEe)tNIL<9 z;3$&-LPgCeTh(3(K(xPdl0m6sXo4KhJ)aG40%hOR(qU23P8@dPOi3Y5`l*E!^iD)N zte^&xzGERlO1|d_>06f9?Y~T{UCkgErx8d-KQA^TyLx{>dglLKEJ5{unayyVO)c~X z)Ic}3UCWR5-?bYU9aMcgl0Lxp3z7F1?P>tlE|y+7i>BmFIBvvQNk9$6?_!hea{H?Q z`U${^qbvf53n)PKt_85`?XLpJq|~W2K`!UsZ-zI4vhTd?Wczng(g7TH;Y>*dPQu|- z^r47!SV;}!j+kk5AZ@{%gJv2%qkcrJA2a+yeH>0xkV3~yqZj$H0IVM~{8D|3G1I8R zaRs#yjmZ2$bwGUo%P%bHkKG?Wa;A}p)FH))Ojkp2Ubg%fd;XlRN>1Ura8?)42QvLN zu(#S@l`e(Omw=;U0w@irgLa2V@yZRDBlGhSVU^VZ>e!fcCGa)T#T=G%|4(9Z&-;dpiJ&4p%@2tie(L zXeJ5*ku{LKm-~dJob}wA6n_1VK~~Ko{4w0Rbcu zT<3(DM)Jg&hHDbd#C5{tJtegN&SX{}Mh8W@$1_Yh@60_rmB!l1k|g3d495eMzA~T& z3bE~!vmfwf?d*-&RDBWBkF+52zOda7z#5j3%rx-2nNsJ4Gfm?xE}#aQb~}KbY=0F@ z86B_+N4?|d3j`tqOy1o-v9s;3oDJZllOUXwzL+3n0K0qrlkM-OwAHkA0nU^p6GR;W zbZ}iA5I`cq)lR2>Ae&~)G?F-%&iq+n|Nrxeb~;VjG-gtyCxU*$`RDVd{eM2u&Zo)3 zaVUG)(qZZk1YpSod*ZsBQn%pPt!g5m2HO8O zfIZv(ssPEc6Y0EPSK{%RiWJRa{qLLg>pEA3ZH;CE!*Asr z+CPS>kTnqYD+ClVm*I)jTl`mo$N*}IPV(Nk&Y;jS)P&WIv-*HOko7CnKq{RtQMG>w z0h9%Fz}8r*&!3`t@1kg<4=0%L_#RPW% zcCOQw?0K<%D%13MW-lapA<-f~m3B96eE-i+l&WL_8xI`!Q~Kh78tB3HQ}^zijrRYk zgxOSm5i)?ZA~J3Mo(RDDiP9@)b(A_MfsH55LIY|bW)C#UPqx1bz)c4XR*nduhd^Wv zRR8h-e!BgYvral-H$n7rZkj(l02$2gUH?G)H&N1R+PV^FN-_zeoB$HhcLfAcNe%Q~ zN}9`9>ydsWnLLY;CM39sm*J3NqzM^7k}l_EStL9q(kNQQe_e>{=tv_MsY7~^_+uiC ze54NPL86b1G;)yYW9_r@%taw9m$}_*-OEjV7kR& zr7Vaxa*$%A8fikhkl=;UMl_Ow7t23IVNHtc;aHKR7%dy#qPm~l;q6aSHjVR$6;Ap8C+%;{G7LBsX6 z2M*`LLx*!sKt2(N4Yy|n{FUbP zBNGE0W)3TXVZ;SEXb(uAakzckRpt!W!Nc8T2UJYCJ@-m;#^T_B+{*$uFCf~^gY0XG zHqsf;4(@>aiVn7qr^5wx9coXx%A9_7YCtt51mqhY5N>KfDT@N`Pn6Y4tyUjmkD>Og zmVkWH1N^iwP~^ZU3n)iI!2Klw_jd-wHDJ#+LKtXH??AKdtIe@vL(ZN(%t^8R_|@hK zN7gQyWwanYh;#8QBMwPJa*-0G25CmRk&pvs88JvIl8Y20)d$$eTw@;ZNV0Fb#*B5; z+8eJirv}Bu+izWCMh3MVVDGqw8aEc$(@V^GL9KE2@g-(tWc~bEM(2`Qo@qc$2k!Xc z95LU%fpo!b3A6ZN@ipco`^6G--=Kzt_FJff(iYe|R5mGOaa8WI6|0WRIdR2WX5Vvi zhh>|(&^~g#8OiTGFJEs)1(n6y*D8#&A6ReBnQl8Rdt%XQ{O4o8i>@Ac*h6MHY6 zZCpWNWIo{wHmthdT;p)0+KX;9XV~#KnxS^+ji$@tvX4-Te5L5Uf&YrQ8ryrqEF(Q_ z7P%OP0|~Kjy3xF1X!WpH|J6KsLtdGAS@3Y3ebg=HlBu<{@o}pzT$Z;Y$EdwXS8x8J zS@vq%oVek>TgIfT!)dJ(XB%0QX7lp#Y+g>BZL|sLw{N=BJZazJ!*q;p`?EXE zD1IM%>|N%hVU|LB$z6CaIn3kzh#B&()WiSR`#(61+6#6Q<5oI)Kl%c41&i|B-o^_~QU2SH~mA990*YY)MR?|V`&g4!NddwBX4Ey7* zvniG@XVuv4H_!2~i)+PkS5nE?{YCHLewlxn{mMP&q}ejd0S44DYgVs3)qQT_(W*>m zU+iAK*5EdKzkAJzD`nb{Wy8Z!gHzhoT9Ll`qUCD{Md}N<@93PxOO`A;Xqdj2^fFz$ zebc?>)UmPzZI{h9zVS>hcK5yJq+xA+;0A`k8b?sUvJH>iXC4;h$hW`zhk48#|Mau) zywwZWt~qDnc`Mwx>&{+q&gzv5*RDI~oE59iapx^Nd#!zJtvUB_Bfc@#IE{cKk;9OH z4*qkQ*q%%($V5$TGj=bNk892O`x(Z@SmSguSb&VS=RRPb!*9o5{{SPU)PDE@bIC3h zY%IY%}Ds$)g3v`?-xr#hPLm38K^ zQ@ThTp>En7YmDPGjx%8!QJd|T>&&HNQef38=We$5d)WNl=wdh#ZnRfEY#uwN3shA# z?rHm}hs_0J5}uAVrotyZZGZEyIeknXJju(`A2E*~T@J^1Zol9WbK#h7a1O|KqTT-p z+X~k+_LfJ?gU2L46Kjk|{o7~k{T?-soK*~~Y;NbQqB+=Q7_D5ZL!E=vdBeI#&GC-O z%}w5tyv2Dm`VTm(67_Akv);VGp?j}q_@DcjInHs3eeq-F37npN%$zYl<@s3ERK_Ws z)qu`>&g*EQxX$z0itMo)%$Q+$p60mA{>uh)tJT@;y>EWT!DsldyV0pU{pU}7{GWjH zr#@D7yQ}v`zu@r^WPECW*hQ*v_Kl6k+A?n~4 zV~u_Bcr0fXW$LoExd$Koo7Jn98%8F&F?3+HHrg>ynxW&`$?$Aa-HIHKWNfjIf6{z< zLI(PCkTuA~$kj->J+slgcU;0t-YQXN)n*AV*>5$PQ}#)RX>VWV8w2MU&oaxd?Cy=` zNsFUjjy00G_Yfvz)l7a)g;h`X^KtMr58Jb!G7p~b*WZ9XS){9ne zk%y6|kd_T2H_=B~bti8&r_L{X#oNtSc(-`2^Os+&dbUxEUbO=&+j;I>muH!4vX^m- zqusuAvpK`jXWy}z4RFM(_S2iq$SH}hdWYTemHGSvz*=^{%iQbMEH|=VwRdbbCr)!? z-=7Tqj#e&TyLQ=m%U$k^^Ou*}i=H+oO|J1JS+)GUW$qOhE_bb2y>3;G8kx(U_WFI= z>-TB%z>u)lVhuGM?5Zc(DHv(5*`uCeA6{tBeTJE`%0BTK^Kho6>!B&ZZLx-${Z_4Z zUAWr4+;y%uUn8c?-tvq&B`CSg{^%LTepZ`3s>z#4lR0%-6}PFyd*zC?Ygeo~&y};x zz07s)isgC4)MzhjBA9mja&_vr?`$$B1%+KWQ9Z`fh=umd z=ZUn!KH_=v07rwpPMvz}`<^!!2D#epx1Ki_2c@^$`!!R+#rC3R^N?9J?cO={pPZ)> zwtL0O<*xi?Ydp2>>2ikAW8c(l&X^MNrnhSkmB`yAjhHv>EzRVd{HDF5nTIR4eb5W| zt+Q9YK%u(qzq~*(Lf^8VdciznWWrmq#wqsZ7tA?!$`&)iQD!gOV$Rdk5F5v(_6u9g z8H@TzsV0_UM9tuSzK(0Pf%WqdT!$;RC%nh*Ww(|vqK!1+uct66&& z?=_8b-_2*fXP^Bq^RK!%@4aRoWB;br+%ITFr+rqdIeT(nr#G%`oK;-@^H=sAt>(gj zJEy#2P7GS|zPuUfNpT;>8Z0-)If$AA{mif*#+Sg0guRe!<={uNx6WR+cKOnT1#8x} z;Ubr$s{b5-`1xqAl}kS_6UkUUrzXtryR9y^xx+{XS-Ib zY=`vSq#vcy**CSDZRn+O88tc=UgF8*pbqmu=CupZ zI=by!I?Op^!#?va2XiJgse2`V??sv=sM@N6|-Qo7zAHHKA9+dOB zJ^NjAo}=16`CVqpt_@ecYyK_BGQMDbLR`o~7b8l(_ekKBw@A+^Xx z0Rbwv&#Ft&lPQ))xlp~&N<(8HvhTlq{|Ox z>q%Q)-evxQnti{^{FK%0r4P*+L22LEpMPi`6O{9fz4RmV&q3k;wYPj^o;_yye`5_b zU{n8VFa6kDJh~oMWA6p~f{)EfL)dNK^f9@F^xKboY@QW#ZvTdH-R2`flgs+Oam@PO zJ22uot3gy|zw;j!wT$oWpij*sM;4(zz}sV%eQGXrG}T82KBr73oFx`Hr?kB9LPG!)(rnBELg&kP8qu zZF&{ws_$ZF809#95NJZ)M7oggkbQ`E-1qjoJ?3R>I)49|dD`gE9lqxyd*f&3TD3d) zoM#~h#^?0)KKstk*+N7P+OK|YZsWY+xi8p4%pEY|Je!7XOi${0``l%DYt?M#*Dqn+ zR-3*7d+e9y!nuES#CfI(wJHZx2=S7JL2}=)5NQgi1fCJ+X;uVgiijZW-&0uvdI%nnSAlQB572pSNzU>o8ZmKjA;nPPU)^&YV7!@Ih2F z?2zxx@M->358+!aCw?A71&p<)Z8K+#^Q-nnrM6r|vg&*Dn4#PrAh*L+d^^537mx9$ z?r_*oeQ!>;GY3rPP!{iyh1ZLH;efexxj*p%Op(+Z{2P(}3s^m7 z`tNV?@mzF;_So&_v13d2jq{B0J2H73* zFGB0B&qMvHKarm*mY+9st-|;7cU-H@gP$E#!%}-WdB>nIFGUX<^qz+ z>{MGwHUrohz!$*L!rg`NX@akW)&9lrZ#hhO3x*UYpokO+_Jd^rswa%JJ)Lx{!#Qbe z{@6IrD>rIG6NBV$ILP6=Zp4`A3EsgHHo<;5*clm=GQr*!>^y$-mFU%SaGQPfNN3dO zMo?APZT1Bto##&ppXi+s=5bb0G%;VPAvSNK{mn?{ywQ2+)lj*@o;%8U!r0B=OfU^m zxoozt8s&_g7(B^4Pb8pH12JpeB}VWh`?*oh1wkp3>~BUn&mQ?4X@XQa!tL$fnj!Y3 z`#9%}Zbccz4UL|5er_Mlw_l!E!xbnL}H9@FD zl~zqV6%TJ8RFjN4lr9-53D9MrE3h9P>l{C_2vdc9=UnG_J3Y!7YfYWsCw0>4_%yna+q^QTs5W`V&s?7v>DMDqq+>80x((JI#BW$D5m5 z%C>ADR9@7fA}B#ufzG>bcy*QN>d?u?tV357aBma38j()r+dhH?LuKe|+O!GIkO`qL zZXa}EREJ9BBxh!?2~=^uy?%mop~J8rhvsf--9DJ;N#>2DjD%h2)UZ&8intnGuuLGrSid{ z?oVS1Q955aHj!pT#%tT{)sfB#b|<&S_``k&+=`-D1w-2f@ulkO^O_ZAyme*=*P2Q1!o8XZ-=u+*?_Zgj{2ktfDhyr2+xD7pXXJ5x z9oq*tp;Mj9ACann4ANA*ThFOiAcE zxmJZ%U0xNq34O3Vb24ooVIMKsIp>I$_jQXYM=m063(zH?>kvAXQ!2VHbiNj9oJ=cb z{hJYk%}CWAi%6Gezk|o1j(^)bCOc;bwSQpGorP{CHaYDwYx|^ufl^)Z#Q;9Y1v+aW!sEiC4@?#w-09fCL%desmu~s&)UBFVY{lZ4D4a{!x7F&Hf)|998od zldQ+sVZS%YIbmcKKpxYblSVgknHRKUu+e^a3R%X_a0btJj@U7*Gpa)Ok}e6ozh5g| zFfTU5*~?})$4^ecm4+h@sX|w5Z=c~@I5}hg9fP?ZgV)rBsRmt+y*bJmHB;pt#%m}Y z<97^Jsbnepl{x4KN*{+l$G*Vj96v3E%bu_ugOveEve4(-camg@o6EilI|l0ll9Zw^ zoj6>t;;u#?Z98Vt!NMl(7%U00pPImCBz~qdctYW1>Okegp=RA4(iYpt&2-KgRX=sd zVEhRC-AHGoT{poQJUWHU>ZcQ$YUoKLbHI3eGf5rc_9ru)v7?HkcMK*3dGAPybcW0; znZ09BMW7CK9^k)XbS|af@Js z?J-f#1taTYsp6r%R!Go5tbIn5lee42*?)?1PMPbPKipp$uY^UQOYpk$v{*K}Bzt3& zbK!)TMLPyn2i`3 z`MX4Og3ey)TI@)ZpcCJwl_yRCrvPxlE3JS zWtf8P&!X9fV=zxS68ptu%)RInl%B(dWS|SRAD-=un%|bq5b;*1XQot@SB5$3Y+p>U(p4*+ z?U=)y=N2Y4E?Y3U?YVQD3s23<(T>zzp*+TvqH}Sr4%Hmd=qk|prh__%n5k5DDcH+% zcMPf_MnQ^9`^#C*8Drh3doS8C*vUMEx_6XPPqkDHRAZ{TYR6!{w;Y~*gYw>pzW?eS zL)#gpYem<=Ky}1zj@Nxbv*Zp4#TIt`EI$t+p?Uaqc@g`kEbsncjq+ zN>mAxNtk2b5yRwHk2%q6_Qa;l`Iy_Tv0sjHP8{i4&rD%oKfyW24xP)4UT__4;u-jM zJRH=2oxOA}Tafzp)3RcJEfs{Ka$uXCN#9YyxWxz4D$oi{O` zD32Vf)D}ALc&vz25qD$>rLGJ&c#} zo66~W4*P~kX1mgPJZd@ZTjn`u{4TSCex#Opl@7@xZRTynAJA6C=v!{r5qhFV*M=_9 zbGP@&yB1yl?e>^h=R6(+mc%+^8Gy@To#WYCuY(r!RWl9)GSA{+G~*tY2c_rmGyuBl zd+nEFofCta?zKOPbuO5gQqPRb6N)-0v(ZADmJRm2IOmiJi48jj<9zq4N*TbGZl50K zoN;>96TW_eTE!hdmD|vH>dU7~L08kLTSaA`iLMD<1=p&N`M1<64>z`C`;|C0cL^JZ zci~D*G3c7qZ5*mJb?DkRZrE?WGtyyoq6jh^#zmZ4qoa*}!d844=Y*@guQfQ(+y{4t z@Jq8kdmrcUF)q(Lxm5bYX}56GW%%>E7EYNSZKy4VvX@d-{ldN#j*pDCj4BeU1aC9S z+MPOs**xWxP3HamKKm@5K^pdT8GXKh^Wob4G(QPf?eFqDh^zcY@gQJ~)%KI&K3F}J zD|;oJJKoYI_*f~zT!yMDm0)oQtIh-$uhe?^QaEO!%V_g)GduwM0~*ghx_6Scp9MFC z>jK>e*UsRB3%&w9z&5wqnyel4qo|sq13HRbXVp~AHzYrsk93#7JGDO4u32H%<8*d<-3A6h0|xb zjDBAYT?&WKrvRSAVO#^3nXx_&GH%-6u#B)dE}z0-+)jcB!FR(+f**qO1wRfK3w{Q! z5&RO|@@Ax=-npWhbS9&vQP^Wc`3ORrP%I%qzu?1RBSr^!9NcwAl#%Dl@NaOKu-^wK z3VsxBE}v=C&{tFd!ECD1gnd5?MZQpk!{ve_;Yz`AaNR?EMu)an8D0uE2>Uf~pWvHd z=UiQY+u=OH*4-!yh2kN&Qt;z&v*2goKEW@+u6f$QRya}c`*6D8PvK(Cmhm-;7OgM_ z;U2-G*~t}mMHykfPIodK5vv`Z3CA7HN0CWvR_mKmo5IvCEsgHNiB_S&z58-)E9INCodEHd~Tio7pp z8kBRF2zd*M{U-@$o;gViR`%lIdN z{ZI@vMj6?@40GTTalQ+X?5g=WG-=8~}F< zJ`@f~&<>7;;{=}!X9zwME)u*P&hC%0_%=AN!v|1wi3A%|1~trdzJNl)DbW(`a2#AC zI0Ei2jx@S`=~u#Whw1be!L8%;D7hStNmT2<=WrO;p-4#7d<&c*_-}Bj;QQbz!H>dC zf;Ykmzl$>Je4TpiWcq}#PlbCep_qjt>>wS$LO4S3L2%1GQAVyW!yDmvVgC!9A^7ib zLOv6bZ^O|C=L-7{*eVr@5Vomxg2%xPf+OJeO_4^1FMySBo3LL5haRj8a5)?!_&PX8 z@GVp5e{P}p8wtt<-v@6J{3zTbcq1Hsh<5lq95474I92f5aG~H2r_leKgyIVlbP4_z z4olJwMoeW?FiHvxZ>PC_5;%;xaQKlf!+SW41K=dVhr%g>kA=(5 z<@47e-ab+RXAApXaFw6c`d^Ep!LNWHgL?&Uf{mke09#;};5Il-@Vjt<;BL5D@HV*7 z$Mk=PF@T~?Bp5Y=PLiS>hQjHBr@;Awqv0yS3*fS2^eD05R$*Tc4|v(4Xb$6M6cI;j zhj+lqg71aX1V0QH2!2wf?`B)>8zm#iszca$Y&6R6yf-iwn1YZTG3BFPBT~UTr7v@Cmv^ zFTp8-x58P1--pWue+pL%{u*u)JP7v+9vwxWOS81Y@hDQ$G*5%G1^H;NVieo~cfQ3}V1#(ne-5Xf>@tFVPd*3D zq7P;2fR2Lero|fGBgi;$7X81E8@z|ZIE@6xDVmqTF2U!+nS$5Bd4estOz?WR?I``A z@(x@t>>tl!{Iv+hmn7&F{5{++c;sw$KzBqL?qF|;&x9j>s{>vRCktK;yD#MXIvn2g zo8TN_-@?ZqjS`_~gKGu93)c(ohO4$j4rO@I90C&dqu{U%9ngtzoZ!>oT*1~d6a_+Y zK3pMq9o!_?f(Hbzhht9F4*86yku3NQI9u?&aJ6R3co;>GRv1sh&fn<_pM{eI{|l~f z(hn-G81@IkJ`b)FoB+29J`C;~V%Gmu6cMLsho``)g0tY>ucC|;UmI4#jl%vQobW>A z(Bh-sAP_Bj{ph)LO2J`p$}O7N$dd_l8!nDoFY;)ZYFT*2x+i=~3cz~zF&;Li1YYmKi!%i%g< zUk&$q*t7mRjEhl({9Z?RC7dkydN^IM4d)BK6Rs5e54c(I|G|BN{|P(K!k@=KHNYnk zjcBFt91eqzjTxDO-+`+H^C<*lli)AmUctP3*@!!m4Gj6I7pcPyY*!eVJw#(1s@7qd9(RKCtrp)pvV#lD&Q)?cfrkq zYhmMD?eH-;RPZJ^Uhoz;OK{sl`d@`myi0;6!QF6&;B9cf-~l-4JRQKOc;*4Yp>Vz6 zDR772=y>{H*~xmCtRq20uFlYc(*>`G^9A1wmkYiFt`dAN+#>j4xV0y0=r1VWDhJ6c zw8IgL=p-@h^LRR_Y8#FXl;UgkDR2561}md2q63%eVkVj#e0#z);3cyt0Yo#63sf#7Lyncz8a zli)?LGvAv({oi36f+EhRP<%9;CHN%Rm7%v>RdA`W-w!tku7}$NKLrm6ZiYiH@C2ad ze~0lZiUhC1!yT}5AZlnaiC)5{RM;25aohP$U0;(}aKEsxhjZ3=OQ`a{8IGvqEAxEm zyWqY*DZ6L=aTuSYh>z35q#y2e>kNXH;y|zy4qvD36X7($E;w88Jh)hJ0^HHdA119} z@9I{9qCzD2Gh8RQ5^fWGkIF!B9URXCqyG<+qYk71!X65TU8n<|0vG-<(y-b`djmKh zMT|(W4o(wn!TEyM!v%tGhD!_i>4g2g`E|kN!u~njD!3o+zEG_HL5Xa;FVYb@;Y`63 z;R3-fxLWW$xK(fhJRtZmIIKYDp9;qni1q&z6xkv{7F;9vT)0_qKHM+(PjK#($e}+( zz6i%$tR21%X9#`|c3VR635p8AU%}Oax5KT1_c@3X2J7efli&nTuQoUw#_4d+fssaA zh_^}Zhs%Y%9=422bc9c#sASXFx1aZh{ST%OT&eAo;nszEltjUWmumZbxLELkaJAqg z;C8_$9E|@Sp*WQUp_l0l{{V-@=q=ZyaI~;*gp&k64`&O01)~M0$DV={R_Ofpx00AhM1sk1rr;L8Q-8N5ebY#sbaxn;5NZwaKGT`aPSo_!+SW47&u<=Vz~AbcG(VZ zr~VUMK4fS8FGf*!bL7y5;dQuYD1pOx56%>$;1jrv)zH6~9DEo}c$I7DRj;eyj8YxY zjd1<}der;{ZX&(sQ0xESQMCFM@B?tK;0}9pIC2R)Kzz%9%{B7xsy8rk5>4 z1>izaC=$$riv=gZ={xkxXjj2C!hR#%CHOD!fZ)Hwi6t(>dr-r0s)v<-0@#2eS0vaB zmkWLoZV~)C+%Nb&ICQDb@O7OLCli+f=2lo0WfWM*$zfL=>f%C>h8*L8nu<3^k<6`}X z$JgL4VSfh>DboRe498igM|wU&re32-Oks5r366x51*gF|f`13+3C@Ol{t{`_?Bi{+ zhv5=oe-dsM{48vB3dO%rgx{nid=ril`~jRQ_%qlo_`h(KV8_vn8o?&qC3wQo^uGb2 zm_dU0KkESI!Ucj4fGY$a3O5Tr7EW8O|L|A=_Y3=7aP-YO|JtMJe0`+u-a^^?Si0j$!I8*A8aG>0NxU{zz|=TmCc)>!U4qxajjfSG z@BMlK4yn)%UxQtO-+@yEe+;K-wu~=P#B7Z+I)c3=JT{f(QYSD@hRX$?2?rSOvpQ!k1* zhhAKq$1@dI>I^5s8G>D~Tkt%%LU01SN$_ECkKj}|*~!io`t(+|_5BnPglQg+I(YG5S_<4za&7B3OF3b<#6VmE(ILCR}9X()1`pJVcY_j-RV-m!CN{Nf2>EzS8)BEE@k9!7~A2N zJ6&S^Ph-!g6rRIjjD`E}ba{~*rot(m`pM-2IN~mCzXVPed=*^#hVImFz&XO+375d0 z@~epcqizrh`rvxOJK%^-I>VDrBI9u>WxLWY@aDTO>Gk66>_}!Y{hEoN92zOtnUj&#)li>!z$HVP{GvEQiXTj0dJ=$R|igdwi6n_^r^nU&);3i>jg1dgJN6CbfsB+Qk zXTTML=fcJ*dX)SLwz?nE0TiR?JtCG=>IgD!fWz*0c}Vq<3fLw1E;w0mE$kNj7+fNF z6I?5J%SrUVo+bLl;_2y393nvs+%9-AJRmp;4*rJ@@EAD#5Bjy@N;q8D?}3v9*QL|{ zs?10u+_x)roJPk<`~&w#50&xJF3`7I4!et&}Ng}oT=6MTb(!da_JPywe1 zz6;I}TnoDeKL%F`-UPP@-U9avZi7P~(EhAJ&;OI22Ak zMURqYaP))P;rVd7X3JQIB3~;E3oaMD9 z6T`c|Nd7IIa>&m5e>{r5Aq9UAfEzxUsX9Dkz+v1CXEx{(JOq~=9ZPoV2r?dr3m$QK zNZs@dTqO7=R|w273cKF2gWf!v0%0QSk5K zEWzi&If5^M-G8CR$j?$Gd>%!CNbm|=Dfn&J*chq4e8W>Cai_BB6!xWXo8V-)U-0p; zQLhV>0XLt@@4Sv;{ClbxMTAK35S%6Wao8>R8Ms#POK_v$t#F6n_u-KL(*b-6CwSPm z{(p@kTO=5S3j~k;9c?anJlrIB8ti;bJD3B<30?$e2|fhQXX*0_MI)JC(1i{U4+YTO1eVsb=G$u0azV+8(OhM6lRiqK>>tyG{{UU>P zaE=%S7Tmmm9|9WfEkG-r`-BeQO}P7?nm>T!kJF>(GkDVzV*URHMW@JM5H_CF8H8jq za|s>?CkT#!3vQ)KeVueAoGt7Z!9{{Ehijh{>;H8qnnZ$I;9kLhgN;TV(0y>Y;78#k z!5iTW!Oz24f?t7aETMQCMT_7M;eNqis0_wN83n#3I_h*r%|;#2iEy&u)8INa75mz} z1}+r#M_{W;C>l|Op2Uy5`KoZ=Ggw}q(herUF@k5pX@XmU=AaDW7@X}Xt=%AyIl!FxE2{o&xJHHX8|f+OK9!EtcD;H7Z6;A9I$ z%Io?;p&V`y3H}PV3a)|s1U~`~2yTSy&e1Q`j{7}p#WOnK2slNsH5*0ZefqW9i{M<5 z;BvTB@O5yV;9KAZ!GDAMqI7<}aEGve2ZuKe1!Nh)XE8Bog|Q!;Cpa7~6dVax3XX%D z1uum|pB-{wB*RI9kB2jcnDsvcMe&frVVngw3(ke(pVJwxfzt&S!bO6whC>SU4rnX9 zN!Z_qgP-^1=lT0TifF%rUi&qiDtHji7d-k8)PUgeaNajjMxSp~oC$}DPQ4s1e^Ngu zJO&r|?3UWGY(mi`ZrB3njnfYbQ?r>$U(q!%3(im1qhujm^rE&O1eXXt3a$}+BHZC+ z{1d=wD0)SLWpG%F3!6H4g(RC{m8zc;{t3qj`wMWg;Md?B!SBF%f){r`H^X87a(Qx7`P~602)-B25&SS*agcidKewnR2s(#eDiS#1O@b%Foq}C( zaI1DW4-OTa04E7P49?%KpA)Wzt6D9cK^cnZwR~>J;SK10*bu$`Q#eoX*KlbAKNh=> zH~ld=?D<}E4gDSPCOG#ko&W7{Xoem&cf;)#H+T<+@eqnG!H>hiZQA|}oFw=qI9>2o z*e&>dxQvfM_&=t*WI0tX?1#fvolqQyqD}B`;SRyShfB-!;_@hLysiV>2uBNk9(In= zYeD$AOl-m)c`p4gPblI@P$qaOTp>6aZp_jzLfxcT*l&mX1>X&azM%tr2u>6H___4| zETMRY1cicMf@=hCg*yem4?DMN2cN>xg1?4S1P{U`f=65DvAzq%c(_;aG}zUy9n66% z9eRgT0A~yP6>z!WQn+65t#G?ws|tnjrgm^Y94ELQ&Kni2y0~YU4!~8yJ}Q@hTlC)n zPlH25uU`hc1?Rzy*+ZLB%h-sb_1`*x=i$23^e}k^?(NX_x8Z)lAHw19X!{p%n&5BY zY{4T|u-p$Z>;JweD&zFxvJ9>mO2Etr*9l$+w+Xi34#Df;$_D)+)O&ERuzv!Fz3U5D zt^Z%4=(>j=V)actDSu>j^C!Um8#qmHCY&$$Y`8#h9vr`qev`>YxLnwuhueH?sk!)Ix=KHU69j(&X9)flE)qQAd>*X??+dpJo&@)L8UF+@6Gcd;b{GpM30?vh z3qBmK7JMAsCiu6ot443Zs^Q@Gb^Z^+@g7$G37`Q*x<}#Vr(w6?7Pv_88*r`QPT2Li zUR+}Gn0Q2|UJS?G8)?Kiyrbw!IA7U4{t4iE6dmFQ8}1t9XX$-6bi;X{a)ak^7~A0V zGh=-mWDLN$AG&hX@c*EGX&SeSugYXfB!oc$E>0RB0(5jDtI~^F)woHRj}1?m9Sq7HwnHH?iPGK z+$-3Ib1&uZ|DpSM+oT(X^J872ZE&jK0XSRmsMTyx1c$<{f~UZ}f}`PxZk_)EIMou0 zL=fw1Ypw$%5T*zTnGXt7eV<0OG$;REY#{!YzV7fO`ag z28aGfJNz#kA=ts*E>*AzS2^?>7Jr*h|Em=Veoun9v-ySbU~iK=2s=fuZ-5H~KMjW* z%+F$v_NE_y0Tb0{dJA?IoZqJd%!PZ;iZ#4Pkg?_h`hO=kcn^nBNP-^0SHsTFwY>~Z z5quk*DYzOg6#O9EvO{mdg4R$2!tS(CGzi5+xI?fD?h-r?Hg3^dup&6*3mxFKaGcFtL(KaB28#9}g~RBC`vw08j@hOi z^uZYq>&4}0Hxr4lp9EJ5J{@ipd=A{{XSM#XL=p0pc5o4#Aoy}PZGV3G+_x6I0M`in zYw)II{d^z2j$tW!{Q|g9@IkOM$oqKjdHw%d6p7!sj0oQ_dL1s^t^;}xE<0Nfn@`{_ z(t8gUBe+-a037;XZ69?Z^MK$`ILpgw{o%!D6h$IIG+cYKeg|U#TrKQZz>R`S;ZDJ~ z!rg+a;NTAZ*Yj^+XTJ*2v;I-97qKDmD9{nm7`Q!D_wqC03}Igm7YJSrR|>uut`>YH z+*PjgYlEAW-MjuejCWB4e~ZF%IE-#MLhv>?Q}6(sD|l1^4;F$$;d;SSU?*S4mq`BV zX*>L4IyrW)e-x1@qQ7%_{ljr^lHjFqw%}yATJZ63zu*iw{Cl0>S#YZ0TsY)d@%;Zd ziV~6F8Ms04OK`j3t?+>0_u=RP?eJ4LUGUd%#fSQ1yodgYiEF^pHyn$i?m_(|Qvt_` zQE(SrA-ERq_{Y$bjIkZg7<3K2xSVA;KfI8TKkLxeNg~GnIkp5RC6z`LuN${s|i{P)}@Yi*Q$6U(9BkbvLT#zon8E}f= z9JomEs!QqrWkOLvf;z!hz#W21;ph?C!L4w*;3_y*@cnRw;Ci@2@KY9wlwh4j)x#zmP8Rk*!kL2IaG~JK z;9|igaKbaL2zXIL{7li1=;;75%<-&d<9A@f(PlFQ$FN2c>pAXk< z)}y8o&hgo)42SU?iYjqKE8HOXEx1o`7aZ)IX?PDlJqJe%?uXL_2VKF`F4zgzdl~-( zFcC$INZ^8d1kZ!x_tg#)-~z#i!4-m2;by_7z)fPy_IEgBKb4>IPXG^~Nb)GWyaCP< zycsSM{32W<_;t8V@OyAxNVFO<{Bsy{u4MJwUl(8zT>BcMhW_VCa0QAwk)RZg5Tn3` zTU&>QjnNIakDWQRWjmmlPBvLPI26ubsYlJRaKSijPltwH zHwiuuu6nEWi*fmM#cP-pa4W;`6K5RXENMTQ1 zPyZ_tic?5XEjSBq5qvJ(FE}4A{zAX()&S>)>j0jHOJ?cskQ{$4O(N{muBHDai(xZ| z1T{y`9QqQ;0=RUh&hQF2^a4GsO5ysc+I}nCD7Xsl5PZM7KSHOkw@^e2#Zz#q;AXgO zf*w{8*D)~(`)t@PI3BJLd@x)kI0bIb*Q3h14Mn|3Pz|>Weh}`zTYoxk5bhE7(WR7V znl90JI6?3yK>wXoBr9b5{>3%&+U5_}V!EBJP0=T}5>9NvlQ1GvR!r~f;Q&rrmDpg&H3*bT7g z^{H@$;8Wm%=lK#zUxt5&Go$$Wp3z9AXH3|u03F_C~{-8g95lh@D*?qpY6)`EhewQ?ZW;J95Gkl|1q2-_)9oj@b_@Z zTua|D^3T+ONU%Q~IwE@L+i^~VV??iB26yp!|2&7cPdoyb340?vAow}B^E17Ln{+cx zYAw+L%tVo1pod8;TsdFc6W}Jnhr(TgkA)K#==3MUX@bv$^93)5t@4AT4D~a3Y6tT; ziV~6F8MsRDOK_9mt#FUv_u-m{^viY!mh+sjPzQ7b93%LIa{6D=i!+Bln_WqQWRc(= zxIl0nTq*boxLR=77ksc zGdLMe5_~3HEO5WSb_rJl5FPvoZu3=fj`DV|{!pyaQ(Kp$iA`i>LfF;T4*D z;FMy1<=bbURKc(1!s9&5>)%JB=)ctatLrL*mGBODr0<3bcmzLe?9bpCxRo!63-Q@M zhr3B1>f_0OVPe9*kB?K}k6@>dSHti5?dtvSx1rdE!e63iRR)yE@1PfMCSpHNy^Y6n z!Nv!5MI*%QN5{xU0)c;G5tc zdi~RV{we|=0uyBW;bi*U^kL^xh8=A5$#74)prf1N)o_I1rEmi=VY;jWUWVSp)Hm=B z&4K!R)CsGUdKW>co8c&UF>Er(fy2qrIItA%Ew}<63J0RvqxQpLB7NtlXi>q*a0M0i z8IP_;umOQ7a48(mk4^+Gk9rL5n>N(t5VaaE6ucg86#P0IeU7!?3Fir}fj6BqRM%f$ zA?iy6&BEY2IBBxY;8%E_;3GN%!J$txu?X%8$4s&5`@y+_W8ktWJpT_|e9jj^B7JOH z;0pMN_}PucaCKaaVzDG*LR9Q(w$Xxf;U(DTs6b3T3|G=6I*fIUZHB$%KhWjx;bl7L z2DyT+Ym|CZ@L6zQ`fQl1&xLaYKLS4r$GG}W#(UWFMXM5O;PHg0e19r(L07S|A4{u=^oW^aCzY7)MS1<6Wj4Pr!`3mrL7gFnMqE)!QFTf#nkw@*gAzI}c`-}Mg)0li)z;*oG zab-cY%61JpPV=a!hi!qm(><#D>S&ebX86^m9+mk*w90YqAG*w=DqfBbe5W)8re=9m z%$8^s#W>auOuZZj-nS0Ecm?x+QoR-ATJo>j#4dph z@3@vPo;-U<-~$O1aPKUSTCl*~ro#{9c~nuk`%Wpmb}>KSa-X|acs%N7AA(FFXnE43 z_Ry!-=sv|@%NqW1uP}A!_z&Ln=?e z{zEul=zX6fhVkFOz1n5v8DRnrhg3HA@r-@2!Bl5 zGozE9<3z;jeQFefveh<&ci|(}Kz#^D{b(JS@jMxhur-_oH=bwpf5Op1e-zHovigVC zGPSqqeIe>`1o`h;2ja@9QJVqt0-RcBGuRI23Vk(PnHHleLIX{l^#VH{p`Qs)y};@Z z!OM(Z-~a!MAf?q7uyh^UZexIc1-v8EW-x5MzEQC)kO+tUV$)Z`)k6O+Jk@7o;F1k= zfvflFAh`-b%k4IU-{5AE!Qb$brWjS=#=!kAQec90pa^dK-8vY(k%>#_N5GBG+4OJ1 zi2*(3TZ4tK)8rz9`{B&Lt^UL}*kTENG(7KDtKS6Y2>qLI@eZp$cQd1IWQt3P`iT_W@uaO3q>Uk~RA{SWZGXRZFW?ZjV!Fj$BnwVEFgbZ4@zJLm$T zKM}5a(q^z0E))7qaMm2FPu)q23H`b7l4AP{hKA3I}BF8Vh!fMO-u;=U2smh z)pvP^aV_+baO-@lFN4ERvR(8dTyoe}a9kDf7bOfPSK+|_@uQQWfw}w(I9cewfx|Ag z8QlCXr&vP208YKx>ce+&J1+D+;F`~E3$5`Xm?sR@!Ao+i!I<6L2MGPyaOxvg{~25& z^!0FkgVoQiCT4{GHaL2pb`l zgL8%bEAVveParqF?cN7x2>Z@8IM8O#`riY=3{gM|oGlXM!DVd;LexC?TI@Tx1w0AQ z752N~Dq;UITp;xS!Hq_**ZuYzv$T=TTr+x4>)QQepov93$)>hyRCt zPuG4Yyg}Ii3a7dD#6KT6M6g5@5d9H58j&Ca&J_h*0@n!rB6zXTFNGf$4!j1}3;S>3 zvVcA1r@&!8>Hw$IbABJqJgYar$Ukvwo&^o*wo{PP&yPLr;2zH1B zEpRLeOaX&GC5lA>=fm~FJ`)~?eJ?jZAG}Q1uZLTOeFZ%A!I3`I#ZB-Hf>M#7%V%`K zsdf}Z!dHqKOn^5C`y1dCVV@7r!9LQ>|7o~V*na?LpDNb>S_BJ4g5z+FNHDUN77zs_ z!^^QZL3lM>FYF(LOND(g{51Ba!rS44K9S%T1eGE|3%rg5CddYVP7@0I^Wl17p9x14 z+bA#8_Co&v{3iKzbz7tY_C<*V4G5x6vrT>g-c5quZi2`!h;m_{3a1GBb2SV7ZE&{G zFN8CMe%%+ue}OP~6@z+F;C`KfNN~cJG^w!f1s}q`r|aN&c&@OY16K9A4o=ut6l) z4yT9&)o`WIx4_v#e-u8G3{P|&h~G=l3j0jBK-kZKFT}o=Ywufvpk5@XfJ;S!t?*0| zm>_I|4+{IpuW(S<4}|Ao-^VQ=9c~r&`Eb3p_o=%P{2vJ--2~-u#A7y!Yjp-Tf!YVJ z6a|ETO%n_IWX;L8$;ZK)us1D~2Pd}KbN*9|AVnlt1@9(-8K>1+-^+dU_&x8wv{S5dU?420U=l@F(WQzn9aH&YJ6+T1))1*!CTwx!%k1i1Q1L02m zV$Cqq1#p3|&xh+>d*YuTkw%ap5|qQsM1oqlRTQufE*1LD`)Tq~w#j?K7m%Np=q=bd zc!RK?4W|U`_4*g0<|DX;1U=jYtKdqJ;5|576!0lrBlO4M0-^8pjZ*iJUuQSJ)8Kkx ze-&Kn*z59f;CciPlE6%j%i)6}!8W*36tEk9LKN@^+$!t`HBg|i9}Yi*z3IYfaKz&T zxlaX}Xd!}Dk>GxKGYL%8z5++-1S(*^U-KEZ$$x@B76tVDmM9nY*E}#%4Tg1)oeDPz{T=XqkJuJ`4h}ohrvDWVS?(L@WT-Rf z*QivqFqjG7`RGVBz%Ae*I7R3`hgajk5Ld5$;O98+q zv~7|n5e#G-t(#c4$ZmMF(06O12BJn|;Y^{w7yeOH=p}d_`V80Mzu`fm%Z46c{jU@m z%sIegH3~2_ejKh7`u*@@qDxNrnfrgCp9a?n2N%NK&$15eg4g4qS^fU_nelh_65AwE zzYxWu$ZMih|nJ1r*q@DjL5q+bR9OAXDQ@jbX3`I(^m6HXr6=CDtVYv$I9JDCx#$9eEn zYrtp!mFdNa|S@FzE)fOA|u_2>P61Xl|O{(uWGFf|1KAn8|?Ec*nuO_x}|m=q;LX2OJeJaAvyjBh*MZ zm<*3bZyYRupTNPMu7l<9Vxez_-xn9%uN4YJq2SF(FfLTuegIh%gXCGH84hIIh1>6Xy zPqYrc25+(li|QLVSLlb+&7DR1i{ZkFK3jt)5F8R7z6+l~jXJpn9)dTBwP9dLh^i3< z%z~Q)zX&fDEmjAIO|tI~MDaX0+$RLH5k$bzZj0=M6X7CHAVwyKhN!JL5aK#CAFdR< zrj+OX@iD5p1NNlNS>;iEIcTg15Aajin@c}Seh>DQAF~gWyNB^zU}PA$*b%`wD%NGb zrbFxb>B|$4=>5U@aI?@)hwIVza`g-0!VsJOepr>*)$f(C5WfGVs{vG($gixD)7+fPb5zY>?`cZI^NT1Vz^WTHQU^WI77?@#H3>S2;8LWcq z(VH4p!x0^={u5X|VfC$WsnB=m$Tw}EH}g!A4?$ulo55Ldn#dp*t`zzk;XL$_ZWEWl z8R0hl8hDw|*TD5c|2ez~y{Vv2bqZ1Wooxo4;W`W=+yau}>{T}Cu7=ms#~ob#18~Gj z`{GgsoOwoUThN}x%O#UZZ`S`@IP1x_yKA3%1i>CMFvDyMd@kJCE#L<@)Fx2fI};;< z$HJRR?Kb^7_ygFq(4%k#_I=#^D&b`Gfi7VE`w79>2uzdoJRw9q51S|-2Y&;b)h`d8 zK?|4~Er;_dAk-~jE1WAT&;-Aa-t>8|F4&XatL^prHx9w=!XOVWBm?8X3V2UqY}-`( zHQb#h9p)C;F@hE#!|pC8!BHp0suEZ)ZVTXLu7yir zy*6kEKZUys{ZY6wkb#r_oNi3Dq6Kb-)8XE3`X}IAp??QXJSCR=eSs$G(mh1YrH{?x zat54^0UkO9EQF&)4PSs;7$tq(0&3yzLVq0IEYeTu!4Fd<*%o;OKAkS?Mfpw*w;;$t zU|Qe@IG+S&bv&sj6A1;FF3N(7&>II=!`W28r2hbZKvd{2I9IgbkY04rsr>%B$zZk? z2nUMcW|84`IE*F?Tpslvynze?7oVDeYeW;bY8Ltqk>n@zN$|l_V|D%Y6{5~U(4DE( z)F2m*IL#JtBb*}iC2*q9uYq%fz6Q<^`p@BcLa%x=lb+_Y1$0JGC=8O}B_f0IaGB80 zhRcQiR=7s!pMtA}z8r2A`p@7dpD@^mAd;XmEfC&^4Z`Wx!Jcrk(2s-Tg?*LaG1+?^{0k{tKlZWeFhNKf^UYK1%C~u`0{m*MD@jM=ciVr>A*TnBX^f54cvOAIodJdDq6WwP*d+L39&>x+`M?pXYWKw4}B_#(Tb-(Pxo?=2LmkH)ncm;1?9Np7(s~atKnRpUP{v z(_#Z(aESg*UhA#K0n$@{1P2ks2#-(UJzsU1&9IL5dZTk=RkoX97vAeF&a@6c2X_x- z=;T)i=ZpLX@ZN9DB{skHyykmwrgl)T|2VK8L2{P$uvaz(U|?!E8BP-!KA`z3o8dNi zGc}HO9c+dZXT_=*mxs;p@YC)#zf0k%=mYovIPd_1WKlp3+T1zyMpyU+3nM4-i^#YFE;Qq88~$PEgqG1zPpKp&$!j2 zs?N21XMTI$c3XS)+}@riFKEw8?{Jvke|MYcqdVIh^ekx4m)_l;S1xSt@Rmiy3=USg z`8{(lFQcc&stT7^+(#Epi4A-*iVFGv&!fU8v;J4Q29MuQ0h41Dr)f@1y!fC;9XX4+ z-)*7Sxew1|VySSa-n13;;lh#5+Mr+6z8}7WVdm`f;rHPsa0l|!`WGJesI7tz`910( z9|Gq_0E6Tbk6I5qcRuj#aE0J4@JiUZ5kddX6CU+8?A(aJ9al1}1n*zRyfHdfvGH*# z6uE&4F>@OGOJQFq37i`ZGAKcC3HuC=0Tp?JG!3A(vx5<8k6JXP%r@ll~`|QkkE1X+s`E~e8>`e>( z1D^#u_kuW_vZ;NH6u!*;pN#6NSK0?vIGrs=!9}lmR5PQ3nb&F3mtLny1xIYAfDEg@ z;Z1@}@CREM)`Cy+RdPln1P^cZsA$25w|P{&;0t!}fd#?kJ3VT&;I8j@RI1<`tN2Wa z;N9;Mw6L?GVHEgw?;@&&;FR6e7oT88c%P{j0}~`S!m9+|`T;v266ClUz7ES8yk66u-}taS zZ~3S_Z~s^_>wncADd1lHllHvl)As!3XYKi$+V=eO=k58gFWPg~mm=nTx{2$A0B+dZ zo@2gl&w2IjdBeW;+`PX%CpWa`1>ahB*8i>FS%L0jPh)#N_lNde^kaMe`lt3BccA?! zI?Rs8TzZo_Xb@YvH6vBLUjOy|eL8|#1m@1?R=82{Q*hWbBh@G!1K7U@r@+R(1#S`c zg9o!kGeL&^x$x!alic*T!pj_c)_n>gWd32GMMHjxbbH`$HPZ7qcs!NFTrzJ zzc&-Ly2WaLVJ5`hM17xw9<|yyi2dbo1o>a!rhgL7K!34w|Bt~T3N)8)qAly0DsPKb z^$48}3JGFvwu{loUzr!?#i|{y{#LjNu5)<@yyKQwwZ~=eZ&YBu&F>0$?yao<#$YXi zlzf{(RCIfXrofwSk9C?*-^=;o!e{L{;7+)qFqSW%!(sGi4hd0LK4;H*uYu>nrpq3J zGoR!AKXdN489@OChQEgwiv(SV5;U-$dUcnb1=k7Ag~Oh=`bXgIuqkj0oG0`@z{{TZ z*#zB(QGhTQ3)hJZu7e}i+6*6sQ(@y!C7dVtC%9B_<`J1doH8eL|3jAhO(MxB^ZW zybUf8d;nf7I5L(K5#jIzI7RRrxDtEQB9Fnoh!?D22ZB~%@C#foxKA8gb-@$i8o_hn zGT5|;AKoDJZ^OlOnX^{Vg}=se|6hT?oMiSLP7uLE+&(@Vj-UoQ6m_591V_VNTz&%1 zfX)4X6+90%r)0mw#jrX1?H|v*BRteie@?uQ`*$Ijhd~rwVjOr9PKO7(33kEr-~^Ws z!DVo~%TXhk3t+u^YKN!5M_}_nV?G>3i#YQH`c*yzQxS}C6I8>?U~^Qud^~q558CDU zX*hhDUB5TN5pW^t^*pf^UIu5ooIZ(hUgmZ&^UN#hY+#sIs$ISB;&YjP*#(<FPQrein|=>`A8fYqJ&)7nFvFPjp9Gg6*dz=};O($8?$Lh@?-BYzJZx!( z%|3r797&B0m%*{3MSg;(!V#`R2_d1X0Pd{s|Fr`*BDl{H1b7qtJ)Gkvc)=4Yf`%`v zW0;!D+0i6$G`r5OhUu^gQrbvOgY%!Whfr6-rO(59{nt~)ECh>%!A!-4W~U?YMSVXztQu03=vKB5W73$B4j3;qI56Wjo23;r3- z6Wjt9J}=Jyk0Dqh48lipY$muTTq5{`3%NOc#!fWX&m?G{wTDhC;S{>W48wXje@$%L zAy$uT*n$-^^KpmdMDZ*HbC<`e26tS4l}AugU>NtyI?CUl%_-L_=w17yn{i-6tlHq- z8I{ASuTel~z<&KQX1dMxKqBc8hTWU?1f@%8DChrru68qAgCL_URvn?qb%FiELRH!$ zu`1rpFsVbR>h5QYx`%Q|Wu{tw z=oHQpoZchUr?Q1$Q;$%U1DmOKU{A&=Y^GX2+_>6KwcUDQFDft%o(G#2cnn?wo0+f< zj$ChJVn8InzZD|{S4C1IM!{UShTGwM(PZhpaR4?m+fq1#0?f^84Sb2B2h%Wx%5Oc1xqS+%-(4avDU8fsCt4dmqa>-;-6uE zP{r!%R%rHGR?l6rYKg1&jVR}6bcbD^JFa5`0jIhKq5VQt>K6Lkjq?8eLsi3eqTbd2 zJRp>Bx3x{WCW;mm{5_n7gMsBXM2#I7s`|d&R-RAYgP;t7>EnrmU_5MgJ^lvHB}3f~ zx(SC24pqzEwK32=x_tq+1hrTxT)n}K30iD7Joi)AA=W?DEs;H4n}Ash&KJB6UI05m zi5o}ZWn@T$K-`9%#HJFxQvoDP;HX;r)aysMo(ecYiG7cgnQ38XSnBit6aBgUKm#yP{VY0VtR!xs1bdh zGz5F{)9JPS6+?-Mh4!Sh6y6-DU|{{9I4o4nA_E<@x{vRHAH~27t15UU?CkT=Z>2@d zrAI{*yl10r!Ct3?sGJvV7wt*qa1%Cb!Lqa2@;U6T|2@*!G6{pn;U$7Uox%>N*$%4? zY@;&{*yjbmozEkfLxD#sy2e8?_#%^EtiJOFJaYNn?wV8J1v-Dd{^}YpM9}!7UCpvD zX45DVJObwlhdzP(Hd*_Nr;%Pbuoyma&^qws<(!;Sfh@|?4t@l0`azukhhD)G3oYG?q>*`-)`D{fW?MD4U_W6A&&>SY8d>VS^-7#AH zXbH>li`@U4)9(pSaHAj+EP^i-3C>-~zMUX+#yuGQ0 zuvyOEg7e`_ciuR18tZ>6EnvpwnA1a51moD5Drw>ZI0iQB_cnN{8RzI#G7bx#1UHeN znKu^0hXn6}bFkMH(4#JV6zjjN!3k%y=ZG`gbC1#O`NXr@^Pn;9Ieu(=K0T#9kM}WC znM==Pv*Bl6vTv`gfJQnsZ6aC-$9IWqd$|1aR8~Kmfog$sh5c|nbB0^{*vr_a zN7($b;Fiut&-#Dq)ohVO1`oi?IvE3A8qQ&hB{E2XvpQP+)@!&gIL0>IU2Z4M@u=ul zc2F*NWqD5dn*$A()8>+Y3r|!u>+}EpKJIS+iB(i2u)K2OQQbYR?ZIRY-w9O^N)r+& zdhUMvDO#*+oXU4+!Z)5~@jj7{nvv5J>t9DN9z)Ox;{LfA|^r%YzUA=nR>2<|wA zJ0X$&Ryf^>Id}bk9YGcXGx7Wb&l5qJ!d9n2@J@IMQ9asi^0DWJswgTj$F1?*a5DC0 zBH96u6C8S8s49eW%=$kWfvnL5=eOs~jQ0F`5XWB7UjH~OTkJT))?9j?NjQyz$`j-4 z{r~9*@)_5Gi-?8y^oeshM4ba?lOS;Mqm*!=;LG4L!8z~|!L#A$SM5n@F-B0+HTkX z$6GKBL{-lDk{ju-hq2bcI#?L=~fEmo1pU?eZ4=mbC z+;P1xm+81~oZ9RT(>u5?P-oa--2Fx-n*MRBn7Le6Ao?bcijJp6TwYhm^Z&V{;{rb% zjzQ@I9+gUsE8QAwe2g6tO=d>L?{Ed|oMzKvNo>LPh$j7j9npf`aVpzg-=DsaiH0sS z6IZvX+|CPLd@<|)VgzO!ubjrP68s08P79cEf7NtmGSP&q;cVDA_#K=NoBcveCOaZw ze;wSN7%^R3p2_;(ENXZFgV7`~<96gFp=zSw8{tiG4lSf-wwGX8f%h+M&m%8uU!mOu zsk!tp{KJP}2SJjn`;fRji}!Ih<6*2W0Lis*RE1k3_+dC5HlyZExK3~*ypQx|6m=a% zez~j-G_lTq1>Az(Ecd>x2>wH0-cJ7sj(W`&(DMwwo`nLO79opq@L{-%>tG(Ng#8M* zJ8bN?!A;l`nofldz!BDApNc$_XT3OJYBV0szBaDy70f5$C4&EjD_|#P$a2(ZYAAR< zTq*c%IEw-cT?cMvwG6+;#1!j))oOgZf&$&B9l{aG1`LWwpoh(coQRaqj0-&Zguh^) zpF#oAu0H8Mc0kyhBbA0OY+BEO=>wg;DZ|+)ketr!wgS zonY~dP?b0%F7RXX@a(II+N-C=uyQC1MB7-yFTG+WYLq8L)68dFuh2S^fGQr=$#e%)#c(QtToJ!SQ zMv0fei?svJ`j4nk3q*qTaK7L#;3SwBbsP>EPm2kCB3!%Bj+zHx<+G!t3Jwz-IzfN< zjP>6PqiF~tgu%0LcfmbVsqrEMI$lN#VhC84)UHAtaA?ycEB<9{= z{Wk{b2;%Q?mrKRw08SPOK7)(UXS)uZK8ZUYp}z_~h(6WTZ-+C513$xw_gejhXLAnt z2J63x(mN33iww))M1suBWFNt!U}v$R%Z|Wha2^Hf7^DBQrlv zmAQPzvusH6*)y^n>S4SSp6k0QPEFNwGlIR(GqKQzCAtQ1H4{-dLDS^&<4i=&u-WHV zGqFhhUe?|CIdObqE|C7SYuN=C*mbJKrS~bMb<&z^jSRfd4|=>HF)^CP*wG;%^)(59S;tsx4AHg0#yc2yziP=l5g~K9AGvC+zzF6&ywj zjdojL`YoaA2sJYIdc|-v4w`2|N2d7yJrps>*EyXgaW6f(M#2ZnZ1m58o8dB@FEhwC zIAe<)EeGIu*vvn@&SgRr`tfiY%;QOC{+SIIz)UZieX1D2YLQ?&ysVtq(c>SJLFcjP z(UO6Sn-h35`oKl(!J9~LMo+fZi~R0~4+{GtxEej#lRG<$w-D5b1V6&jFW3TphwIUs z;oJXw9&`x(F!&er>=T?CUI=Fi{blfRp}z;tH+sFZco0Fax9o6!9WF8k=(ocg1Xshc z*qe>dVYpi8Tj3=1X1W-j!QNHqPld<3dS({RjS#4Hw#L`N85lSR9q1p0qlErRI19a* zpmxEdg?Yo{dgmXO)Cto-h~#-;aT5@>%dQp}!e^9KG52tc0^^ z;(=}#ybCXeO$#)`%VE=E11>Z{&&r~seq5U%z(eOVyeTl64D|#z2d;*bTz&;U0-G7~ zUpQ>NwNJa1`2?^Gcf_1J2%R`F6Mj{UzAzn0W?P=r4Eq zvD=u^DbUQQb#S!Fj|p?Y|G38#d=1w`}J z#D(qHcj)-D?F5I8?+W4rLEJH`eSyP*I5mi81o54ceFU9f3gC(${v?Qh3*s)9w|6Kp zh|_~OS1@mC>s&y{25?vb(!hx5HW6-Ma)VcEUSs2I?T(gg%G#x_~pT zVkh@bTLEe&oW6q_H&?$Nu6x@oF>Ic{K+uFiiE9vjH3g7?GvAQq`EcP*o55pnOj`yX zwF8cR+d6PU4ktuZ$W$O1E=0fC&3_>rvvZ`1hFLs#@{3^fJGOwsa6Sgcfk89zSm^WM z?!v(p@PaCveji*b(uZHehx^~PEjSG>c3aS=oBVDB6&S2`J=_gviyHm`XYPs%e8N+4 z>u@a@l0jcx1JYj)hwrxOUxxFAgY|H^(8uLcp=xIrpzBZbAXqF4To0#XP~X;U*xvyU+sWn`GbceAf;0?(M*;VZR0TH6ciH6L{t_uJ>9#4^9`n94>*K%`X}3 zflCDszLDDp!MDL>unt1);C}cZ6*LoD_)W}z^S-i2&3QNJnamojfb#@zgEL{%rw8CP zp^vQF~PJzFN zO$%KCx4=4bbbdE2X7fy!==}Bli?7#x?7k5!aRu|?8oH#(<+1m3Y#SsX``+I4J^>fO3y3o9;pB%nd~f31 z!9CeM4A=a^a!Wp1pY$*f@qV>$50tkr;P?k{%I|h+u7wk6(ZI#}zaK%gF!-Ge8-BCL zl0OAy_!#=8L-t^#sEDVAa2+{nhc+(fVD}Hpr#!|jCiz#n`n%xdW;eZlELn{}W_ZG_ z?V9NLNkKd{h;M~AMGX&hA-((#95zr-OZwtV+TfbD8uR=FZo*z)tUpW&2k}5b2dviGU8$1ox?WXhV`#%a0tX6W6LXFMA%Gu}x7xmXu>2(MS zNnkwudoH@Mhi&oAl3sv=_hqrwrmjVM9&sN}r*at3VL0DhT{zJFG1O%H&V48FeybCsq)6mCxJdrb8Ww^tz4=qxE z)$qX24HLvuY2vx)qsdf{g2!or64)$WOJ3w4MR3$cS~zF8ug%~w*CXwfc4%`De+|dK z=bmlR#~l_>BOEmQfm7hJn})0IR7}Ur9dHAB)1}YC6*mtL95bMAhHG#3S;5(N&}8r1 z#o{KonFMSLoD4sLvu>frx`t$sc&Fau*->yAoQH#E{l5n;gtt{#o!M_!q(J;TQ@q=|6|7Ve@eY{jh8x<>@Zb`HzHsBM_Jb zvBgY8)Ud>zdiT=jh5w@k+&;gAK9?U?`0pv~?-;IHS#5Nm4_r;3&LPO$^nWo*8XvTy z=pIJN;)jQ;G&jFNn|Lj04^51{lR?oYre12KFFgt_#Y1!Hm?*`eR{wCm3pHSWN3b4F zp+cq$cEOQP*e>pMH|quLlt;Dm?q>Z@Mqv858iUf6wvXc$GIN!>QB8tEcrmPlPRBrl z*4NkqFCxDJ!EeLmIFy9FZt`E@+z)I}_VpDqRbrqoZE!Z6j)4i1o8ZkN!4vRYSf|kT zRd9*0{~azD+A|Z{RmET4W5L%lR!@ux`17I0RoS zIO-mLRRZqh+E0P+fX%jjKKy^MnO9c9#jv}9@u_MAV{pJEI1EpLO;8THmthB+cVez4 z1`?m73oy_@*Rq!97$t5W!`Cyh9E8op^9eCk{`By+k2kcw%u72saE*4D*Mii!6kskL zWOL!@SM1bU3FpIsD@45u7t=z4i%_ zR;kkxW-=T|rH!?Nr@_l8&;;QO_({P_;B~MG!dKy!VG~pP;cc)9!p;w{zkquN_CLIa z#>|&)`iP0AwS-;lyR7$akmWP8ZJ>{*b_oRCW@fUam+eHfh#=gs)14;>!aoSYWb)IO zp2#jI=o(%ky_?^JS9tvqecQ*9I={;DiNNVI5}XH@XahHc2jNK5CFpD5avU-<=a>q1 z#W>(hOgQi=9J9!#uX~+cHHYfjUOUwP4f3N4e9lyfARB@9*zD6+!R4@d_`V&J_B0;R>Pe_7J1&3!8o{ob3D5W^f;Z)pge3 zWw=7<|ARM(42C~U2A|pVx4^BR+4QAwh0y;97l{0OKEnE+Tx&DPMzC7c;C{G5=s$r= zL;M3>BmE6|%3t%Mhg{C_Iq{y*&to587%vZoUU*>DwllfmFrErVr zf@-)4eU94#Jxe(3w!_k=#v@4IZ~J%&d{A`3t8ksrABB&I78>yc4t!$^xD^in%GU5{ zxLW8Bz=>^o*8kosxv^-lHMknyBwFA>xLoKzhtot2L!Ko4x7LC4;d)y`zHyw14ZVqh zop7b8fL{N9MG*d-H8``B_1PGpzZPC1^e@7rMHke;;osZzLsxMKB`RAiU9L;C+gy76pukmk9km@M_`UMmYQj+l5Eq2oZ$Co@UshH!W}@To_0nSpT0u z(Dz5%gx|w+MH6;g&AA|YGY?!2SBe-}42S<@3-}057o+4~cnNwFglTIS#!d`4=O1jr z5HyJlw!rD4hCjmjO}2ofXP75M3}nMCLjOFxS+u|>aQ*?Ce!#QDke*5P{kPuXOh(Wm z42s}r(E^ol;mte1V^CvnVBx?IreTjSDSt}yyp|K{{MlXSs0|Og+&lv56}C} z*6?L`N!vK)=ZE1v=#2xz%W+sZFkSQS)`3;9+AG%o_YgD)gI+HXWTJ-S;RWn)0vBKA z1aD@45V%6r#c-|QE8u3q*TNBpto>X#-X{dNAxIOv5Y7>NKU^TV2rd!)1Y9BbS$L1& z7vY0~-++DLe^`%pB8Uo~bQ zY#kZ^M+=UHQv{y^X9+$F&KG<(TqO7cc!S`}*7;Z*gkUBHje>80Rf~1#HaJSK4<0S} z0XS3e3V5F2Rq!&wYjp7kG!@-f+F(!SE5mBjCuttV5^6NrK108J2x&3W7WnN?~*NngUnB=G^XjxDGaN>n?{|U~}rV6^>%@G0%XS z;L)&o^4aS}hB2(~rm4S2jYp903N+7#m%*lhVz^xBx5GPNb36SrTnC$nQoT3g5NsSu zg(I0sPoY4a{|#^kOdAB&|Hly&ATW@!XN0)k}-%rCio4p+eDd49;Nv;b_H{3N&)Ht8>iquG!c{e5s6 zZ1Q^<&V^0P?1KxwWc@ca>|DWWhJk6aQSfHi)Lww}x-RQ{hCHe}EUm zCWd;vMvKCx%f`Xm>sbGd!E6KvF))4f7#z+P%+z2f91oi&{uNGzog*8fy5H-JBKUOI zfpg$ZaDvOXz>V+_msi2vee7UN6TgQb8J^}E{0SGq6I{NAL#jMBndW5kQy!`0vnMn> zif#4(X zk*@LTAb#jGo|87SJPZA0aGu~rn_2%`@W?rfCCPdW%%vTQ-@&O>uXvTbJ#g%{J4pY1 z5O;l(Af=epnsf_C;=Q207H|(;kz6{2h+N%g88sRmq`wwUMsF(c5ZwKY5pD03d=94xz1qz)piv{tqgcL{jsnt1 zkc@}gfzRLtaF{+mhtGPSCf4lgKZP^NFjdzGhkAX$S5m;MT|OS{rh<68Za}f92*1o_=L3{%| zg#yh?`#5|htfyjU{ojdTHUhJJ9)$lV_{8lY>R#9^9+O~m>7cwJh>L?bvW70Zb41(M z9n6Hg-!(#iw1oQ8#~TqG3auPp z&2ew@c}et!r@~igHtYYL2(A)Dnq7U(y?cNcA+i7?z1(-`aa7Pe714rS2 z-q-3H*97VR4C11eP<3_#>%V?8M~~xA5Y&)?)5LK3pP_0toa5?yR<(EF6gc(15zhLr z`+NnQC-`r;h4j%nJq`_hm&Y=&&P8(ue7M191^+{!6X;7DT>2MpIKbwKh9CY;a2=eo z&^}V>_ct>sdgnnU6<9-l=F%;;4UYWQuK!K&Y99guQPsiyV14NdcKVmEC2L$ULe-Lw?(-iJ6p9)R z|BuCj43l&MYLo}R2{SW09No$%Gsw_sQuLv_+dC8ump(m0#pwL8nh8IFy&0Cvb`$@L z5Oi@pdL4tO;7%@o3onDs#MGsl8;{i^0*}$ia3Y+HK5+5W3~oXnxOgWBZWVk59I?jg zuc`JC=|V6^XDE0+oG$oII9u>N@I1jw;l+Yiz$Jo9;SGYH^C8$F1RLR8YGj(I4xSA= zO->_v-s8prc7hU4gy##s6kY(E7%GI#rDNn8x@_utvHq_LGT4v7b7bH+K%Wji8miX8 zPM5$r@XLa?1f~BHu0(HwI^=z}@vy#h(2aE2i5dOj*-H?ZOMAG60%}N*p%YNx{2=`! zaLX$rR62ScR3F1(jrP3%d(u~+kJfsEdde{#Y<_QN!Uy0Cc&L*<=l>rdC>9A$IZg%` zn2BgU+!xlDcIYqoCU}U;quH8N!RBMhcfs1;xmUz~D||9+M$K{f5!h*A{k7y1L&8)s zg28Tv{|43g#1GoHP;wAo9K<)lqeY99z-6%MlDFXqSl^fs|9tKpK`Mf4wF7VkHPi{>%VJ6x<~AS&F4zE`y1K;T|QYpgFyXY@9jQ>V;qBk z{&Tn+db0ykAEAfM>G?>w7&c9ODO@Ia5nLg716-xqtp8sk&@B)sj=27qQz{H*Iqose zVRPwGG99k}(H6K6J}CGFxK(g19PyL2KMrT0_Zg2z>|tgT38uqy1>X&)2wn>(SB+4c z^_>tc_#<2+^gTY|{$B7{c!S{U;L0Ca|BVBWB3LF2-hxX7{{Yw0B4#!0_G$YTNetq1 zgZR22zSm)={{t@^t`0KT8pL10<<)kR+2u2)YMQj|zyhv9@7$=+BJaUb=mQsfM7RZg z;NrDyc!^K+Nf_&J)O*$-0!|ei36}}`@$fvMpA1(B{XES=zX0AN^v}Y+?(f?IHy~)j zz(nPTQlLDZKtF>Hcr3fzqZj525Dn-5>Z%*%ScZ2kXJ54NBn>q2C2p!ChQ^ zGu!~1E!%*-d~pH}<+%FEa1(4cEVsbsVj}Y$e;7gC$L{?@DcQdj-LKMilAH=#MiT95j-8P zhD{4Cgb%`|i(Y`kezrka3+n>)rCabAoCcfKb;Q09^$F~BslNZuMDQ5`bCi0KCrss= z8nA=$!^MKXg)0P)3}wS1*hhZma&}a3szdzwj?;y|5`~Byg={-5*O#dBcdQb7J|Hi*gV;BEkFl4sB^Jt_E4gN8s zkKGM!^GqmB49{*!Jf zdscigTmzdfD}cX(%{;Ldu7?9PX7Pa)K3(Y6@+iCsKGo&;CKf07G?%BtN%(P6fPHEq zf;L-{WomFQSVB6JMC>;6H1ecS79xKeNvv ziJ5->2PeX&eb>M#zxtmV=S}d{@P8yav&s7#9uAu}9r_D*l(1PG9_k#XcABX2bWq>H zdw#cPEX|Q&YQcqxfzxPDM>VQX6QLgxX52f+pYbH{r>K4&)N?D)+N zgkm@nHa>5MGhj2v{|sjeeeZ*8M*TA;c+dBx@^4e~Naw4Mba1}|FFR!U++Udtamh?Q z`EU$bnNysn;au1a1NA;!2J2HJo!_6Z`rU5aqkrRDPhhu+eCm7z(N>`T2cH6)bE`G* zM3F%aJPkIJz~Asyu$csg{>~%;o8{*Mcs^{lBn#jIIIuu-clRuU2ZX^#@QOAAkNO8* z4VwaEn%Sqq=2qk)cq?oiz7zf!HUsZDcpq$@4DNvs!%lvBcK;8-aRkQWxI-c81iHl3 z=wi4RZ1e^2Ai-^gi3q*n!;Ki^B z>sojPY=*&c_<7hkm~fbvs|8;ISHfmbR0zKp&eva#|20B2Py@{mGEQm;I&+qJTK_P0ka3pi>es@3o9z>V83V#p6da}R?sNuk zBN#0VMn*9g!6j}6+u&L_+U1i6hN&ft3VrGO-(OsICIWcmpfHso&dF|omx+PB9?sHw z=kAUK2N9GCgOdh_sSU6>RJjSR5c-$kD%c#tG{ZGQe`<7?$`lUFhns}{Rk$AZnX}6l z1mB4atA>QB7Mj!vA{^{6G)#s6J)-UP@o$HPsYdipOrRec)4qvs3*wNL_OrKcxzxW$ z_y?zX`*j?MGW8Gt_%v_-kaYj$Y2FDvA48P%hnUh@{Oi)#9t`&HP4k}O8^yQiZW8YN z+KU|#Y!0gjF|(3=+cTpY+$n<1GooQ}?fHQq{ws*@{`!gBQbQ>OBTm!Di|m z@i*H{iZ)a49i0f$V|J7bXVj#lH=|@KZMNgT5rOX!Wf0s4C%3ZT(lrbUeh*SNDuPIN z*d6FY6#qLyWd;n?PGX|rAM`HYFr1iy&8P{BM~{7jtG@!)71Ea;HKlNhX)E{}I1vuS zR4@y*HowDLaD&98T4{`3|O{nIV=(5xW(~N2n@SKhOU{x_5AgWwg&~ z|A*<`vA)m3!&Hgc3$R&E=t9jX+36KLxe?BR^`$+134RdPL7@2$xCV9>T=-gACcI^& zigWeP!&70SzxBj0mE=iK5oF*r?TUmz0lEmC;hiIKfCR>Yt#FNCl^CXuhyu@sQ$iC| zVjx3xJKX)=kt*8FZwp+E{TVJFh3jD_Hauw_m3k6qjubH1HMkeff%TD}c4!w|43BoX zfyOhJ-hH+H?LY54@1T&e{@LewZ|<}H2zRB%U)HoQ;HiK5e>=~c&?Dp@?zcK7wEZ6K z75)+Ddk1&?8gbU2{tM6d_V3;CU-piF+FQ0$;R65N=X(eEviY~3oXv83KYRqv(vDHm z!(Hjhu!Ocxd++NOrZ!WW3CdVn@@=|0Fg15j&z{UwPI`Umiq1GCz^3J2A%AmGQU8e< z-bEcgLRju!mEj%G;Ryfk@Nebc9z*|QM~T73B^QKAZXN0)@Qxoi>PTxS}G^qrY{H%BD2J$SntE)GvH zpLd(CHX*1N8N|efskvQg5;s_eGOUWoARdSG>i0NYfx`_hzXz9z^t=D_-+7^TP@nIq zZ@<6nZ^U+OWo!JGf8&MT{vFQZ|8oC_7kbA|dWe4y;;)&PMlsm>_O$hRj2@~IyW%Yj zj>2yE?@lwDTm9!<)q9@r2mY@>XI|FnevC~BY&Jb(;U?H@Qm%u;kJ!#V#CMAxjI_P_`Uz|q zsFj&yZiom|+i9H1+C_S4BOGpg(ci9m2*GG8P|4mfl}!Q@c>jYlV14NfHp6AGnL`>0 z)Vj7gtAjctiRrpmLf|n6y}0327>CRf=R1up1?2_u&-JLc5tIoBI-DLT&}jh*oC4=k z-~`u!2jITgn<=6OPKTW@pv1mga+sP0pXu5^dd$D&V(<74FVb=i{-YOrNBVx(jVk)> zUtP!E3C=X7BkvAYkZ8eQ6RD}N-gRjGU89&c=>+5AR=CmR#|_m9XN0No=yfFPHp_qu zVYkhCsv`)lGrfqx$^JK|c`ph%&)<2v_mtjc$LZr%d$ZGrLA=3#!F2C{J`eJ5@_)Ab zU)SUNKmWq%-u@lG<^P`l`JbBZeZNCQ2v0-&H)eY8@}0@QMU^4S7Eb_{s!J9^qujy4mJ^)4F3R|h`ky<47(BSQ%ezq|6}(aufdUU7uTT%cra{+ zK$lSJDEJKcT-faMXTn*qDR3El9c&za1HJ=xRz3YKv)>_j8iBKD&;s5tkNOfeJDAaM zGi>fuu7x}OYaMn0`f&e@D>szTY2rflnJe~#T!lns} z;9FpGH24;LA8g+6`w?C(()Z}dK!(k|TMAqSn-;tt-V5s%c5bDXBWM%}w!;6y#(^fd z6Jce#q*o^n*94D;lVH6D=@^;~7s98zJgzfavO%nN?p&G1>etxE88CqtWp*J@gtVDe z!kKKFF(@GeJ)+jJIBkNHUGB$DrJ`R#+n#PLw^Fsywtyd4jFN{XwEgtT=WJZU`?K+I z9q7z*S{kGE+{)+zE=90GB&gKWR8&ISZ!kqLO~p6~0`^ax8K&k@Lo>}az_Ng((QNL} z2X-zz?S(7hvvrFQ(8aWnbNOdxd8eEGk>ULL76<4K3Vz4o-xPyC1{dVKd*&Jd5??RJ$$T2&W`j4yV`_^pzB=Bj;Vs z!i|n&1MK#EPxVibUw!=lWP1mP+~n^!gZ<9^KY-p`x~%8B`?p->9dzQ?$oq17;nbWmI`m+oR*C-K zuk!W_ImO@kYVU+jGmxbryXb1~-bo9{cwXg zP}n_KRQLDr&&eTb%X;{i^4E7Hkh$v{4^?{dr9kQW-audc5F4CyuH~L^i_rInmCz4` zBLpYFk%CWy<1PD#&*Y1U$NKM>>Aku4J?O$OW5yy&{dlJeZuK9X=^feUH~u{_BvGY0 zPSIxEGiHUnG5#9wc_Fftz7dyOE&QvUGyPi%pNgs3A?=1Iz@~NofFFd-24&y?k9r&q z?D2>*xDqCO99M3I55i`L^b{P0YwpnMuiisoF5Ox`!b?uTcmK9B`$GG{Q1J_!8 zA2km_0fHf}!IN;K|AHHMg1U=;=Zd@!!5M<1hVYdkUjI`!coRBI;r~Mahc|c!%$(1^ z)tH&lxC+jq`A>FB*bNt;Z;MBG32b)U1BZIlD%gbj;VEH`J;|NHn(jY$E_ZgbFl)ff zIlfjjD16ZW&|L3;o}<#kRO@4Q2mIDh|CYJlji+74B;B_pq3x3xr!q%JtmKqLH!gGZ zU8HL!OH)$aQ2)vsy@M|KldQGebW-v#k4o)or?%VSbl3#U7B~ww5qlKQhezug;OeCR zC+$q&Ym>>0N>EO zf5zBPcyL!wg>Cj{HTYnuR-~^71K-utfm4Ck0PD^0Cg6*Ee%}DRk@oav_z5tSVBvWf zSGQTh0nR+=c{~!>9B(>*0q|H4d@bey|7r1MsFEcmWG}de8eu1E18uOU7Q! zgGJ4QvFm`>^uXT$Hpayh=e1UJpQb#QfgG$BZSq)*)w=Fh$oat6^uYfGd^_;J$ol;L z!so*a&pvSMM~q3rw*#Ng@8#fu7aqV5>W`$FEBoQCo_ndd>3jr&i^Pxl-|n0EdDq<( zZn7?WE|aiWctLB~?rSN#{I-MqG{2n-ylOXb+68DbuA%(W-NYMY`74yq+)Z3ZdEFC~ zU(Y+T6Y`xsmdooT8+a}74ZwOAp9g#iaA~fh{(FJ%x$W;4w3g4>?rW6Cb{7+`<{O(R zAGfXPc^>o*tI-Z&jWpo-3|QDz*=s<`H*eKF1>SEIf;@O90f=C zCq7V45bJdX@YBF0*#iC+@H0Jd3l8zw9{5Dyzt?bgt1)o|EaJV5Om^duX#4I$DM}CJ z2cH2!{-=I{6+8~(4js}g>Q%sx@w@KO_kf=SF8Me*wA=C9jQzgn_m=?wLBs2)@E#sK z((}Skf&Zc_@cV)jwi){~upZ$xz<=w3|8S5v_M+Aa-N)dapT4vaJq}{#%sEX*&I4Wq zT+$@jG03jl0~ZYZX=Yyk{tMt6fVI|f5d{C?p5LE?EZ^{*W!jCTJ2rU?YRsMne+qmd zaLF&qfv^=n4yWO1M3gWKM|)5K2V-{)ISY)o1XWt2VM(YCdlLW&V-!v>d!V~ zbDnzcKpxyf1-;>347^eN$7@>8-{(?_U+1TCmH2n@I?Oir(|I1qRsPt7*z>i>Uw2dQ z^100^_!RIJ!1}#;2c!C>wUo&4c~a2VM&N1zMZE5Huo)?;xO!3EiHjK*6zz5E2di*osRr5sq^_(W#d+_`GrboAsdkD9A z2&EOxO0+l!c-g`O$4-)?0p&ITzaDrm`B~sU0>5W3P9p{TC!=Pky_c%`uLHgT_^S&3 z0`Qsh4;=f?s(yFOrUUwqJZ@e&1-^U={Fy26FQ&jd`u**>Q{c%ySRDC}t=Y35xs(ie z|J6{uxA@}he}tf{e*t{i!^>b)tI7Bh@I9NBaf^5b-`dyKQ_np(1>Py>?~6YLj;FwH z>xXxF?za91&;2S8$6nH!7(bP8uI%Y$bzg4XuUNy^kSuJkuQ6cTTDI=oEN2 zaZIL zd-sb7b*E!;6U$}!%4)IVQqGD)**B*=+w7Yscz^95_A8H{*-)iF0^iORUAOa|gr5bz zkUPZW@g(7$4uSRQfp-U911zbz{CyGdB|X0{lkg|^FG(-IcgG?gyp0D^pph?}2)vjV zByE=P>A)^9`?rMu0r*DhUjm}Y-!BDzUd}RNzHR|_M zfseaySsCX+eoo?YdGIj2)0wKm(luxddEqVvuQ-~+0AA^61^>@K^ZQ4+)mg#kzHzIu zMHeqCBUR)F4|)@)5fb8h_4_SXp;0})I=#kG@-2EN17rY_yv~*$Y*+GNE_&TX>VOs6fUh}d+1Mvk z{g1v6_M4!AxxiidLU1iKhY?+`DlC6Lhs(<<1*H7_M&PebvKLf?PXK@7R6eL+?>gi- z>OZdDzXbTqxKdQh_wT-e8GiXP^r_X7y!gXtmEKc2S#--a`aBQ*whp4K8d&fVdVFL9 zcYz=HH_|Ap-!Hh42HwAneXP2^+Ve`5-`C)$au z$qM)0!4&pXIPmkjLiPLGzrdRIH2CBf`+q;>PLQnU_fOu%4E4Y}{%3#v^S+{BzF&6W z+h1j0_jKULcjMsn>FREA*}(^aHyzp_>DTXJiJrd<;LW>a3B{| zhARng;8?kl-!D|(d-@4x1e_`3vt@--pM=49KKa+x8eOspaCOO})Qj7|AOgwQT>NfLDE{iUpSNPl2!b>;c^}*S37H`Wff| zSgITN4)9%198l(4m%l#?ybTvUX+m`Iv&_&R_aEDY)Fyww75EGMUUwMyz50u zM<6Ky;isquGvI6P-M{pMkssU$94=T=-gF`1+1qn4ey`bOPXS-p{VGZRRRizbfg>FF z6$;)2y!89~kKL=_tDZ;5{IV)3ux#+6od_iT?*3)wX$kMMGhvnYH}KnlpYD18oE9un z&+jj66Q6z851J3`-QgyQ@8UzRKDfQX*#NAk^u9UFz}3w*`^P0er9H&aW61}fna7l#4pyrM4xCTg<8Ll2 zZ*7*p7r-W@+El;axq!t5DQ{HpWs5lEq65Z0acH$CQ`-;(uvIynZP$_&vXW>j1cqUo}X!&+`8F-^`bcp7$R+XzQ_;_Pl@8 z!7})`dH=0llPO{wX{^6`)z)LTf8~I&OVo&FuO=q{F5;=x2!06s$mb3iI~`+@9Kq>_ z^1%-sFt$eRg8kMIef$- zz#G_AixfQha`>>(fXebKm~; z@%tF?(cf<1S5ESNb-I;HbSLl^)}k3!16p`GH+^&1m9RYjTQPZ;z{*9c!ui1NQHU%G z-U$3~4}5Xb|N8^Ly}yU))?=ri%<-*e=nUY;zYeKZGmvM@&`Y>B0exF}{@=@~ zM7_{HgDHCDva!FY7hVLs;pPKsj%S;*fFA^l^;rOX`)#;OtNKe{1(t`Ei=v#dYu3|n z&oe0vW|_2{d? zdKeHrgL_>_2j`&PQXPC9@FhJg-j{%H>7z9`uu+b4|+MEUjX-VK$ra!`PN~n3_2h?{4xmF^{AQHwRlXRJ^^0O4Cuq?tH9TO ztujBz`m-*DRNsx^R=s}=@B^>s{NGhQxP%8TT&q5OJ_UUB@sL`D6Mq1{;p}B)q>pUy z<(HA@;S8*#YQ}B=zGo351eP6o8n~B-Jo%rY1280ytM9!Pm?i7hYi7TZDdA2&xb1R; zcK|Pf!_kM&?0?|{?`&}7cHqbNUNW{uHTb z8T|d#bfEh;_Mw`>hXiZ<*9P9_8rJNY22Ox~#)$O34&MVUKV!+*C2EP@`(AFk`cHO^ zn!$zdqr)7(Qk5V-`0v2m{Lhm5wEPWl_nxbk)N8o@T1e?E?q@;SDPK7B{jA}M{H}UD z`#O-0^B;m({(j5{*vFi9e^FEZE#UM2gTqFhB{yEr@y!SI03QLq9a6qCgh#gjr4Mrc z_ddA#L;V$If4HA6-1HGh?{RQUYJ_Lr*bg6bQ$M`-$NJ%|KHd-iu=9D4&{#Tly6RB(d>&lbT3WMM9|m4KP7l=-&;J64$wb2wz8(0h-(6ad z@L}LrARFpkH2;fmJohXEkE##86!_t9EUS6KcLATW{D4w9$&7W!9_7K<_mBD`+o<1+96StYH+tZVOaQGDvIQkp9OsHfd`CTt>A}%uSM{VTS|6{<9|9vSjC&2Rjx4!``HW{&6qf@@s ze-_*V+xZ}dem}hZ5BlMq ze%KGUe$)@QALxf$Kd#~G{NM8@^@DPXmjARLKKN(-@PR+?huvTF!-xN}A3o|qkg$gh zKjI+`tMmV;U+D+c8Xf&#{qWj{`{5&h-47r2n|}Dn-}b}DJ<<=q>~{**=l|J{_E$Lf zv3~efkN3l`{(V1u*%STno1f&ggI{pfJ{M2*3nu^ihYGIc|2O}!zryT4aS!9CtC&TJ z6NdnYzi5<9zXM+M<|?RC{+|9BEGH#Ss6O~8uyHGtPwkSI{soTd@+v-C*8dOSlirH_ z|A5+N&+_0AQ6+ql6;}V1!{)u@VNwm83w-;#Xi(L^>KO>p`wuANUS$27p5^`bp`cLp zKlHb)$L{(#l8%DkIE$#x9xnJv;Gf;sWrV82XdQ zz`=|NP3YyS!MB*q$ZKG$)dyc@F(PINeuNp?W^94Yk`c6`k?sY=l=L3Qw*mKZ)q4;C z(o0F-?sutxw7OA!a0Tw;OW|_$jNF2|`1xSHUejebAz$)6_;xkIXYiEmmF?b(D`+j- zG2*Y`1$5zmG9Xp|Anf#i`)VT#-qYp5?M$IQ?VeZ*mco~xsgUf7bwtfbUp)j3d3t>Z z_>?y=rMMQzDV>jf`>Su|c-^jolcTWJUC;5Wn9@%Gn;QtuQuV)pz58-xP3c1{-{0qh z*tc&%9j=elN$lCZDwkiKD2~0R_0L9RTDcu$nQ!H(8K;@}*)^@hJ6RCtsT*fj#*dLJ ztP97l5qoVkb`mPSr! zg-P!CcIM}vow|G@H?s*}%(}UCpt%0}R>!bB$H^=&4`aWu%^(&xU)x&Qv6DQu6PMTh zFb)#2_lH}n47+g6G>>AQS!Q6{;`lDT+Ef_x#e>hZCdytJSsG_%9Qm;wMP}}m?XBwA zc9sQM5@xxRrG6+D-q3p5NW<980ym1|z=^HUm7iYK2|~+Dt=!K-%Z~j>w2Se%V&fg{ zIpVo}jO|5t@%SsnlixHJ_I@+T1IthIIFGE{3!}23R&3^R5Cx7EFdAXq*z&~nA8zen zcu`A&KDrd}yEY~z6*LDNf@dMviPyH~7nK3W7oWy4|mwkvK(xo^_^DxSs%yi@G zA+u$K5QkX8x?ux$6k^pV$p|NtBpAK3oA&h)NxbK4gBiu!gInn4vV5N z^Stoo1RpG}f7AHc;-ohk3!1s=L{1VFbj9*>`eaoDO`I%`9Y4zKFmN*0sXCv8LFNPw zGgB0?XI7|TBvF`HVaDhqKMe9}QaVWz7GV*1Zp;vpSd8D-a;xc1(f|}pESJSk;@lMN z_2W&~wiTaPKYm1sI-SBy9V;^v%XSOTj>QJh!ALUG_Vc8$L1?E4)og=ej%6ionuMT= zqh>pEP5x$48U~41L}4|IJTCmirG>)J?L4iXw)t3;>=395;;uioj+|$kX=>7`JP0h;_v89?+Y}$TskPg7RcqqrZ?ult+b;sw4Z|W% z<0#C6rmp;y{HWOUwbl{7V`hOL=Xqk=rsvu{^&;Il$Er(?es|UZ?IYyI0dEp!pKXw2 zPW=tXtKSH9$u;YeTbFcSCS5(!Nw2Qw+2Wy(wRYL7`Kj)bZ|f#}Pn`U5u;!#Mwzgkb zSiTjU34*&(ZWnN~B&xZmKOG&LPCAG57q^o9^Qr%s*enX>)Q=&xpKdMKLBA+Yn%6#N zUnen(IEviFjG^D2niO}^u3NRmm+x&IHf}qS8B^7Eb2myXZ=Ja6)2#!VNtal{>bGS{D+bn902D!Y@e+I4Qd%9Ir8p`^!DFS0wS7nxFB56bYJ zTUy5+>%yS;rsH$?a{eVvUxIoPgZiaFQ6zU#Z+&-CZ+%xT>x#K~XgQG=L@9IWB!R{n zSIoMjb;Lei!cOtzags!4Q0N`cGU|mAci!7NVw{5$x?qJ7G}KR>e4Tj5t*r$+sd@1x zEk}I$*48ewReyM(Fvcs-g7GY{3%Q)kvOGM~bz=2rTMNYJKHGYp_{=w2NABaqk;4hb ze)af{8LD;kCT-nhc>s)uSz2%e=T;F0L1fX;qT9d;H6xyols>X;W>FrmaF`rxdEJ=a z%-*D<7R{T~l%5iUxUIFzOZ68gUA3LONl#4&C4~W$>Uv(?m|xfP>w3PfC#+jrM?_}f zdId~qZkm~u*2j=H8Px9v^}B(d#z_w4>uzs7->^*6gI#hYHw&(&;;-^4JZI=7p6z(4 z&kVZalsj54I-cVsjx0DqxB?FQRLz4w8OdhlCiV3u^;yD-8c|Z8r=*aVQXp>rTx&P6 z&0g&z0y_#~&yRvMFg-hq>Sk><0)Nu38?);s%6+(8?6tT(Z@;kM;IQD+tT=USmQjD( zRs*I9NEdq(X2ACBz%O#sx8W(>x~ii#gg@yhJfu{2-4Rzk&^o-EaeOA=Ns;-Eoi^Wb z)S~c;T4cW_=9KDY+`677=6=1+Db*j=+ni_h2)t-)aml>+H8H1D&xa=4etFU#;o2NR zaTvhLbDV|Etm>2ApVTKkrMlDleD^0qTb%pFinnOZE4<9*2(%N=hct$oK2s|avkqz> zwr`x-whgc9rfC{kdgFr{^~y!Ux~FwmCy@L=z)@5B2vJ&k*L(dQ%`NTVA577 zKuNbJPlclw2OM;9;RIotx>BU8-_^$gZ>VFz_j1J0$Pb(%$ZdC>*x@cHTisDOPtfqN zF2ZIJA#R45(Mprht1nA9jmsqUcW3W6G?DCuF=Cr3~t5~ccAjYvGxh!oU_M5(T* z5hJ^b^#6czRu&0xzA%b6;$T--dny2tuVboKrA5LltMXByR za_8->~M?7|6bfsP_KH0@ zg)@`@oJpt{P3UWc<(iyRPfa)_wYZdYH^u!w zZ5`2#edN6aMS;W$E7Is2)nW-HwMQw{eb!_rs(BhpijYyN-_R#nRHFzbg`kwQSVFPx zpvIi2CP0+RbvZsp)JoHg<12T481Z^tG+Byj+@Yj!hf+Na8jE<=Bdv_X9hilWykm3f z__n!D%(_>eZg;hI-!Jx^!iBdf*r}fH=)K3f*F9E(iXr*QBs8I4whup@iC5m&TCkO6 ziMQX^+Dpv(c57F0#BW=N!yX~q?u!GbO;tk{*LZhmxP+p~44Q(o>-+ z34@iCWIvRyfutoVY8@AWvmUIXB)l6qBHq}VzoViVyjju=-_8BVwXzgNBaDaII@GUd z#yrSV7FmdLLGJndty_*vap3)}V_)g|sD~tdHc`H&fnE=*R$RH3A{7+W!6Hj)D3sJJ zQL1*A{8i1X_~4TEQR80h6`_Ob#s{s6C|M^i{VsBdeord3j@}0aUEs#3FjI6TZm5VG zZ7HF~wMwDJLlF&TI`C?UpDe5z5cSjwT6*X6u3|XccOTGR`w}}rMTu4`NWCod0;Qsp zwbZInQmboes=%)r3n(a z0hDKoH+A1-wpY$YYaxY}$VAte_*T6rmFg*ukcZek=&b`MwH0-z4W)XLrBd~DaGVBy zm}gcTqP356Jy~ca<>bRZxVBzg8~#B|{E&VA!5`{<&ZiyDB6R3+%w}p{SF8bV>wQj1 zVT7$%gE&t@&w((-3A}G2SK`pz@GpDB6bY?_#@ zhgR=fTkhMn#~?141!{Z55y-4w2wM|z+EPSZmK63-sz;_bvt4awWO*rKq>1A@oQLYH zc{$Ipn_UxN@}$z)&15d0}9N#Kl)_gSzS-@2YgVU2esBx zK8yA%`7DY`Z7EB75+@ZWAg4s?v`fv6mqOe#J98Y3-Hz62^R5z5C~0a!sa_~0pwM0^ zpgj1MR(p>O{Xl|tACAd&lVCJ3p|cyL8`6$xeCD~r%W04N*~ z4ONt`)u=XIt=goZv4@hH=USmDe^oP1NiCvV>BIcOG2IkSz{fITrAVE}{IWSdus6x$ z!+|kIM{lQrl~GgA6S_^^Y^4)RP=}=`Fuep5W0qv=#DNdiIx!bbA3Cva#t&hVdWc=H zui6?zAN5H=Nv$?2&5HTvSGOLO#tNS4&uax4^^}54mJ}XQs_S{-;tD^|c&d#@sjjFr zWGL`&ZLK{Py+VK*E5IV+VKmlU5<1TMRiz-~YZ_4~sm)PqKpAbpv*?W@g{Ykfrk-U9dfk>lvbn$)IcklMu;6bf@Kn9VM%?~zEFPaj5}5=vZttR@33srbpSv`}K^CXA8=vA}u}*Tbfgnnp@$fzXPo1@bDP1oL2k z6`f}f42TMJ*0VpX%rKG!A2_?upn6OQ0(Q^v4 zuxg@ErK)A2q*jzt-DizTs8`kgm5Nq90UDKfR*y}i5*pUJp64k7!^66wCN*A-N}gD> zp>@Q(5CytrBRZhna)U%~9O^~llfP~)*tPDRKDJmKrN@wlk{nxPjJ6|!!$41=X|^Yx zqxHqPXL(s{!5NtuoNY7Np`I{xV!bknQx_5^?NK?_8(kA6o9uu*o3#Fwf*Mw>h~<$! zkSM7hOGRuocYaAoIE-xcs6lGkU~sBcyu7P1gp!(fN@{&DB}@8(9v$8h^9lBNFVdPA z`L6z2Nnd=Q(PA*nQWIM~MsT(A)KddSiK=jbl3FvQLuqt%vHr#Z$`n)_CQ7OLT}^g) zqaL}&m0AHyUo?hL(j%|g8mWL4$NjD~e+e2gscEIYMv7X~Dxc{$%k$@8nC3VSvHT}R zY~yrL_et}$=vVbjL14tJN3m_|0hVS|rX96%8sd9mrGYjWxqijVCTnR*a@X%>RAsM}`HFKqqM7`%%DV z2V(0dS{LqV#=Z-~kmMNuBWRnN4HSZhs3S~=8Y>plVNMHQwiPnqeNo&22(I!Q= z0mrW2LR;gB!@knqMdVMmUejU!utzve5he1>5syCEI?o7rU|Wb!Ild4X!p2#fS}*D# z!(d(V5c@*ZmcF=eQ|oNQVhV#Gv(e^3x?Niw^;B!=dWB)N*2|@&FqV?S1higi$tbDS zq*T|_WCRUZT~D7#Jk#|`o6WHpiD6A4%~9%b5^IJYy;uFN#u%O{Y@<~7MRPG>btDBr z5c)XR_?}}GtfiXsurkV_xzA9w<|sW_>_U?b=2m~LJd#dD0QPW$uo8|f9I5oaM4eP^ z1{5l?BgMqs9vJRp_-abO6u6C^<}iC z2@fT;P?YL=b|9X4y0u_o-9>#;pvY2m09BQw#rSUhq_xMsCjL2SN3&Rxs#qW1)Tvu= z#Z}*K9kvgu8?2^Qpr)rf)Hd`hE|QjVb(m&b`~;~0fI5{7pKDpxZJC<@V&%w;RG zN#Pab;#=8=Cw;DUlo#cg$WgAK1asU%VWzBB?Fd<_=7f@3 zYF;f>qZZmNjCJ^nc`gJ@&8)1aKUQ%eI2XW0q-kL#MT$#T-Cczy@{MZEWU0bVzEP=0 zU8(56wIeIs5aL?Dt4<)^P+W*C)qPec3(pkZ$Wn!#veeY8$EK(UzbY<7mb~YcC?boY zIPKZiX@-sCl4HXVVP20Jj=1;P)`f;w;Q8dIsAkOE!7)sn^taaY7w2hGU_-;#2X7N3 zjJofNaiG~s)IALc9f)3xXHDUtP*g0ihYm#IC>xrhT2K^I)vo1{5=LZ6jg3;Z_2e@( zN=w;D9F&le6=f*PVuql4Lp?R)sGsVV)mHW_sR%h{Z&a!oE_@s#i62=?9_ABz0j)|8 zlHzN^_Vq2xPrSfY`Vv`BO*7i5dKgL%!mo`UQ0_J780H)y{0Vb8LTWMCI&?$d9T1`SQL@k&D2wROo_cFo< z5m%EqabsKScjfPDttqLsMkA(hR4UR+hk=7Fyt+6(*=k_6Z7Pz<>xwm%CAAeOh2qq$ z+tym$SFPTllCpltQvEf>UGhw01tr}prQKlPI|v9cem?f`=JSfXEY&?w z+6`FS#{8PFptu`*m?ZJt)V5V#Q|gWDA8yTARD_u5vkdJdbM336Qr1z6C_Z>_d!2!_ zV4Jv51~4^AXosTMwtck$wL-`1!qVbv8byJ4-ga$#>4K<01~1Td;yoEV;_~gI*vIS#r-?9pKs)*g>P>jqvvxGYBF))j_nui7dnpX#4$EPj_f4SGynlzE~3O= z)G=bij_n2W724K%7k*LVl2__oj)Lf-Q-%Ncu?C^yQTU5SMPV%^wGOoh8LyVo5>DSC z{s?$hL-L_Z&ASSj+)7%C{REdP6u;6}8!@4&r?3b`i^5syU{>v*N=XxAq(Y79=6Emj z32iN97)n}_CAHIPB@NG%>Q0t)Uo_XlGfm|v+2Zk?+O@RAZyKK|DI}q!@EKd1)YjQf z%uWYkd?<*iEyBF3@tIQnuBLLe5{7!p3gEe==!6%6T;aq;?Gn_&5tCecpyKXapv5v% zj=wOmH8Etd>t(4#r;dr~-G>3g*P-;@xBk>weGqSA7l1c|g+>@sQ;)($lRB-9@uco$ zW2+%`z-ka)Me10G*tKv|z&95!QKdtW@2LeqL86d`lIopTlDfSEXt2#0360F84Y%%x zCUxS=pKYy;aDYGn3=7-GeI8HqrkYxTS_i{tHO^47#bGcONX)(Vm zoT{}j^6gOkw9}9|v?zMCHJRg?LQwQ1dOS5+@Jx5AM2lna6GelGE(E(gPW5^#;l@_K ztH~V7m3pQ$nd6z-t?#~runNg1?}=)%zzG2IiHkPOQ#~KOI$VsbIYxjYK%s}Pf)cJ7 zqNZ}5^fEDE5MdKN6Rbt$Y3AiwIEgthf@yT|e$AXX)eMR9dXlt6D`Y6B*+Au@dQVAh zTuN$^DXDQ#lE>F_ar*4`o*r8tJ`d;l6bD(YAfQoAk0{mcYc>lJ<1bPz;|Iw1c?PjZ zQC$-d)Ghj(k|5!igC#tS9HK%vD?Qi*T;w#TSnF{3q-M6zwA2HE#gbk-(hKFq_`*`0tW#SpBqfC`loS%6jj5+X^U<}|hHtuo=&T=~5LcdMTqVq<#!_KC-q~)R zhqe`?X(6Rm7c)TpEf?>KUE2%xSL6%DPCYvs7g6KrnJ%?_$5|MBh~*$80}HcR6Lad- z?<(<}4k__mmg;Y4VukLlNBL)Bgu!4_xE$U^VreY&E9IZ-5-Z~n?ScD&Z@QYgOTW5` zl7ly;Jlb&zeCSOZw|(qsC>{wfa>e;icXsR$=z>}dd#D${)&|1Zy}e*pMOE;Ys@lQL z%@hak-rh@`^10UG(#_Hdag>Z)oF=hGshOje8cyvN=hbd;o;dW*)-n6I@C7dMHRy!{ z2Xa=ws;O2`iDkBjZ%sj508TMBCsHWSRR)9Yj}% zz8Rm}-eq;&OD&1v2dD6hl0s}sO}%{)=BG?c%lg?CAH?1 z)S5?9?QrD01Q(wqM<)nXfbi*kMLl0Uxv*UY3wg>13+=qc{9-UcHJxi$Fg~O)TKQn% zAj3$|ni4T3E$IrQYkib_Lt!)}g(LVN;e$0d46s@IHcSBVUyTSJi8tKU`pAB)8E0M& zuZOCZNW{8jO)61m1>%c~+B#f;uAlqm)D=;iVR`OCIghzfjWu(MrB1&9Jz0M;ryzLfQmtrrHV@UrqpB{<=N;K z90U!Ma7@;^>YA)pttcgR!pf3vuJY(W^$`YsV#-({Ov7p>Wxa~#@rlxND}y(|@ijDK z>H47!XR=;3I7;epm8A;FWvTYu+Wla3h93LJ!F}H+h)>O+tW+(&ELBr4OOZHgzqYkg zwNgAlLGil%+Vgi-j#oVK9r3~aP_%#g_pQT@#TXUmaFe!-eL(cA=RmDB_0?L-lAb=T zl#tK#TvbYmpdfexyD|ZxGCZ_tPbno(NTQ^MNLmTjqrCZDDJ5vJQc83)Ys8{-Oro<)Uj);W@LTvZeQ&@sV zOD!EG-A!#absUss@Pl}xV=<|}p%{94su6%v-Dh=7@~b)~Wl7;KrKVmzHl?tno>ExK zlDD6pGo{Jqp*lWgNnxHQ5o_!&_PdyKcaiXnA#EaU8zntUK%u@?<7LjO{vTFFK zG1OT@QEdyfCe`rxQ5V!%LnU?A$dZ~kG*R-b$#CJ4VNA9eVP2|tBK3T6-hu4};_y3L zNA8{A3Tm2Yyzry915NR0O(Tc+)J^yjd-#*!CQeK-4o+sh^Qfk9qgGqVS9Ld)GTTA% ziscT{;^48aSa0fS+@PeEsMcBWtHupViqcThL#%P5_5AIhKWX;g;} z&(xtKOXZ<+yma4!WzA%m80Hhb<@vpSTN9hwMU1!A!6HiveJJ(#`OYO;06v4$0~Hb8 zyqbL5WmKY&imiQ#m%^nVWl_pxyBe`reYNRIHJG%9Y}lhcr;CFEQQJsSHlf6ozI3#J z({lHXSXF*`aMkYAOa!IIW^mnURV99mR<(4<8dSAAJr_c0*&0-Ldeu_G9kHrJzUfuF zAoR3s45g4fz3!l@rC>Q))pD;-t=b)&52D;EQ|r!9RqnYFtIF-vU$r|^MvBq`(O-9_ zswEdWTGeu&_EzoAoD-uIs^Qin?Z8GssWfD%+Mlvikts@w*2z-+t0GQ3Q^ZM@s+~y5 z?N-ED7AsmKOZCgj_`)-#mXxKzh%^W}%Kr3@cKTquIs-__>TSMmU3K&oFUk7mTJ1JD zNJ^$)b9H;FN+LR1)l!8tbJcEd7L=0VnYnIn)zWcd#HyR?Y_~rT%N9_ynQ7`&I$3hT zGxW7PH4%(dRLxL#O4ZWtKU&q95oQ|wmwdozjmljzTFug@VQ|&y-yeMfO4ae;W~VMe zNd=%KR-lQAEJ2aG(h;jHR}4^DtXKqDRH9f}Y$_<>Nj_ET>#|spjj~vgBw18UPg!hQ zP+lHZkWr(lTyj36ji{u5qg8dpPk&)tIgS@4@-Vs^JQ?uyBSFCvj~NGdi6ymh>akK{ z-OZ%bw~f~9=nJ(48?Y3cNBe%c3L{pXc?00L)K3CRNImM!pc=%4Mp)Qk3C~Z(TMpr!oKSr%yqIE3Z1mO~?r3YkHvw%lJfxVYVGhE)tnk5z-&P$Zh{Yg(j+egwVWssa`VMs@@7+laV9W#nPu4$H_MwMGpcS3ph@Pt`p&Kfo^`z(ei0dWeo3l zJ)rW43b8>xCGgQkm4kpt@(g0&#WBY)Nr}v~K@2~k!4^J2N?1WHP^~+19${-3#S1Lw zcsq)JJeHSSy!f)rB`iVeud}AJ)xzUBM$8{^=LG^IwZwlspAllbCw&4IW+GC-FQr*P ziJ(?K!s`+<5?R3HB7zUUJWkHBw5#HpfJ+|^@o26uKAxup!eVm<>+tlnh;kC+C-BrY z36-$$diU8233<~##?w8p;)9wY?g%nWsHiuPBi6jUeOU*M4ui3CLLxm}*2K?FY`?_^@dOC>Upr;RO+r3d%a+^uIA<4HNgn46p!=MF*)G0%`ZZT-vWD;`56bd#yx z$QV#(_(E?a79A~#6kbF)wJ~uR*!WjmcPgJklOE%Y0u_Q%p@r82B(SXf6sKYUk-{`d zWDDd+YZ#J(X;KHLbqIFb`diwk}dU`?zH*X1#pl3y*uLkyn^Lg-w)4sGH9oD^NF zMXI!9LP}$>X*vjwm^IC04t=%MR+V4r4y|h`9~6SrMsB}hH-?iRdM@xFx6jr>ldZRj0y?~uDS zI&nm)PSq^vOfS{%GPy{9lfmX09i>Wl z)KNbmv5t&mmCkzlOWi>`yHo>DuREwJVI=wkqi>%^5tnv{Q5nt^{egiSs27=PydbS4+96uyCVqH%lkes0>q6J~i-5-DIL9 zP@~jMCP*u(=e2JaZFUni8ifHf)a^f0Futn~H2S3hZ}q=aQnOJ9p!Zv;Er`$UlJR%= z2Sy((#w9&~k&dfwd6YJC?9jfD-9vw1^bObODyFvIop!8SI;&jeK0VsJHj37%9~jWS z-kVb4*{#%4L*FW`OQZG0Qf4C z>*)`Seik+=#=Z{>B-%P5;H2Fh9kolEI^q&2S50^-Ig-u1)JuPf0#?H=Re+m$tA}Wp zbaJ$+==F5__1+xLe>NK75$09z%|_ihRxqc z;_k@=t0!ytF48-rBz~hVM!AW)uqIo;WtGHl#1AOfVA|izChATRYKVo^!ybKSln%_J z_DUac6_eGKDd+3em}xOeiZ<#8^d{=zvSwzox|J+P2)P<|W6d1etCC8M+AF;?rZ8FE z%}JOgnHu#2noS(UWesF~k_o63Hic0?ppUJ_+B$rOh91#9@{jUnBR9(E8?K~iqYgly zTD=TecZiT*I$4bP0i9T{ih~>NrEW?5MypFqp+?ft_hv~aXKugStI@DjEC{mnkYlTd zsFrkc<`49@ulHunkadS|{?dVN)DP%wJSs!hMUhhy%27X{_wg1mWF<+Rq5Wy}w~W1# z0_zqqWM$~b3?G(J^*ThmlKn#lf##)a{Af*B;{La_!_|ZwaZ3(X6>{!z#Y^c{ zI${HOz{)vgoE{#^a8V>Y+{AHEeKy^ zlOPwYD^;xDXuS{*zM~zj=5691q!CIc>#fo#j`luL46+O1Dq___jHe{(CqLL04Z@V+ zd`7r}y9k&-40G6(2=JALrxE)gF1?~1ar71hdKQGtlQV-HJ)<{(oon=um50cHjvY3L zo|X>P11b-wD=!XU8dk~J337;s zfH~TXm2^MCH-(6af(Ss8wdGszzWCHR?NuvemKH4bX=sx3X-kN$EiO9`t zl+k%xaBPW(&TOw-O-xk6)V1^6c4?lO*|H{pc#%Gv6JJAQl*j_sbAvK zAGBAj=7K3gcDV2`mRrHx0u<(QA@S75*@yT{aX1W#o7G67 zK{k_=O9rI_#cI+ylD(Joy0~nZIPq;kv)pYYx97^36r04rIQZOfgO*o%tBf=?6U0E@ z*p60_SgRoQ4Y{ve{ARXja&S|E{;tMXjV$vv?jFQ~L&~>c6!^W#QLM&w2ahTem&HW5 zyH#?X5l6voSXC2byCM$0z){KK4w)_BNG#I7o%~K{1xt+Y3qFhNbv(RA9*3BGH?)F4 zOmwh#eicL`TUGS!h+{C}PU*l(9Bc^WGjSIrc}11ucf=N$1UZ88#z#7jBPU_Fqa(WL zUco-WR}_;tX{!q^f#QaYktbk+JhbI1;B3T&W)9isxxExeztPWP@#S~6SCWT})S<+r z;y%g^msJ||k!C=A>TGxkQgyHb%cEx z1rESQk(G#9^hqUzGwl}4pjqKDxh_d)O2m1_jhILXqf02_%B$O}S4cNAvb>Oz90{d# zxErba6EGZd8?8d1AQ&8XF6098|7{7+Qi)irGOpBxYjL=&mc$*EL+*%uAXgTm;wtWD z3CSQ}6R$}QRxTmhfdJx|%etyeq@&GXrElmKDdL%LhEY*i0Va}z)Fsa$eBqZ-i*n%0e#KK3~&NxZ| z5(g8r&aFn=9TTh*7ks$0Y8*FZoa}Mv=PqfqC)PT#_t)EjIQ`$+lq% zXn~%j;qO$6SseUJCAP4yYwtdM5>#9z&ibSGP9+cHongJ(v7T+Q@w)b|BXp-y&XQPQ z^i|OzTUBs*x!Y%$tkrdQCRAz+nVDeJ85Y-nV3Z-K)Cu@j*Bba4y3^AeJ?zFcV1{?N z@K_^B<90bi-KJ`3kJ{YKG*xS3^590F*K8p1h3ng|#UMKa1sME(^ZG=i^B!8YaTJ+a zwL5KFHzv2Kb*EKrJOPJRZ7f>-Rr&t3W*g&Cf87C9!y(h%GhL0LthZIJTN%)7<7&}c zcW~9wd(ha%n^tiM9N27Q#BJ)%RCO2?X^?X|*=0Wr?m%PR8QOuydOx&k<6@$!c4t0c zM&JHJcYQMh80sfaJ%PK379V%Y;>9mGQcPy;17HX+vxFqH4G3+^;zkA;I-tgKHneKR zqjk+3-9<{uB$9HIXS>lp3~iwC0T^C&`bw*XUO8>Mjeb;!3qILiLB=c;d?W_<3xW~z z9u3U!UX6TKOnBn_GuzRM7}EzgC~$iRDbRW%aEE`YWcj)zJ|a954TnhzMlKew*}I_) zl%CNelKdGr;OuFWO_-9@zmtFsH5Mu?ZZIcj)fON@Z3!AWg4(BMdQD>rD_1FgSD;AX zMp%Lo$xiL`C|;*GFy;NA6hgaPFp|pnM=oFlGkQe%p$#-XSi`Hq=&F>$*Y@4`om2XjRJ0Jqf^_QsBPI3!>X2oF$x+K;v|Ul zh>|6rTEpTGd!0RiOd8=bM06`zbX}~-c9qC~G`wtFrG|d0@kyFib@o)gp9}7#+Jlo@ zDv3!RkFCXtderRGnwZ)`s>EWMoj@o2rBEFVGL&HW>%5JO!mUK3a;fO$^gElU zR^47%NF}D?L!+|;Dh(d*jLxg8th2lm)}drWCqZR_;iVY~)if;E*&RreJOdpW#JQ=Y ze0*sH2~YFkD!-O|X~wNRy?;UF$|Ta zQiv?^wUO>;T3#+PSAw|8*&{nxTU=*)t9eP{LiMT9u>v3GntKupZfqZP2J!58GoWtb z=)hpR1)Njkd^5DKWJs(Ot=w=$W@*%8u;bQF#A@bIcLZiHQ??F8=Led-zGKw)O>?ZlTp-Tv@6*%&aX z_!$A;ap9v2E;UldRE?Cl>oe^`3qdsy8@t2VR;J+UuCTV-52c5ztUMjbJ<2R&~4LtAxghHH4U zqfc#_v9mmZhPH~(sF~QIbsOn*c-4lyY<>>9{zRh`8s2QP!8hNmKhbF0Hrr}f?$0vP zakTkr&fCp4TedpNf^{nj(Wpy?Hrwb&hgNL_uo{A6oaamrWPKR9e~Q#JK35Y|YB z=5c{ACTqO-N&M`?(vz{BeE*>{QJJO>9o$SkVPrHfGvjkx1HP7S&ZSP=p+aN?$;r6k z!xCToYJ0`FL;g0I|H-krlmQRW%}73bzk7qRleqM2?b!x*m2uB+mj3rt8D2ssrn!b0>z^t=D3B)e1e%8MqjYB*dkn0sb|l zT}*LXC7=RPi~MTjOLH@aOoI~*BRsUK<(BOIV2Q3rpaN-FB3x4J%*|Obd5uLO*EOI zM zbpK45ggIq~Y$muHdj`cLmbeO&eTbwJIY%`oiy4LRto zIq>@pJ?O1EsHZ(-a#+i;^jN7ZZVPROaWqeYX2vWS|v2eK9V@MF&oQgwNre>vveQBa$(5650Q0 zXs_YIt~AA5LrQA)oN0&ADm2$^435p+jpgn0IHF4`bH$HNx;DXOJ z_djl**_}G*X=85kfex?Q98N>VTni7#Hp823c$}flGA-M8P9noPIletC0HihMBJ+_E zM|6JLe!;4YkSUMc=`ydmj1V39^$C|1*vgnAzVtuFLUHMi9e2^N(TV+k);@3eDl{pc zhBY|RBx@R4Ri9zcAHE19uYs8SIoCQ37B1@p1DB|ftk2vAiD#lragK*h8hPABz;&)s zP&AU>(3%bF(o?lNxYdTP_0%0)wI*vrYc^D^sk+Au!y+7%OD7hKw?EY0Ddi>s;;D$9 z#dD32k{ZjJW@c!m@cX`7(Fpt@aFcjp2d^V3+z$AmN46c-I7v3N z+GBXtnl$uOooSUcTB27Of+h_?9$s}i@-3eU`;f%h|DpMsSH1Sk*Tk<+&N=rr;;!Ge z_rC3{huR<5&frF2qQ5P&?b~E;k6bbL5nQ;)z=3AUxA8t8KYHG*C)cm}CPw<)!m4hX z0r&NhT>_iC=_1(`88K#h9*0-;OWWnE&$lLD|EkxV6TbR&uTJCj>tF4kBQ`$LUc3u# z8jybOu*TOFMmJwKVT#)yX`3SWU3+dfy$ha^4a*2RrL5L_^H{`t<8)Z5M zuIt6YPbxa`k>F}rZeFyB$wU*G7ve9Ew%2xj)EQPzj3FKrp54R=4tsl|L4qOQnW&lR z0d02sy3}N67*MspX3ZfFt=UlA0adxop=U}eN4t_^8c=si)tW>Mt;!{bzi-dG?Q@T} ze>dw8KXq9UnMB892gZRy29>ylOK!OVRt7((_`ncpo|)V{LJTHCYsjV)4?fY}^|XO) z*d=0|{||Y3-Z|%=wLX9K#K3A5UT&_MIPppD+Z_0^H}o5~z3<8PznZhT_|)Z=A})n6 zEiMe^Ke6{O+ppPW`g8NPI~R5S^)`d3ZQPGh!+Y||c&iXEexS2Pbbs90O}y~Oo%4=4 zCqE}W=lrqCrU0k3S(h9qoLIm9HRlk(2l?=&dJ;m$eY5z|qu+X;aj^Kn_Ndxt|G0Bt zw`#FgVa}kzv;x)Q0M%>Nso`p6)v3@9&>Q3ZQ} z=EUB)8FhNi{x*7>5aYivjuY2@q-C5!5Inc!kk`cvY-kTL(A8Ww_N&3>E8Er0<0oY^ zCl+_5dZ35Tg|D6U;}hb_vy7|6N!PWkZow6*CikRxrVK81h*U4XF?=zi>Kpxw(YqGI zCeoFY(47IvM(l;HCh~vXi!M=bda|aY`iQ;IxIJ?(X2i=vnL04AR2y!_?V(llGivB9 zf957``_9ih+t2E9SuWSZS|t6#QfHb7O66h?Rcfn^2VaA-FTywjJLHArTk@+0hHe_W z#FpI#5)^q2x4rvCK6=G7Qw#f_yylBUH*uDbrR&=2lJo7wCm-x=*OBKiw@rCm2V{pu zF2?U`9VqWW-+uRtNUR^6S#aaKNxlFd1C|?;cY)bR~Mhqxig@m$;!tt3puPv;v~h=pHnZD;U4cNN7X z%qqBXItazyk9GDnavV;0feY5Tj0%gYe7bPA>Y{hD?Id)SY;oAr{Gw{hc)YWHJ0wLw zXrVMsp{?9y{%~ip;XrZGu11!FLtA9Vvah>~^B(W)Y+w}NLM%+KTp7m2$XPWE8-Gfa zCbmcD5y^2dV{PiJG~~tGDL3|FiHQ+-3UTtobd%fDTyko_nU=Rfs}{llv6(4DGYchf zqpAhiU92SpQafZuF}b_GY@r}64g=-(dPd1jLuDU2TyMl>Ke*pU1(#28=MLA1%e%!q zgualJU?wbBTs085ej)E-COwFBPqnH+aNRs{_N;i0dO44yvhE8ZSRrZU%0*mqJ{ zkfw%YVgJ?Hzs)^VTqacHQD8eTf^xjec|GHLELO%u8({|P)NVA%t0E6_F3ci1E@{f} zd@g$-(^_!d6$nNWIWW4KcN@(0xW=v^2bjwnM_|6uG{k1bkod2s% z#~{m!w8gs~7oNp5s9HgThG`!};sSV|OVL=p#T_rjyXkudvxmC(Z%!1qra>sC?9=-=`5S!cUP!LwV#ZjCaub~~b&COG(Q&O21n&3_t zve3w6k<4^aP1&$x(9u&ih}EhP1%V?#H%dktRxizDhgWq;PvE3>Lb@H2izN1D(5>po zP$F-svvfu(-`B##AUm(6c%$h}h!6g{v%f+94X$qF?j)`nBcn&bo$|(W0%EwGkuV14 z-DDGyvjjdx6Tai=4&L{qT;z&+o9qkR(N>;JA&CgNv(!zw z>5!`$%k^Gqa3iIKPME9qV%pBL>S*&wG$Bpx$o~*(g`da(xc`&!BqFVrV}>P$FDK6@ zj5DDDq}d8lU2Fzp%B^||B$;a_?Ueh2$o(cm|3<`U#TpJ29^@>wao=|7a!f!XH`fc} zzSe4k=snVaB}|5y5xmO={4MjDbBC+U6(+@R(rn5J+P_0u9d9F{&KB;C6X(-igL9b}!GvX}a>Ui3s)5WyOoR7MNt2Sg71H`9BtC&S!2ksz zSx!ofaJejw7?*?;KKRLG6?r@bN{(|BGLY$Wau(Q2MqD4wD9%W6Qtss>#Y)Oi9D}0e zsaJ9#+wWR#Mv^O$l8Lz{5iTN_JdPHsy$J5&qz@@YbCRR;ESIrOW9X@%;gRVUk;MIl zr&c?WkWFGsA-nJc-2AF{;!uv#(URPZgNQ8BH9F)HBUm%zl&#Q&Y*M7;!@q(gU(E8z zOogpT+l*-9Lx>6d1@p-MV9Ia<5aJYgHJf9C3^nBA;?~8H*GP-YgNDZ$wqFOF@wjJ} zgV%=jsy2bajj$QPql#6f`?T`eeKObvSv2;#gmTX5}nwg3xpX)3Z-M@7f8KDzJT-a531%#2`>Yug~8{cm% zG`N3Krb&dU_E>k=FJ3)_yD4)-3b-ufYV6{9qQNyfVqsE1AuM#HP=-c0){&H&2kZ)+Oq@uOD0N)5*M&q7#xw(4y^iQhb}3Vy@P%C7@b8`X8-Yn;M~kfDcBaK;`zH9UogmAZKkA31Suom<5tn~ zDcABs31q@GkHex!s{zR{JhDm>K_BEY6>C-3COIB+gc1i2T11?Weqb)cL_nAKt&&NY z`eqSVPr+}5f`H4+;f7iAa)gG*DN154n;i;IY6jxa*~Xa$I8->MUy|DZ?*6u$J4P_e zfU`vpPBS6OJa{ejSbD=GMG=8F9tpt%@wKguiw)Q?cr-Qz1e2Sv!`rUf)^KMT?_5$JXOoT;Hr7cLGwb z;**Kd1f5qH-*)A;hBwPd3WEEPWl0&q%G$nag9$?B!4C;e36+Ga9^-;+x#S&Wy?t(V z_0(e@gP2QNY1hWn85vhSM!o_cX&i!szi?hHOGw^DvWLlBsRS5?QH6cTy$l4?9lIyt z5D`qswPJ%m{yec^{rI@JvTMAd<3P0VCoNp$>@bK#FyFXIT(qyTi6s4Gtwp8>H(&yb zT9yeylKUYHMH~?!RAK7e0TgBv8gcTiwB=+dE)fFjqSLAI3+h;XnXh^$W1I3-q1Q& zT>qx=v&BhoG#2#Kj8PCUmmnlMcu+x{zpr77)ju$H6d%~n_?!X126N+aQcJuw?b{Fw zww+~gt8*Gb=kc16mq@3gU5w8a8}De(5zp;oY%jWt$6qO){3fKN=@hK51A|Q(ax$`m zE~34Dyy?`o;uGt~*NTn5>1qDUh$kGllUB6ot6jFK=KPtdY3kvZE;lAQ-#GlZ7{CUd zZBnd=yO$fE?+)e3tj$;rM&wPcnPrEyTFF05qSi{`f%3=me`~B2$4?k=45(8QozD<0oN92FR^ zf7cn~`-^Y+#@^z~f$^>mTnd^qIOL4v-DnM-+NKj3u+2WEcvMpaETP>HGH<;h^HJbg zLtf#WwEi6Y1HJx7v6r6{8E;0+!?1-*r$c|y1p4BtPaCe-^k<_b z)~+z#iG+jZ%0*;Mu|IiEEPk`XxWGX8lI#(OG9n<(4C0KH#`1B`MFc~mj}_buimX^C z_WBU6i03|qUH<($j_)Kkt~BapJ7zl2g&CvQhC3oRAgFIOt1K)an}!Gp;f)3UF^LN@`R@ z|DkTF3;gM!KmrOx`K!x_^~*B)%YdYtFi=@F<0vp z8CFC`Jicmt|K$Pq3~;GOCNC8Ud{Vn#C^hc>Z_mf(Y#Yk&Y_1dCGTF^&N5bY#1WVJ$Eu4yOPs$x_ z>lwr%_nb_d>&6!I`rT=Xe`=3~EgVVjKt^BG?o9cIG`I18n2edFmIlAOoA)cyP9*<_ zURayO&%?@ll7|UTnsFM`4Y6SlvCm$!ZL#S;@iii!v z=b|Rh$<$+XWR`;jZzE*mYLE-`QIE-Xj_XLP2o?`?T4-J|<$S<3!sWiSTSXAi0LKc? z4K-yOfF|OE?zpHl6Pr#nR*ExUY8(Y+%_tX$%uGAPiI?#H##4>=Etd(i zd=J$O#JYg`Z|<$qiAt+FO0B|4;_jF6X`I?&732)KF8aIL$TnlwKk;IY#*I4|2Z&8K z!3O;Q*3JY-j_SPQJ3+biy2hZ3zRS5u(&i+LNMKgW zWIoD4rsUd_)oZf;7Cl97{)jp!j?2cbO7ew%NT%;j(A|z;<{rO94M=26tafFscZ`y?QmPk z1nq7^a>cMJg$*Kb73^pc%mnVzoh_u9fDKaqtgOxtyN&+`w<{1q@8zwkip79s7tkA|UJ3*NNssn# zjht0e&&5bW7K+&{Xav$z!Jq2-XLw&%d|2HtkNs3ljMwm*O$Cjb2S|g850kNd2p3(& z_`HPv@$&OGIiHS-^pPS%$bLp|Oy9|FbN&l))7cE#9+_@>&J1S)mz57*Z6?Ics!wTN zFh`q2L<&s4jxkpPS2WK5?>LpUEKoW&98@}zrN9$*{)pAH{wM0uIC*<&Ff5rF$`x?) zgC0Tk8ue0~P9|Uw=*N|3%cg=6biyn5MxD#tY<7r&=6w-Y@f0YlP!-DnxePl0hIQ)I zIJ1z)38^67lFk(>nV=IMf3i0pZxM|AJx)TQ)xo_~J=FhoEFWh%3#?-$I;l}$dnSTTF&B3N$&3Cfa(sL@x=_qbH5Hk<;41xRtYPyu@ARspFgCa55S_#8In zt#sqKP3n{gp>vhWn?d@5z`;Kf{`{u=%OqStYKHW5qC*<+Gz5D_E^!HXLi)B*#b5v= zFMME1n1ZLbd(eE2)>*vL;2?QbK>0M5eM(J<)Nx)*rb8b%by_KADWb7UU9;}`s=K*_ zUBJzR!5$cUfkG!1>ZpwRF-w;=FyZZR@7uyWU+dKO^er|d`XBnFI6gI=8HN1>UlC2z zyw3;FREBCTEdn8!Q{n>0yZtZKLixdGR8%EN$pD~B;}j)vY6^1jGwRf+;Sc8x#g-gP z0`HwaE?0Ox=_+chlz5XBP`>V8N&i)8aZ2I`*bO-$=eI!iOiw;Q&eT*BW%sX@41%u2 zWI!w_vJA56cv%i0w7W*&f=}#6oWHdaxA~jBt7m&_ znC1A#Kc}`{RwSncK95u-lSmQL%jtwsL`Gs>i{-(0;WyUEQxG3(cCflWF$S& zYT5nBLI;QYwW>)!>fVO$ezlsA>u*!5!lhqF3M#E8I=qvSvQCSMda_d+zE9O+qhk}6 z$*6mbpiYP3=Qz3^hPUuJZ+rbvUQ&mnNc&!K*Q0Qq;@P&3&cvJKS6{tbWo6S6JyrU* zD(y1d!roeM_p*G;9p0QDbsTzc+VHl_$lMk;*KL%fqIj`IN2kgoTh%mKv{ij{9INf- z3p7x<6x@J^KCh-nz^F{t{c`p5z4OeEwamUlB~`M@;>>OiN+y*h;*?c)sFhGy%uWHf zGM%H20}{fduA|^gr?EzDE!w-OlL12!Nym6Ky0!Jy>}cGwNyQj=(E|hEWgHK2Nn- zQ{Km0o(}i|S(W6IcdOUi2Vbp2moNN{`m_Qs1(cH(x5fdiRw}aO9(8dXWFi1#AdOY} zX%Vn{9+?fK`_{qe$p((=Vs3$4f|>%PNoZ9gK9JwvL)8~>R|aLh$sb|E+oj zE(N`=42J+p9zfihDbWr#*6&d7QF<&vKNyDQ2oD(aYf1j%UR7Hb3McmVCEG|T%>Elq z*+TSJy|36}q51iQTJUxtn}tE=D-Jc`Es7Qsa$tv=FZ=IP%e84+WZ3sqlv5-{Drd{> zz0uiH*rnpjLIp`v?ne%Ww3y4~!I?uUCBh^mk)69#F_x&Zrx+|f5i0(z7XjFQ&yWV? z?A>aWs->#sGKB+xxWN8%3G+zLkYDUpzg28@wIW#uir6Ha^Hq8FpVgUi>KD~kMSKCq zk0P)M2(#>koV6=%S``CbfO1`?!e0)23-^9WeJxfcFbAnjsy+kL!B17#CJ{jKs%FUY z-ruS7+I}~-Q%w)rwlRzCgwA3X+nG+xVmmM@X0aVMF-zUujV#AIe2@K2u`3gGN6pv| zaJsV5G|}A`c{ONhUsTzTh7MyGLEq%SJ?aEGdXHLqdG{Ca)_02qxi_P7bljshz?YRt z1K|h7;Cfi0i;3s&TMT#jCOC16@vyo#;e{>TTR7JDjx080^Y^r=$jpyJ^M%_7U>}iF zh#!6;)^^g$z3Ot-xmp=Okzttwv-dNiw%_mHt4i@STroIq?2YV~q)~!4$B#UqUQ>|H zjC4dLRVzZ%8qUgrygo+OFV%ffkjb|1ayVQ4@rKv&2wU|6oue9=P{(>=%6X2HayS*N)v(ogHk z0|WAk*30OO$mWSp0gedJIkE;0*ofzCd>6p)m1HFag8bFTbWtJOLb{)lbcKT{_G|Oj z%9e-Jcu^1b9wm1!*3$-H*#ZQkWKJfWf+)V2zmr*pB}YA?@~4FE_U^;7ZQc|fmni6R z2^!NIhYKzY;<4;7BQ4cuOtm-(Z!FXEc*a)rlSSf87C)-ihl{#<*&fSCo6j)xRy~*B zWoaA|*VMf5k+@%p&5Yy3g%8AC(XAGomOtSpTz}ST!qiYhF{AG0*@B)$EZqGj z!m#1)JhWKo*nk`R9BN>+UQp;wxNq;F7TyoI+}*oJ8JG-V*0JF1tuY{?1q3;ub7Y`; zS3O^I)CvCYfqML?iGBFtK6P#kf0=R`)JNRq4D}v&nX{bs- zi{u0hO6p&^WPl;iHUo0vKDEJcVBq2y+)ARZdu8rZ>YOBC#+u;}lyiluVb-@d)Wmgw zkDRM-HWZ%uqktWM@C0KjK|ltnNt!5!szoViOh8da#&lP##1aR#gigk^%Nr>I*ro+U z$jG$pX?o?WzroeZknO1n0`5ip0x)O$8997crj`B zgP?V2Gw$i$gqLXP%0k^~(&24lU72WF=yJ)MH_|DjDfVRL^a${b@5ca`;di1df$|2D z9YHIX1Ls(CgWhDmvBj|*Txc4_P;;!IR^)>nEVnCwBhEZ@shaFSLSjZ75Q-eSknk2^ z0|b1S9$sSJp^K+$2)#!XC;)21wuS-WIqzqbVrhqhC-t!-A zXL?wQlbZK(`hTi;EL+VI38aeUViGoQHfU)9N^y=q_*+iy>a6A)U=4o<`E!Gaye?bP&qR=o@$K@9YJZO@tm4b4^=hu zoqe{*F{t+D@(^ml3!g2LL_Hmf7y90L*Msn4>@kBFZ#vI3zVm%mjw}zo5kD<5#)#9s z=Jw}RT(-ZUepLtGpQW1;B3;lSps2X-x2>~HhcoEsQY;rXJ9#p(vAVWW-EhrSYd7X) z@{52qw>_o|=@jO-X)9z{6A&}p#84Y6M4^!*V6dF_W9s>Len<^$f0@$O?u<&s$vMWZjOV$fxb~jl>po_x&r~j>9E>w zxe<9_l0GXAPlE=x=)R!8OFr610ozVsS6yX%((Ybvzf@r{-Qm-vMqNK#?LjZ}>GCBz z(R6$ARVyvGA_wmQqq6upb>vjEM$k5*>^O|TAL3wV_sD^#daKsXO&!jFS0k}pxI+uc zf|vC?3>#jisw)$7oQ_%E{%?B@!fy6roOBQMIno6v5gEa{ps#=v9+OQ6RbSRLB{2Ut zLR_YB3_u-xPnFDlfC1U}WN)EuhTC$N=HrsmzZ}buKC7kRa}5JQM=sBuNCVs?moZu+ zQ?|@d|Jz)RzV$k*(ft{fTtww#*rlgWrRdv|_!vRf2YGc~oP^GPGShs%YsbeWRYN6O-aj;bo4a3rvd9()3I{bXbA0riQ4Y~CRJ#u3C_3-SO)bc zr$8<88zlgBj4mxrVe%zXBPPLX3Z0wYRymp8uXW>`chq1cN>Y`SP7#1T1RxYnH&2Kb zHPA?ObSiM0&;g~e>5y;FmhaxBC(7REdMC;2@2dZ5rWz=w=U8A!ZbP?4e^GAV-%Gx~ zq-M*`emzZY`mOpW+4noOLopoS#H67iMnjo)w65mL=igJ)6*^*N(9DPp(t!ZYE+Ymt zzwz>WY96vaDV9BM0hz2s-ZTv}739W}gKBO>nT&hd=*P0g!4)dOA-+(yJ+0Qsfn|D5 zTjDE7?HqhGz*3Hu7tQ9tJ%6dUi25A-93!WK(~w43(2#POha!SJlx+*(RdYFcJficl zmd1Qdm(`M0Zp;~{|0qK9r;wHvZv0}g&~z^V-4NC)h& zHHzu*@w%?GWq=(TFfPOlgZ;IbX#D$8Ix?;gb^%SJjb61$z~ljrWF_*Bn$bY<;VwkZ zL;J6I;XJH6;x3YvtO2MrrwX)}cV3`y6CR+p)kM8h8{W=He!uHsc&MXMCMJ8gBDYM_ zXU9kdfK3@jJ{1{5WYIi-f7BW72{KvfEBh>?k(-oGDrhEEl1@lxpbUo2xqMwwzN?_f zh!CpLmOwkNR^6`kjhC7SV>H~1usOnv9(yc&R=o(wGPv((eK9*O)Bu1%h`u7H07x}H zRbOAH-}B5;JRoN7K~G@#jmk|0*0J)&}o z<}8xuh)JYC0;LVr!_8N;wa{!_0+762ix}So^_2|F3%EU5MgrKW*x?w0?qcY=jin76 zdt^tSJ}-vo298LP;w_>ayvg2kZoP5?#f_Db7`JN#%b2$!&2e)6i_v<5_afDpC8%a} z)PyGDg<+_bz*eGK%q*n~V7k)f-}a#cxSR!eldD3%oT9c%q>L}zNng4?izD~ z`F-Q!nfj~!eOa?^Wtew-7aE}?Gqj>JWf(bkiTNu`p#4R14%|=j(syYdzQ_n~&ofLl@{t))C%# zfo}9$I{P%wJH~TXT3P}nT*G@VY-89s7qVqK$p7Onf@WmBgh`&YIWi}@V7BLewqCsP ztBds1arRTq{T`cfmvif7`NaayA!)TOJ6Gs|Ak&_o(R!*oCl{{NliM4R+c<1{7L6~j z)W75iJ_Z3=5?TS|;T&n6q};YjuWy{RO7EW7NB3?jIOtm;cMB2-eWA1*xI)j`zFJRi zyj#-Wj`!hF00wiqK46NUL+an8gJdI;}iM|kWh0*X&iDL z?Lko4NcYGSL(%!icu0$OKbY-qWEKmu_YQr3pXET~s%?5LA0sqZ^pOi`GVicGkdLJI z1ne-GD|)8RnXMItc{Vr1vC!6%O?T==vpkeno5Nm3r}gl&qA#@@jmgj#^kn<7MaO!Z zWQ)Z_s%LvOI)AnY(v00uYU_G2{GpbqM zMXhHok|lSwy&+l0G2YHGvkQ&)(ch`F8pLaRR*ox7mrwjmA3x!#Ig5Lql6!xqPoA*l zqQyO1@ PJ<&_Y_jvz{xc~S+4cZ}) From b5ed27e624322b368b282c1ab7c847d6c617508c Mon Sep 17 00:00:00 2001 From: John Guibas Date: Thu, 23 May 2024 17:49:39 -0700 Subject: [PATCH 31/42] hm --- core/src/stark/verifier.rs | 14 +++++++++++++- recursion/program/src/stark.rs | 19 +++++++------------ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/core/src/stark/verifier.rs b/core/src/stark/verifier.rs index 6f5bad846d..17e3753336 100644 --- a/core/src/stark/verifier.rs +++ b/core/src/stark/verifier.rs @@ -176,7 +176,6 @@ impl>> Verifier { .map_err(|e| VerificationError::InvalidopeningArgument(e))?; // Verify the constrtaint evaluations. - for (chip, trace_domain, qc_domains, values) in izip!( chips.iter(), trace_domains, @@ -199,6 +198,12 @@ impl>> Verifier { ) .map_err(|_| VerificationError::OodEvaluationMismatch(chip.name()))?; } + + let nb_cpu_chips = chips.iter().filter(|chip| chip.name() == "CPU").count(); + if nb_cpu_chips != 1 { + return Err(VerificationError::MissingCpuChip); + } + Ok(()) } @@ -411,6 +416,7 @@ pub enum VerificationError { OodEvaluationMismatch(String), /// The shape of the opening arguments is invalid. OpeningShapeError(String, OpeningShapeError), + MissingCpuChip, } impl Debug for OpeningShapeError { @@ -474,6 +480,9 @@ impl Debug for VerificationError { VerificationError::OpeningShapeError(chip, e) => { write!(f, "Invalid opening shape for chip {}: {:?}", chip, e) } + VerificationError::MissingCpuChip => { + write!(f, "Missing CPU chip") + } } } } @@ -490,6 +499,9 @@ impl Display for VerificationError { VerificationError::OpeningShapeError(chip, e) => { write!(f, "Invalid opening shape for chip {}: {}", chip, e) } + VerificationError::MissingCpuChip => { + write!(f, "Missing CPU chip in shard") + } } } } diff --git a/recursion/program/src/stark.rs b/recursion/program/src/stark.rs index a7cdd1fb53..ebff884623 100644 --- a/recursion/program/src/stark.rs +++ b/recursion/program/src/stark.rs @@ -97,11 +97,7 @@ impl<'a, SC: StarkGenericConfig, A: MachineAir> VerifyingKeyHint<'a, SC impl StarkRecursiveVerifier for StarkMachine where C::F: TwoAdicField, - SC: StarkGenericConfig< - Val = C::F, - Challenge = C::EF, - Domain = TwoAdicMultiplicativeCoset, - >, + SC: StarkGenericConfig>, A: MachineAir + for<'a> Air>, C::F: TwoAdicField, C::EF: TwoAdicField, @@ -148,11 +144,7 @@ pub type RecursiveVerifierConstraintFolder<'a, C> = GenericVerifierConstraintFol impl StarkVerifier where C::F: TwoAdicField, - SC: StarkGenericConfig< - Val = C::F, - Challenge = C::EF, - Domain = TwoAdicMultiplicativeCoset, - >, + SC: StarkGenericConfig>, { pub fn verify_shard( builder: &mut Builder, @@ -346,14 +338,17 @@ where // TODO CONSTRAIN: that the preprocessed chips get called with verify_constraints. builder.cycle_tracker("stage-e-verify-constraints"); for (i, chip) in machine.chips().iter().enumerate() { - let chip_name = chip.name(); - tracing::debug!("verifying constraints for chip: {}", chip_name); + tracing::debug!("verifying constraints for chip: {}", chip.name()); let index = builder.get(&proof.sorted_idxs, i); if chip.preprocessed_width() > 0 { builder.assert_var_ne(index, C::N::from_canonical_usize(EMPTY)); } + if chip.name() == "CPU" { + builder.assert_var_ne(index, C::N::from_canonical_usize(EMPTY)); + } + builder .if_ne(index, C::N::from_canonical_usize(EMPTY)) .then(|builder| { From e1cf7800efe5827db38c5ecd25da36dcecfd7943 Mon Sep 17 00:00:00 2001 From: John Guibas Date: Thu, 23 May 2024 17:58:41 -0700 Subject: [PATCH 32/42] chore: remove unecessary todos in recursion --- recursion/circuit/src/utils.rs | 1 - recursion/compiler/src/ir/types.rs | 1 - recursion/core/src/poseidon2_wide/mod.rs | 1 - recursion/core/src/runtime/mod.rs | 6 +++--- recursion/program/src/fri/two_adic_pcs.rs | 1 - recursion/program/src/utils.rs | 2 +- 6 files changed, 4 insertions(+), 8 deletions(-) diff --git a/recursion/circuit/src/utils.rs b/recursion/circuit/src/utils.rs index 56943d67c3..371e694395 100644 --- a/recursion/circuit/src/utils.rs +++ b/recursion/circuit/src/utils.rs @@ -3,7 +3,6 @@ use sp1_core::air::Word; use sp1_recursion_compiler::ir::{Builder, Config, Felt, Var}; use sp1_recursion_core::runtime::DIGEST_SIZE; -// TODO: this can be done much more efficiently, but in the meantime this should work pub fn felt2var(builder: &mut Builder, felt: Felt) -> Var { let bits = builder.num2bits_f(felt); builder.bits2num_v(&bits) diff --git a/recursion/compiler/src/ir/types.rs b/recursion/compiler/src/ir/types.rs index 4ce05c9a74..c30c8fa4a4 100644 --- a/recursion/compiler/src/ir/types.rs +++ b/recursion/compiler/src/ir/types.rs @@ -857,7 +857,6 @@ impl MemVariable for Felt { } impl> Ext { - // Todo: refactor base fn assign_with_caches>( &self, src: SymbolicExt, diff --git a/recursion/core/src/poseidon2_wide/mod.rs b/recursion/core/src/poseidon2_wide/mod.rs index dddb612e3f..f5531bad84 100644 --- a/recursion/core/src/poseidon2_wide/mod.rs +++ b/recursion/core/src/poseidon2_wide/mod.rs @@ -16,7 +16,6 @@ pub struct Poseidon2Event { pub input: [F; WIDTH], } -// TODO: Make this public inside Plonky3 and import directly. pub fn apply_m_4(x: &mut [AF]) where AF: AbstractField, diff --git a/recursion/core/src/runtime/mod.rs b/recursion/core/src/runtime/mod.rs index a37ce6858c..138a3f6a2c 100644 --- a/recursion/core/src/runtime/mod.rs +++ b/recursion/core/src/runtime/mod.rs @@ -107,7 +107,7 @@ pub struct Runtime, Diffusion> { /// Uninitialized memory addresses that have a specific value they should be initialized with. /// The Opcodes that start with Hint* utilize this to set memory values. - pub uninitialized_memory: HashMap>, // TODO: add "HashNoHasher" back to this + pub uninitialized_memory: HashMap>, /// The execution record. pub record: ExecutionRecord, @@ -653,8 +653,8 @@ where let f_i = F::from_canonical_u32(i as u32); let left_val = self.mr(left + f_i, timestamp); let right_val = self.mr(right + f_i, timestamp); - left_array[i] = left_val.1 .0[0]; - right_array[i] = right_val.1 .0[0]; + left_array[i] = left_val.1.0[0]; + right_array[i] = right_val.1.0[0]; left_records.push(left_val.0); right_records.push(right_val.0); } diff --git a/recursion/program/src/fri/two_adic_pcs.rs b/recursion/program/src/fri/two_adic_pcs.rs index 71b361f8ef..aee46cfd28 100644 --- a/recursion/program/src/fri/two_adic_pcs.rs +++ b/recursion/program/src/fri/two_adic_pcs.rs @@ -245,7 +245,6 @@ where self.config.get_subgroup(builder, log_degree) } - // Todo: change TwoAdicPcsRoundVariable to RoundVariable fn verify( &self, builder: &mut Builder, diff --git a/recursion/program/src/utils.rs b/recursion/program/src/utils.rs index e6f621f508..9122957b14 100644 --- a/recursion/program/src/utils.rs +++ b/recursion/program/src/utils.rs @@ -81,7 +81,7 @@ pub fn clone_array>( new_arr } -// TODO: this can be done much more efficiently, but in the meantime this should work +// OPT: this can be done much more efficiently, but in the meantime this should work pub fn felt2var(builder: &mut Builder, felt: Felt) -> Var { let bits = builder.num2bits_f(felt); builder.bits2num_v(&bits) From 5eaf60504c9e34b51714f8ce9b570498559f50c0 Mon Sep 17 00:00:00 2001 From: John Guibas Date: Thu, 23 May 2024 18:00:27 -0700 Subject: [PATCH 33/42] clippy --- recursion/program/src/stark.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/recursion/program/src/stark.rs b/recursion/program/src/stark.rs index ebff884623..7e4ccc6e06 100644 --- a/recursion/program/src/stark.rs +++ b/recursion/program/src/stark.rs @@ -97,7 +97,11 @@ impl<'a, SC: StarkGenericConfig, A: MachineAir> VerifyingKeyHint<'a, SC impl StarkRecursiveVerifier for StarkMachine where C::F: TwoAdicField, - SC: StarkGenericConfig>, + SC: StarkGenericConfig< + Val = C::F, + Challenge = C::EF, + Domain = TwoAdicMultiplicativeCoset, + >, A: MachineAir + for<'a> Air>, C::F: TwoAdicField, C::EF: TwoAdicField, @@ -144,7 +148,11 @@ pub type RecursiveVerifierConstraintFolder<'a, C> = GenericVerifierConstraintFol impl StarkVerifier where C::F: TwoAdicField, - SC: StarkGenericConfig>, + SC: StarkGenericConfig< + Val = C::F, + Challenge = C::EF, + Domain = TwoAdicMultiplicativeCoset, + >, { pub fn verify_shard( builder: &mut Builder, From f4cdbdad2186e81de7102a2c11fc40358b77f1dd Mon Sep 17 00:00:00 2001 From: Kevin Jue Date: Thu, 23 May 2024 18:03:51 -0700 Subject: [PATCH 34/42] clippy fixes --- recursion/core/src/runtime/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recursion/core/src/runtime/mod.rs b/recursion/core/src/runtime/mod.rs index 138a3f6a2c..1935c9cd69 100644 --- a/recursion/core/src/runtime/mod.rs +++ b/recursion/core/src/runtime/mod.rs @@ -653,8 +653,8 @@ where let f_i = F::from_canonical_u32(i as u32); let left_val = self.mr(left + f_i, timestamp); let right_val = self.mr(right + f_i, timestamp); - left_array[i] = left_val.1.0[0]; - right_array[i] = right_val.1.0[0]; + left_array[i] = left_val.1 .0[0]; + right_array[i] = right_val.1 .0[0]; left_records.push(left_val.0); right_records.push(right_val.0); } From 91187e1208eef75da236c85febea63b2fae0629d Mon Sep 17 00:00:00 2001 From: John Guibas Date: Thu, 23 May 2024 18:07:13 -0700 Subject: [PATCH 35/42] pin new p3 --- Cargo.lock | 40 ++++++++++++++++++++-------------------- Cargo.toml | 36 ++++++++++++++++++------------------ 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b50ed368ff..74715b7373 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2864,7 +2864,7 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "p3-air" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-field", "p3-matrix", @@ -2873,7 +2873,7 @@ dependencies = [ [[package]] name = "p3-baby-bear" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "num-bigint 0.4.5", "p3-field", @@ -2887,7 +2887,7 @@ dependencies = [ [[package]] name = "p3-blake3" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "blake3", "p3-symmetric", @@ -2896,7 +2896,7 @@ dependencies = [ [[package]] name = "p3-bn254-fr" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "ff 0.13.0", "num-bigint 0.4.5", @@ -2910,7 +2910,7 @@ dependencies = [ [[package]] name = "p3-challenger" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-field", "p3-maybe-rayon", @@ -2922,7 +2922,7 @@ dependencies = [ [[package]] name = "p3-commit" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-challenger", @@ -2935,7 +2935,7 @@ dependencies = [ [[package]] name = "p3-dft" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-field", "p3-matrix", @@ -2947,7 +2947,7 @@ dependencies = [ [[package]] name = "p3-field" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "num-bigint 0.4.5", @@ -2960,7 +2960,7 @@ dependencies = [ [[package]] name = "p3-fri" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-challenger", @@ -2978,7 +2978,7 @@ dependencies = [ [[package]] name = "p3-interpolation" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-field", "p3-matrix", @@ -2988,7 +2988,7 @@ dependencies = [ [[package]] name = "p3-keccak" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-symmetric", "tiny-keccak", @@ -2997,7 +2997,7 @@ dependencies = [ [[package]] name = "p3-keccak-air" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-air", "p3-field", @@ -3010,7 +3010,7 @@ dependencies = [ [[package]] name = "p3-matrix" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-field", @@ -3024,7 +3024,7 @@ dependencies = [ [[package]] name = "p3-maybe-rayon" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "rayon", ] @@ -3032,7 +3032,7 @@ dependencies = [ [[package]] name = "p3-mds" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-dft", @@ -3046,7 +3046,7 @@ dependencies = [ [[package]] name = "p3-merkle-tree" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-commit", @@ -3062,7 +3062,7 @@ dependencies = [ [[package]] name = "p3-poseidon2" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "gcd", "p3-field", @@ -3074,7 +3074,7 @@ dependencies = [ [[package]] name = "p3-symmetric" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-field", @@ -3084,7 +3084,7 @@ dependencies = [ [[package]] name = "p3-uni-stark" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-air", @@ -3102,7 +3102,7 @@ dependencies = [ [[package]] name = "p3-util" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "serde", ] diff --git a/Cargo.toml b/Cargo.toml index 999ba20936..d88f8b7a60 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,26 +30,26 @@ debug = true debug-assertions = true [workspace.dependencies] -p3-air = { git = "https://github.com/Plonky3/Plonky3.git", branch = "sp1" } -p3-field = { git = "https://github.com/Plonky3/Plonky3.git", branch = "sp1" } -p3-commit = { git = "https://github.com/Plonky3/Plonky3.git", branch = "sp1" } -p3-matrix = { git = "https://github.com/Plonky3/Plonky3.git", branch = "sp1" } +p3-air = { git = "https://github.com/Plonky3/Plonky3.git", rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } +p3-field = { git = "https://github.com/Plonky3/Plonky3.git", rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } +p3-commit = { git = "https://github.com/Plonky3/Plonky3.git", rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } +p3-matrix = { git = "https://github.com/Plonky3/Plonky3.git", rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } p3-baby-bear = { git = "https://github.com/Plonky3/Plonky3.git", features = [ "nightly-features", -], branch = "sp1" } -p3-util = { git = "https://github.com/Plonky3/Plonky3.git", branch = "sp1" } -p3-challenger = { git = "https://github.com/Plonky3/Plonky3.git", branch = "sp1" } -p3-dft = { git = "https://github.com/Plonky3/Plonky3.git", branch = "sp1" } -p3-fri = { git = "https://github.com/Plonky3/Plonky3.git", branch = "sp1" } -p3-keccak = { git = "https://github.com/Plonky3/Plonky3.git", branch = "sp1" } -p3-keccak-air = { git = "https://github.com/Plonky3/Plonky3.git", branch = "sp1" } -p3-blake3 = { git = "https://github.com/Plonky3/Plonky3.git", branch = "sp1" } -p3-merkle-tree = { git = "https://github.com/Plonky3/Plonky3.git", branch = "sp1" } -p3-poseidon2 = { git = "https://github.com/Plonky3/Plonky3.git", branch = "sp1" } -p3-symmetric = { git = "https://github.com/Plonky3/Plonky3.git", branch = "sp1" } -p3-uni-stark = { git = "https://github.com/Plonky3/Plonky3.git", branch = "sp1" } -p3-maybe-rayon = { git = "https://github.com/Plonky3/Plonky3.git", branch = "sp1" } -p3-bn254-fr = { git = "https://github.com/Plonky3/Plonky3.git", branch = "sp1" } +], rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } +p3-util = { git = "https://github.com/Plonky3/Plonky3.git", rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } +p3-challenger = { git = "https://github.com/Plonky3/Plonky3.git", rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } +p3-dft = { git = "https://github.com/Plonky3/Plonky3.git", rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } +p3-fri = { git = "https://github.com/Plonky3/Plonky3.git", rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } +p3-keccak = { git = "https://github.com/Plonky3/Plonky3.git", rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } +p3-keccak-air = { git = "https://github.com/Plonky3/Plonky3.git", rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } +p3-blake3 = { git = "https://github.com/Plonky3/Plonky3.git", rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } +p3-merkle-tree = { git = "https://github.com/Plonky3/Plonky3.git", rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } +p3-poseidon2 = { git = "https://github.com/Plonky3/Plonky3.git", rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } +p3-symmetric = { git = "https://github.com/Plonky3/Plonky3.git", rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } +p3-uni-stark = { git = "https://github.com/Plonky3/Plonky3.git", rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } +p3-maybe-rayon = { git = "https://github.com/Plonky3/Plonky3.git", rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } +p3-bn254-fr = { git = "https://github.com/Plonky3/Plonky3.git", rev = "3b5265f9d5af36534a46caebf0617595cfb42c5a" } # For local development. From 7b29a1572500ab449e57b7925f8e7c6b05d565e2 Mon Sep 17 00:00:00 2001 From: John Guibas Date: Mon, 27 May 2024 14:44:40 -0700 Subject: [PATCH 36/42] feat: sp1 core prover opts --- core/benches/main.rs | 5 +- core/src/cpu/trace.rs | 4 +- core/src/lookup/debug.rs | 4 +- core/src/memory/global.rs | 10 +-- core/src/runtime/io.rs | 6 +- core/src/runtime/mod.rs | 68 ++++++++++--------- core/src/runtime/record.rs | 4 +- core/src/stark/machine.rs | 13 +++- core/src/stark/prover.rs | 26 ++++--- core/src/syscall/hint.rs | 4 +- core/src/syscall/precompiles/keccak256/air.rs | 4 +- core/src/syscall/precompiles/keccak256/mod.rs | 4 +- core/src/utils/env.rs | 48 ------------- core/src/utils/mod.rs | 3 +- core/src/utils/options.rs | 26 +++++++ core/src/utils/prove.rs | 31 +++++---- eval/src/main.rs | 13 ++-- prover/src/lib.rs | 46 ++++--------- prover/src/utils.rs | 5 +- recursion/circuit/src/constraints.rs | 16 +++-- recursion/program/src/constraints.rs | 11 ++- recursion/program/src/machine/mod.rs | 21 ++++-- recursion/program/src/stark.rs | 30 ++++---- sdk/src/provers/network.rs | 4 +- 24 files changed, 217 insertions(+), 189 deletions(-) delete mode 100644 core/src/utils/env.rs create mode 100644 core/src/utils/options.rs diff --git a/core/benches/main.rs b/core/benches/main.rs index ee8094ecc3..f40f3db01a 100644 --- a/core/benches/main.rs +++ b/core/benches/main.rs @@ -4,7 +4,7 @@ use criterion::{black_box, criterion_group, criterion_main, Criterion}; use sp1_core::io::SP1Stdin; use sp1_core::runtime::{Program, Runtime}; -use sp1_core::utils::{prove, BabyBearPoseidon2}; +use sp1_core::utils::{prove, BabyBearPoseidon2, SP1CoreOpts}; #[allow(unreachable_code)] pub fn criterion_benchmark(c: &mut Criterion) { @@ -15,7 +15,7 @@ pub fn criterion_benchmark(c: &mut Criterion) { let elf_path = format!("../programs/demo/{}/elf/riscv32im-succinct-zkvm-elf", p); let program = Program::from_elf(&elf_path); let cycles = { - let mut runtime = Runtime::new(program.clone()); + let mut runtime = Runtime::new(program.clone(), SP1CoreOpts::default()); runtime.run().unwrap(); runtime.state.global_clk }; @@ -27,6 +27,7 @@ pub fn criterion_benchmark(c: &mut Criterion) { black_box(program.clone()), &SP1Stdin::new(), BabyBearPoseidon2::new(), + SP1CoreOpts::default(), ) }) }, diff --git a/core/src/cpu/trace.rs b/core/src/cpu/trace.rs index aa71f130f5..b65c4e43ca 100644 --- a/core/src/cpu/trace.rs +++ b/core/src/cpu/trace.rs @@ -641,7 +641,7 @@ mod tests { use super::*; use crate::runtime::{tests::simple_program, Instruction, Runtime}; - use crate::utils::{run_test, setup_logger}; + use crate::utils::{run_test, setup_logger, SP1CoreOpts}; #[test] fn generate_trace() { @@ -679,7 +679,7 @@ mod tests { #[test] fn generate_trace_simple_program() { let program = simple_program(); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); let chip = CpuChip::default(); let trace: RowMajorMatrix = diff --git a/core/src/lookup/debug.rs b/core/src/lookup/debug.rs index c58d882b7e..f8962c5769 100644 --- a/core/src/lookup/debug.rs +++ b/core/src/lookup/debug.rs @@ -210,7 +210,7 @@ mod test { lookup::InteractionKind, runtime::{Program, Runtime, ShardingConfig}, stark::RiscvAir, - utils::{setup_logger, tests::UINT256_MUL_ELF, BabyBearPoseidon2}, + utils::{setup_logger, tests::UINT256_MUL_ELF, BabyBearPoseidon2, SP1CoreOpts}, }; use super::debug_interactions_with_all_chips; @@ -222,7 +222,7 @@ mod test { let config = BabyBearPoseidon2::new(); let machine = RiscvAir::machine(config); let (pk, _) = machine.setup(&program); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); let shards = machine.shard(runtime.record, &ShardingConfig::default()); let ok = diff --git a/core/src/memory/global.rs b/core/src/memory/global.rs index 60a27b0277..3786dd4ca1 100644 --- a/core/src/memory/global.rs +++ b/core/src/memory/global.rs @@ -177,14 +177,14 @@ mod tests { use crate::stark::MachineRecord; use crate::stark::{RiscvAir, StarkGenericConfig}; use crate::syscall::precompiles::sha256::extend_tests::sha_extend_program; - use crate::utils::{setup_logger, BabyBearPoseidon2}; + use crate::utils::{setup_logger, BabyBearPoseidon2, SP1CoreOpts}; use crate::utils::{uni_stark_prove as prove, uni_stark_verify as verify}; use p3_baby_bear::BabyBear; #[test] fn test_memory_generate_trace() { let program = simple_program(); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); let shard = runtime.record.clone(); @@ -210,7 +210,7 @@ mod tests { let mut challenger = config.challenger(); let program = simple_program(); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); let chip = MemoryChip::new(MemoryChipType::Initialize); @@ -228,7 +228,7 @@ mod tests { setup_logger(); let program = sha_extend_program(); let program_clone = program.clone(); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); let machine: crate::stark::StarkMachine> = RiscvAir::machine(BabyBearPoseidon2::new()); @@ -251,7 +251,7 @@ mod tests { setup_logger(); let program = sha_extend_program(); let program_clone = program.clone(); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); let machine = RiscvAir::machine(BabyBearPoseidon2::new()); let (pkey, _) = machine.setup(&program_clone); diff --git a/core/src/runtime/io.rs b/core/src/runtime/io.rs index 0be9da0e14..f404a8a554 100644 --- a/core/src/runtime/io.rs +++ b/core/src/runtime/io.rs @@ -60,7 +60,7 @@ pub mod tests { use super::*; use crate::runtime::Program; use crate::utils::tests::IO_ELF; - use crate::utils::{self, prove_simple, BabyBearBlake3}; + use crate::utils::{self, prove_simple, BabyBearBlake3, SP1CoreOpts}; use serde::Deserialize; #[derive(Serialize, Deserialize, Debug, PartialEq)] @@ -89,7 +89,7 @@ pub mod tests { fn test_io_run() { utils::setup_logger(); let program = Program::from(IO_ELF); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); let points = points(); runtime.write_stdin(&points.0); runtime.write_stdin(&points.1); @@ -109,7 +109,7 @@ pub mod tests { fn test_io_prove() { utils::setup_logger(); let program = Program::from(IO_ELF); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); let points = points(); runtime.write_stdin(&points.0); runtime.write_stdin(&points.1); diff --git a/core/src/runtime/mod.rs b/core/src/runtime/mod.rs index b2c81fbb49..2a73cf5dac 100644 --- a/core/src/runtime/mod.rs +++ b/core/src/runtime/mod.rs @@ -31,7 +31,7 @@ use thiserror::Error; use crate::bytes::NUM_BYTE_LOOKUP_CHANNELS; use crate::memory::MemoryInitializeFinalizeEvent; -use crate::utils::env; +use crate::utils::SP1CoreOpts; use crate::{alu::AluEvent, cpu::CpuEvent}; /// An implementation of a runtime for the SP1 RISC-V zkVM. @@ -99,7 +99,7 @@ pub enum ExecutionError { impl Runtime { // Create a new runtime from a program. - pub fn new(program: Program) -> Self { + pub fn new(program: Program, opts: SP1CoreOpts) -> Self { // Create a shared reference to the program. let program = Arc::new(program); @@ -125,14 +125,13 @@ impl Runtime { .max() .unwrap_or(0); - let shard_size = env::shard_size() as u32; Self { record, state: ExecutionState::new(program.pc_start), program, memory_accesses: MemoryAccessRecord::default(), - shard_size: shard_size * 4, - shard_batch_size: env::shard_batch_size() as u32, + shard_size: (opts.shard_size as u32) * 4, + shard_batch_size: opts.shard_batch_size as u32, cycle_tracker: HashMap::new(), io_buf: HashMap::new(), trace_buf, @@ -145,8 +144,8 @@ impl Runtime { } /// Recover runtime state from a program and existing execution state. - pub fn recover(program: Program, state: ExecutionState) -> Self { - let mut runtime = Self::new(program); + pub fn recover(program: Program, state: ExecutionState, opts: SP1CoreOpts) -> Self { + let mut runtime = Self::new(program, opts); runtime.state = state; let index: u32 = (runtime.state.global_clk / (runtime.shard_size / 4) as u64) .try_into() @@ -1074,7 +1073,10 @@ pub mod tests { use crate::{ runtime::Register, - utils::tests::{FIBONACCI_ELF, PANIC_ELF, SSZ_WITHDRAWALS_ELF}, + utils::{ + tests::{FIBONACCI_ELF, PANIC_ELF, SSZ_WITHDRAWALS_ELF}, + SP1CoreOpts, + }, }; use super::{Instruction, Opcode, Program, Runtime}; @@ -1103,7 +1105,7 @@ pub mod tests { #[test] fn test_simple_program_run() { let program = simple_program(); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 42); } @@ -1112,7 +1114,7 @@ pub mod tests { #[should_panic] fn test_panic() { let program = panic_program(); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); } @@ -1128,7 +1130,7 @@ pub mod tests { Instruction::new(Opcode::ADD, 31, 30, 29, false, false), ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 42); } @@ -1145,7 +1147,7 @@ pub mod tests { ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 32); } @@ -1162,7 +1164,7 @@ pub mod tests { ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 32); } @@ -1179,7 +1181,7 @@ pub mod tests { ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 37); @@ -1197,7 +1199,7 @@ pub mod tests { ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 5); } @@ -1214,7 +1216,7 @@ pub mod tests { ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 1184); } @@ -1231,7 +1233,7 @@ pub mod tests { ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 1); } @@ -1248,7 +1250,7 @@ pub mod tests { ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 1); } @@ -1265,7 +1267,7 @@ pub mod tests { ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 0); } @@ -1282,7 +1284,7 @@ pub mod tests { ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 0); } @@ -1299,7 +1301,7 @@ pub mod tests { ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 84); } @@ -1315,7 +1317,7 @@ pub mod tests { Instruction::new(Opcode::ADD, 31, 30, 4, false, true), ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 5 - 1 + 4); } @@ -1331,7 +1333,7 @@ pub mod tests { Instruction::new(Opcode::XOR, 31, 30, 42, false, true), ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 10); } @@ -1347,7 +1349,7 @@ pub mod tests { Instruction::new(Opcode::OR, 31, 30, 42, false, true), ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 47); } @@ -1363,7 +1365,7 @@ pub mod tests { Instruction::new(Opcode::AND, 31, 30, 42, false, true), ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 0); } @@ -1377,7 +1379,7 @@ pub mod tests { Instruction::new(Opcode::SLL, 31, 29, 4, false, true), ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 80); } @@ -1391,7 +1393,7 @@ pub mod tests { Instruction::new(Opcode::SRL, 31, 29, 4, false, true), ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 2); } @@ -1405,7 +1407,7 @@ pub mod tests { Instruction::new(Opcode::SRA, 31, 29, 4, false, true), ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 2); } @@ -1419,7 +1421,7 @@ pub mod tests { Instruction::new(Opcode::SLT, 31, 29, 37, false, true), ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 0); } @@ -1433,7 +1435,7 @@ pub mod tests { Instruction::new(Opcode::SLTU, 31, 29, 37, false, true), ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.register(Register::X31), 0); } @@ -1452,7 +1454,7 @@ pub mod tests { Instruction::new(Opcode::JALR, 5, 11, 8, false, true), ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.registers()[Register::X5 as usize], 8); assert_eq!(runtime.registers()[Register::X11 as usize], 100); @@ -1466,7 +1468,7 @@ pub mod tests { Instruction::new(opcode, 12, 10, 11, false, false), ]; let program = Program::new(instructions, 0, 0); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); assert_eq!(runtime.registers()[Register::X12 as usize], expected); } @@ -1684,7 +1686,7 @@ pub mod tests { #[test] fn test_simple_memory_program_run() { let program = simple_memory_program(); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); // Assert SW & LW case diff --git a/core/src/runtime/record.rs b/core/src/runtime/record.rs index 83210fcb22..67a2464f99 100644 --- a/core/src/runtime/record.rs +++ b/core/src/runtime/record.rs @@ -24,7 +24,7 @@ use crate::syscall::precompiles::sha256::{ShaCompressEvent, ShaExtendEvent}; use crate::syscall::precompiles::uint256::Uint256MulEvent; use crate::syscall::precompiles::ECDecompressEvent; use crate::syscall::precompiles::{ECAddEvent, ECDoubleEvent}; -use crate::utils::env; +use crate::utils::SP1CoreOpts; /// A record of the execution of a program. Contains event data for everything that happened during /// the execution of the shard. @@ -134,7 +134,7 @@ impl ShardingConfig { impl Default for ShardingConfig { fn default() -> Self { - let shard_size = env::shard_size(); + let shard_size = SP1CoreOpts::default().shard_size; Self { shard_size, add_len: shard_size, diff --git a/core/src/stark/machine.rs b/core/src/stark/machine.rs index 871f7b8e48..b00d69c062 100644 --- a/core/src/stark/machine.rs +++ b/core/src/stark/machine.rs @@ -30,6 +30,7 @@ use crate::stark::DebugConstraintBuilder; use crate::stark::ProverConstraintFolder; use crate::stark::ShardProof; use crate::stark::VerifierConstraintFolder; +use crate::utils::SP1CoreOpts; use super::Chip; use super::Com; @@ -273,6 +274,7 @@ impl>> StarkMachine { pk: &StarkProvingKey, record: A::Record, challenger: &mut SC::Challenger, + opts: SP1CoreOpts, ) -> MachineProof where A: for<'a> Air> @@ -284,7 +286,7 @@ impl>> StarkMachine { .in_scope(|| self.shard(record, &::Config::default())); tracing::info_span!("prove_shards") - .in_scope(|| P::prove_shards(self, pk, shards, challenger)) + .in_scope(|| P::prove_shards(self, pk, shards, challenger, opts)) } pub const fn config(&self) -> &SC { @@ -529,6 +531,7 @@ pub mod tests { use crate::utils::run_test; use crate::utils::setup_logger; use crate::utils::BabyBearPoseidon2; + use crate::utils::SP1CoreOpts; #[test] fn test_simple_prove() { @@ -676,7 +679,13 @@ pub mod tests { setup_logger(); let program = fibonacci_program(); let stdin = SP1Stdin::new(); - prove(program, &stdin, BabyBearPoseidon2::new()).unwrap(); + prove( + program, + &stdin, + BabyBearPoseidon2::new(), + SP1CoreOpts::default(), + ) + .unwrap(); } #[test] diff --git a/core/src/stark/prover.rs b/core/src/stark/prover.rs index 2ca5237e09..4a65b38794 100644 --- a/core/src/stark/prover.rs +++ b/core/src/stark/prover.rs @@ -27,7 +27,7 @@ use crate::stark::record::MachineRecord; use crate::stark::MachineChip; use crate::stark::PackedChallenge; use crate::stark::ProverConstraintFolder; -use crate::utils::env; +use crate::utils::SP1CoreOpts; fn chunk_vec(mut vec: Vec, chunk_size: usize) -> Vec> { let mut result = Vec::new(); @@ -45,6 +45,7 @@ pub trait Prover>> { pk: &StarkProvingKey, shards: Vec, challenger: &mut SC::Challenger, + opts: SP1CoreOpts, ) -> MachineProof where A: for<'a> Air> @@ -68,6 +69,7 @@ where pk: &StarkProvingKey, shards: Vec, challenger: &mut SC::Challenger, + opts: SP1CoreOpts, ) -> MachineProof where A: for<'a> Air> @@ -77,7 +79,7 @@ where // Observe the preprocessed commitment. pk.observe_into(challenger); // Generate and commit the traces for each segment. - let (shard_commits, shard_data) = Self::commit_shards(machine, &shards); + let (shard_commits, shard_data) = Self::commit_shards(machine, &shards, opts); // Observe the challenges for each segment. tracing::debug_span!("observing all challenges").in_scope(|| { @@ -95,10 +97,10 @@ where // Generate a proof for each segment. Note that we clone the challenger so we can observe // identical global challenges across the segments. - let chunking_multiplier = env::shard_chunking_multiplier(); + let chunking_multiplier = opts.shard_chunking_multiplier; let chunk_size = std::cmp::max(chunking_multiplier * shards.len() / num_cpus::get(), 1); let config = machine.config(); - let reconstruct_commitments = env::reconstruct_commitments(); + let reconstruct_commitments = opts.reconstruct_commitments; let shard_data_chunks = chunk_vec(shard_data, chunk_size); let shard_chunks = chunk_vec(shards, chunk_size); let parent_span = tracing::debug_span!("open_shards"); @@ -144,7 +146,10 @@ where } } -pub struct LocalProver(PhantomData, PhantomData); +pub struct LocalProver { + pub opts: SP1CoreOpts, + pub _phantom: PhantomData<(SC, A)>, +} impl LocalProver where @@ -464,8 +469,12 @@ where }); // Collect the opened values for each chip. - let [preprocessed_values, main_values, permutation_values, mut quotient_values] = - openings.try_into().unwrap(); + let [ + preprocessed_values, + main_values, + permutation_values, + mut quotient_values, + ] = openings.try_into().unwrap(); assert!(main_values.len() == chips.len()); let preprocessed_opened_values = preprocessed_values .into_iter() @@ -543,6 +552,7 @@ where pub fn commit_shards( machine: &StarkMachine, shards: &[A::Record], + opts: SP1CoreOpts, ) -> (Vec>, Vec>) where F: PrimeField32, @@ -556,7 +566,7 @@ where // Get the number of shards that is the threshold for saving shards to disk instead of // keeping all the shards in memory. - let reconstruct_commitments = env::reconstruct_commitments(); + let reconstruct_commitments = opts.reconstruct_commitments; let finished = AtomicU32::new(0); let chunk_size = std::cmp::max(shards.len() / num_cpus::get(), 1); let parent_span = tracing::debug_span!("commit to all shards"); diff --git a/core/src/syscall/hint.rs b/core/src/syscall/hint.rs index c6eb31ef9b..8cf8a2d614 100644 --- a/core/src/syscall/hint.rs +++ b/core/src/syscall/hint.rs @@ -75,7 +75,7 @@ mod tests { use crate::{ io::SP1Stdin, runtime::Program, - utils::{prove, setup_logger, BabyBearPoseidon2}, + utils::{prove, setup_logger, BabyBearPoseidon2, SP1CoreOpts}, }; const HINT_IO_ELF: &[u8] = @@ -96,6 +96,6 @@ mod tests { let program = Program::from(HINT_IO_ELF); let config = BabyBearPoseidon2::new(); - prove(program, &stdin, config).unwrap(); + prove(program, &stdin, config, SP1CoreOpts::default()).unwrap(); } } diff --git a/core/src/syscall/precompiles/keccak256/air.rs b/core/src/syscall/precompiles/keccak256/air.rs index 8be89ce65b..9e67c12490 100644 --- a/core/src/syscall/precompiles/keccak256/air.rs +++ b/core/src/syscall/precompiles/keccak256/air.rs @@ -136,6 +136,7 @@ mod test { use crate::io::{SP1PublicValues, SP1Stdin}; use crate::runtime::Program; use crate::stark::{RiscvAir, StarkGenericConfig}; + use crate::utils::SP1CoreOpts; use crate::utils::{prove, setup_logger, tests::KECCAK256_ELF, BabyBearPoseidon2}; use rand::Rng; @@ -171,7 +172,8 @@ mod test { let config = BabyBearPoseidon2::new(); let program = Program::from(KECCAK256_ELF); - let (proof, public_values) = prove(program, &stdin, config).unwrap(); + let (proof, public_values) = + prove(program, &stdin, config, SP1CoreOpts::default()).unwrap(); let mut public_values = SP1PublicValues::from(&public_values); let config = BabyBearPoseidon2::new(); diff --git a/core/src/syscall/precompiles/keccak256/mod.rs b/core/src/syscall/precompiles/keccak256/mod.rs index f5091b8b4e..4110707a83 100644 --- a/core/src/syscall/precompiles/keccak256/mod.rs +++ b/core/src/syscall/precompiles/keccak256/mod.rs @@ -40,7 +40,7 @@ impl KeccakPermuteChip { #[cfg(test)] pub mod permute_tests { use crate::runtime::SyscallCode; - use crate::utils::run_test; + use crate::utils::{run_test, SP1CoreOpts}; use crate::{ runtime::{Instruction, Opcode, Program, Runtime}, utils::{self, tests::KECCAK_PERMUTE_ELF}, @@ -75,7 +75,7 @@ pub mod permute_tests { pub fn test_keccak_permute_program_execute() { utils::setup_logger(); let program = keccak_permute_program(); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); } diff --git a/core/src/utils/env.rs b/core/src/utils/env.rs deleted file mode 100644 index 2ee11fef53..0000000000 --- a/core/src/utils/env.rs +++ /dev/null @@ -1,48 +0,0 @@ -use crate::utils::log2_strict_usize; - -pub const MAX_SHARD_CLK: usize = (1 << 24) - 1; - -/// Gets the number of rows which by default should be used for each chip to maximize padding. -pub fn shard_size() -> usize { - let value = match std::env::var("SHARD_SIZE") { - Ok(val) => val.parse().unwrap(), - Err(_) => 1 << 22, - }; - - if value > MAX_SHARD_CLK { - panic!( - "Shard size must be at most 2^{} - 1", - log2_strict_usize(MAX_SHARD_CLK + 1) - ); - } - - assert!(value != 0 && (value & (value - 1)) == 0); - value -} - -/// A constant used to determine how many shards get chunked per core on the CPU. -pub fn shard_chunking_multiplier() -> usize { - match std::env::var("SHARD_CHUNKING_MULTIPLIER") { - Ok(val) => val.parse().unwrap(), - Err(_) => 1, - } -} - -/// Gets the flag for whether to recreate the shard commitments instead of saving them to disk. -pub fn reconstruct_commitments() -> bool { - match std::env::var("RECONSTRUCT_COMMITMENTS") { - Ok(val) => val == "true", - Err(_) => true, - } -} - -/// Gets the max number of shards that can go in one batch. If set to 0, there will only be 1 batch. -/// -/// The prover will generate the events for a whole batch at once, so this param should be the -/// largest number of shards that can be executed and proven at once, subject to memory constraints. -pub fn shard_batch_size() -> u32 { - match std::env::var("SHARD_BATCH_SIZE") { - Ok(val) => val.parse().unwrap(), - Err(_) => 128, - } -} diff --git a/core/src/utils/mod.rs b/core/src/utils/mod.rs index 0ab8a5ceea..3632cde1b8 100644 --- a/core/src/utils/mod.rs +++ b/core/src/utils/mod.rs @@ -1,8 +1,8 @@ mod buffer; mod config; pub mod ec; -pub mod env; mod logger; +mod options; mod programs; mod prove; mod tracer; @@ -10,6 +10,7 @@ mod tracer; pub use buffer::*; pub use config::*; pub use logger::*; +pub use options::*; pub use prove::*; pub use tracer::*; diff --git a/core/src/utils/options.rs b/core/src/utils/options.rs new file mode 100644 index 0000000000..432029baec --- /dev/null +++ b/core/src/utils/options.rs @@ -0,0 +1,26 @@ +#[derive(Debug, Clone, Copy)] +pub struct SP1CoreOpts { + pub shard_size: usize, + pub shard_batch_size: usize, + pub shard_chunking_multiplier: usize, + pub reconstruct_commitments: bool, +} + +impl Default for SP1CoreOpts { + fn default() -> Self { + Self { + shard_size: 1 << 22, + shard_batch_size: 16, + shard_chunking_multiplier: 1, + reconstruct_commitments: false, + } + } +} + +impl SP1CoreOpts { + pub fn recursion() -> Self { + let mut opts = Self::default(); + opts.reconstruct_commitments = false; + opts + } +} diff --git a/core/src/utils/prove.rs b/core/src/utils/prove.rs index 7b90d43f04..62eaf8b902 100644 --- a/core/src/utils/prove.rs +++ b/core/src/utils/prove.rs @@ -24,7 +24,7 @@ use crate::stark::Val; use crate::stark::VerifierConstraintFolder; use crate::stark::{Com, PcsProverData, RiscvAir, ShardProof, StarkProvingKey, UniConfig}; use crate::stark::{MachineRecord, StarkMachine}; -use crate::utils::env; +use crate::utils::SP1CoreOpts; use crate::{ runtime::{Program, Runtime}, stark::StarkGenericConfig, @@ -62,7 +62,12 @@ where // Prove the program. let mut challenger = machine.config().challenger(); let proving_start = Instant::now(); - let proof = machine.prove::>(&pk, runtime.record, &mut challenger); + let proof = machine.prove::>( + &pk, + runtime.record, + &mut challenger, + SP1CoreOpts::default(), + ); let proving_duration = proving_start.elapsed().as_millis(); let nb_bytes = bincode::serialize(&proof).unwrap().len(); @@ -82,6 +87,7 @@ pub fn prove( program: Program, stdin: &SP1Stdin, config: SC, + opts: SP1CoreOpts, ) -> Result<(MachineProof, Vec), SP1CoreProverError> where SC::Challenger: Clone, @@ -94,7 +100,7 @@ where let proving_start = Instant::now(); // Execute the program. - let mut runtime = Runtime::new(program.clone()); + let mut runtime = Runtime::new(program.clone(), opts); runtime.write_vecs(&stdin.buffer); for proof in stdin.proofs.iter() { runtime.write_proof(proof.0.clone(), proof.1.clone()); @@ -105,7 +111,7 @@ where let (pk, vk) = machine.setup(runtime.program.as_ref()); // If we don't need to batch, we can just run the program normally and prove it. - if env::shard_batch_size() == 0 { + if opts.shard_batch_size == 0 { // Execute the runtime and collect all the events.. runtime.run().map_err(SP1CoreProverError::ExecutionError)?; @@ -157,7 +163,7 @@ where let mut challenger = machine.config().challenger(); vk.observe_into(&mut challenger); for checkpoint_file in checkpoints.iter_mut() { - let mut record = trace_checkpoint(program.clone(), checkpoint_file); + let mut record = trace_checkpoint(program.clone(), checkpoint_file, opts); record.public_values = public_values; reset_seek(&mut *checkpoint_file); @@ -167,7 +173,7 @@ where // Commit to each shard. let (commitments, commit_data) = tracing::info_span!("commit") - .in_scope(|| LocalProver::commit_shards(&machine, &checkpoint_shards)); + .in_scope(|| LocalProver::commit_shards(&machine, &checkpoint_shards, opts)); shard_main_datas.push(commit_data); // Observe the commitments. @@ -181,7 +187,7 @@ where let mut shard_proofs = Vec::>::new(); for mut checkpoint_file in checkpoints.into_iter() { let checkpoint_shards = { - let mut events = trace_checkpoint(program.clone(), &checkpoint_file); + let mut events = trace_checkpoint(program.clone(), &checkpoint_file, opts); events.public_values = public_values; reset_seek(&mut checkpoint_file); tracing::debug_span!("shard").in_scope(|| machine.shard(events, &sharding_config)) @@ -230,7 +236,7 @@ pub fn run_test_io( inputs: SP1Stdin, ) -> Result> { let runtime = tracing::info_span!("runtime.run(...)").in_scope(|| { - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.write_vecs(&inputs.buffer); runtime.run().unwrap(); runtime @@ -247,7 +253,7 @@ pub fn run_test( crate::stark::MachineVerificationError, > { let runtime = tracing::info_span!("runtime.run(...)").in_scope(|| { - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.run().unwrap(); runtime }); @@ -301,7 +307,8 @@ where let start = Instant::now(); let mut challenger = machine.config().challenger(); - let proof = machine.prove::>(&pk, record, &mut challenger); + let proof = + machine.prove::>(&pk, record, &mut challenger, SP1CoreOpts::default()); let time = start.elapsed().as_millis(); let nb_bytes = bincode::serialize(&proof).unwrap().len(); @@ -319,10 +326,10 @@ where Ok(proof) } -fn trace_checkpoint(program: Program, file: &File) -> ExecutionRecord { +fn trace_checkpoint(program: Program, file: &File, opts: SP1CoreOpts) -> ExecutionRecord { let mut reader = std::io::BufReader::new(file); let state = bincode::deserialize_from(&mut reader).expect("failed to deserialize state"); - let mut runtime = Runtime::recover(program.clone(), state); + let mut runtime = Runtime::recover(program.clone(), state, opts); let (events, _) = tracing::debug_span!("runtime.trace").in_scope(|| runtime.execute_record().unwrap()); events diff --git a/eval/src/main.rs b/eval/src/main.rs index c11e4413fd..dbf67c51b5 100644 --- a/eval/src/main.rs +++ b/eval/src/main.rs @@ -5,7 +5,9 @@ use clap::{command, Parser}; use csv::WriterBuilder; use serde::Serialize; use sp1_core::runtime::{Program, Runtime}; -use sp1_core::utils::{prove_simple, BabyBearBlake3, BabyBearKeccak, BabyBearPoseidon2}; +use sp1_core::utils::{ + prove_simple, BabyBearBlake3, BabyBearKeccak, BabyBearPoseidon2, SP1CoreOpts, +}; use sp1_prover::utils::get_cycles; use sp1_prover::SP1Stdin; use std::fmt; @@ -137,7 +139,8 @@ fn run_evaluation(hashfn: &HashFnId, program: &Program, _elf: &[u8]) -> (f64, f6 // or end to end proving as we only support Poseidon for now. match hashfn { HashFnId::Blake3 => { - let mut runtime = Runtime::new(program.clone()); + let opts = SP1CoreOpts::default(); + let mut runtime = Runtime::new(program.clone(), opts); let execution_start = Instant::now(); runtime.run().unwrap(); let execution_duration = execution_start.elapsed().as_secs_f64(); @@ -154,7 +157,8 @@ fn run_evaluation(hashfn: &HashFnId, program: &Program, _elf: &[u8]) -> (f64, f6 (execution_duration, prove_duration, verify_duration) } HashFnId::Poseidon => { - let mut runtime = Runtime::new(program.clone()); + let opts = SP1CoreOpts::default(); + let mut runtime = Runtime::new(program.clone(), opts); let execution_start = Instant::now(); runtime.run().unwrap(); let execution_duration = execution_start.elapsed().as_secs_f64(); @@ -171,7 +175,8 @@ fn run_evaluation(hashfn: &HashFnId, program: &Program, _elf: &[u8]) -> (f64, f6 (execution_duration, prove_duration, verify_duration) } HashFnId::Keccak256 => { - let mut runtime = Runtime::new(program.clone()); + let opts = SP1CoreOpts::default(); + let mut runtime = Runtime::new(program.clone(), opts); let execution_start = Instant::now(); runtime.run().unwrap(); let execution_duration = execution_start.elapsed().as_secs_f64(); diff --git a/prover/src/lib.rs b/prover/src/lib.rs index 73af7fd6fe..fad048004f 100644 --- a/prover/src/lib.rs +++ b/prover/src/lib.rs @@ -19,10 +19,8 @@ pub mod utils; pub mod verify; use std::borrow::Borrow; -use std::env; use std::path::Path; -use crate::utils::RECONSTRUCT_COMMITMENTS_ENV_VAR; use p3_baby_bear::BabyBear; use p3_challenger::CanObserve; use p3_field::{AbstractField, PrimeField}; @@ -33,7 +31,7 @@ pub use sp1_core::io::{SP1PublicValues, SP1Stdin}; use sp1_core::runtime::{ExecutionError, Runtime}; use sp1_core::stark::{Challenge, StarkProvingKey}; use sp1_core::stark::{Challenger, MachineVerificationError}; -use sp1_core::utils::DIGEST_SIZE; +use sp1_core::utils::{SP1CoreOpts, DIGEST_SIZE}; use sp1_core::{ runtime::Program, stark::{ @@ -217,7 +215,8 @@ impl SP1Prover { #[instrument(name = "execute", level = "info", skip_all)] pub fn execute(elf: &[u8], stdin: &SP1Stdin) -> Result { let program = Program::from(elf); - let mut runtime = Runtime::new(program); + let opts = SP1CoreOpts::default(); + let mut runtime = Runtime::new(program, opts); runtime.write_vecs(&stdin.buffer); for (proof, vkey) in stdin.proofs.iter() { runtime.write_proof(proof.clone(), vkey.clone()); @@ -236,7 +235,8 @@ impl SP1Prover { ) -> Result { let config = CoreSC::default(); let program = Program::from(&pk.elf); - let (proof, public_values_stream) = sp1_core::utils::prove(program, stdin, config)?; + let opts = SP1CoreOpts::default(); + let (proof, public_values_stream) = sp1_core::utils::prove(program, stdin, config, opts)?; let public_values = SP1PublicValues::from(&public_values_stream); Ok(SP1CoreProof { proof: SP1CoreProofData(proof.shard_proofs), @@ -381,14 +381,7 @@ impl SP1Prover { leaf_challenger.observe_slice(&proof.public_values[0..self.core_machine.num_pv_elts()]); }); - // Setup the reconstruct commitments flags to false and save its state. - let rc = env::var(RECONSTRUCT_COMMITMENTS_ENV_VAR).unwrap_or_default(); - env::set_var(RECONSTRUCT_COMMITMENTS_ENV_VAR, "false"); - // Run the recursion and reduce programs. - - // Run the recursion programs. - let (core_inputs, deferred_inputs) = self.get_first_layer_inputs( vk, &leaf_challenger, @@ -398,7 +391,8 @@ impl SP1Prover { ); let mut first_layer_proofs = Vec::new(); - let shard_batch_size = sp1_core::utils::env::shard_batch_size() as usize; + let opts = SP1CoreOpts::recursion(); + let shard_batch_size = opts.shard_batch_size; for inputs in core_inputs.chunks(shard_batch_size) { let proofs = inputs .into_par_iter() @@ -422,6 +416,7 @@ impl SP1Prover { pk, runtime.record, &mut recursive_challenger, + opts, ), ReduceProgramType::Core, ) @@ -454,6 +449,7 @@ impl SP1Prover { pk, runtime.record, &mut recursive_challenger, + opts, ), ReduceProgramType::Deferred, ) @@ -512,9 +508,6 @@ impl SP1Prover { debug_assert_eq!(reduce_proofs.len(), 1); let reduce_proof = reduce_proofs.pop().unwrap(); - // Restore the prover parameters. - env::set_var(RECONSTRUCT_COMMITMENTS_ENV_VAR, rc); - Ok(SP1ReduceProof { proof: reduce_proof.0, }) @@ -538,9 +531,10 @@ impl SP1Prover { runtime.run(); runtime.print_stats(); + let opts = SP1CoreOpts::recursion(); let mut recursive_challenger = self.compress_machine.config().challenger(); self.compress_machine - .prove::>(pk, runtime.record, &mut recursive_challenger) + .prove::>(pk, runtime.record, &mut recursive_challenger, opts) .shard_proofs .pop() .unwrap() @@ -552,10 +546,6 @@ impl SP1Prover { &self, reduced_proof: SP1ReduceProof, ) -> Result, SP1RecursionProverError> { - // Setup the prover parameters. - let rc = env::var(RECONSTRUCT_COMMITMENTS_ENV_VAR).unwrap_or_default(); - env::set_var(RECONSTRUCT_COMMITMENTS_ENV_VAR, "false"); - // Make the compress proof. let input = SP1RootMemoryLayout { machine: &self.compress_machine, @@ -578,16 +568,15 @@ impl SP1Prover { tracing::debug!("Compress program executed successfully"); // Prove the compress program. + let opts = SP1CoreOpts::default(); let mut compress_challenger = self.shrink_machine.config().challenger(); let mut compress_proof = self.shrink_machine.prove::>( &self.shrink_pk, runtime.record, &mut compress_challenger, + opts, ); - // Restore the prover parameters. - env::set_var(RECONSTRUCT_COMMITMENTS_ENV_VAR, rc); - Ok(SP1ReduceProof { proof: compress_proof.shard_proofs.pop().unwrap(), }) @@ -599,10 +588,6 @@ impl SP1Prover { &self, compressed_proof: SP1ReduceProof, ) -> Result, SP1RecursionProverError> { - // Setup the prover parameters. - let rc = env::var(RECONSTRUCT_COMMITMENTS_ENV_VAR).unwrap_or_default(); - env::set_var(RECONSTRUCT_COMMITMENTS_ENV_VAR, "false"); - let input = SP1RootMemoryLayout { machine: &self.shrink_machine, proof: compressed_proof.proof, @@ -624,12 +609,14 @@ impl SP1Prover { tracing::debug!("Wrap program executed successfully"); // Prove the wrap program. + let opts = SP1CoreOpts::recursion(); let mut wrap_challenger = self.wrap_machine.config().challenger(); let time = std::time::Instant::now(); let mut wrap_proof = self.wrap_machine.prove::>( &self.wrap_pk, runtime.record, &mut wrap_challenger, + opts, ); let elapsed = time.elapsed(); tracing::debug!("Wrap proving time: {:?}", elapsed); @@ -646,9 +633,6 @@ impl SP1Prover { } tracing::info!("Wrapping successful"); - // Restore the prover parameters. - env::set_var(RECONSTRUCT_COMMITMENTS_ENV_VAR, rc); - Ok(SP1ReduceProof { proof: wrap_proof.shard_proofs.pop().unwrap(), }) diff --git a/prover/src/utils.rs b/prover/src/utils.rs index 785b376079..653017b3e2 100644 --- a/prover/src/utils.rs +++ b/prover/src/utils.rs @@ -12,13 +12,12 @@ use sp1_core::{ air::Word, io::SP1Stdin, runtime::{Program, Runtime}, + utils::SP1CoreOpts, }; use tokio::{runtime, task::block_in_place}; use crate::SP1CoreProofData; -pub const RECONSTRUCT_COMMITMENTS_ENV_VAR: &str = "RECONSTRUCT_COMMITMENTS"; - impl SP1CoreProofData { pub fn save(&self, path: &str) -> Result<(), std::io::Error> { let data = serde_json::to_string(self).unwrap(); @@ -30,7 +29,7 @@ impl SP1CoreProofData { /// Get the number of cycles for a given program. pub fn get_cycles(elf: &[u8], stdin: &SP1Stdin) -> u64 { let program = Program::from(elf); - let mut runtime = Runtime::new(program); + let mut runtime = Runtime::new(program, SP1CoreOpts::default()); runtime.write_vecs(&stdin.buffer); runtime.dry_run(); runtime.state.global_clk diff --git a/recursion/circuit/src/constraints.rs b/recursion/circuit/src/constraints.rs index a4e3142fed..3c724f0fe2 100644 --- a/recursion/circuit/src/constraints.rs +++ b/recursion/circuit/src/constraints.rs @@ -168,9 +168,12 @@ mod tests { use p3_challenger::{CanObserve, FieldChallenger}; use p3_commit::{Pcs, PolynomialSpace}; use serde::{de::DeserializeOwned, Serialize}; - use sp1_core::stark::{ - Chip, Com, Dom, LocalProver, OpeningProof, PcsProverData, ShardCommitment, ShardMainData, - ShardProof, StarkGenericConfig, StarkMachine, + use sp1_core::{ + stark::{ + Chip, Com, Dom, LocalProver, OpeningProof, PcsProverData, ShardCommitment, + ShardMainData, ShardProof, StarkGenericConfig, StarkMachine, + }, + utils::SP1CoreOpts, }; use sp1_recursion_compiler::{ config::OuterConfig, @@ -295,7 +298,12 @@ mod tests { let machine = A::machine(config); let (pk, vk) = machine.setup(&program); let mut challenger = machine.config().challenger(); - let proof = machine.prove::>(&pk, runtime.record, &mut challenger); + let proof = machine.prove::>( + &pk, + runtime.record, + &mut challenger, + SP1CoreOpts::recursion(), + ); let mut challenger = machine.config().challenger(); vk.observe_into(&mut challenger); diff --git a/recursion/program/src/constraints.rs b/recursion/program/src/constraints.rs index 01ec477182..8ea42a2d72 100644 --- a/recursion/program/src/constraints.rs +++ b/recursion/program/src/constraints.rs @@ -166,7 +166,7 @@ mod tests { Chip, Com, Dom, OpeningProof, PcsProverData, RiscvAir, ShardCommitment, ShardMainData, ShardProof, StarkGenericConfig, StarkMachine, }, - utils::BabyBearPoseidon2, + utils::{BabyBearPoseidon2, SP1CoreOpts}, }; use sp1_recursion_core::stark::utils::{run_test_recursion, TestConfig}; @@ -283,8 +283,13 @@ mod tests { let machine = A::machine(SC::default()); let (_, vk) = machine.setup(&Program::from(elf)); let mut challenger = machine.config().challenger(); - let (proof, _) = - sp1_core::utils::prove(Program::from(elf), &SP1Stdin::new(), SC::default()).unwrap(); + let (proof, _) = sp1_core::utils::prove( + Program::from(elf), + &SP1Stdin::new(), + SC::default(), + SP1CoreOpts::default(), + ) + .unwrap(); machine.verify(&vk, &proof, &mut challenger).unwrap(); println!("Proof generated and verified successfully"); diff --git a/recursion/program/src/machine/mod.rs b/recursion/program/src/machine/mod.rs index cef2cbccc5..645e46b911 100644 --- a/recursion/program/src/machine/mod.rs +++ b/recursion/program/src/machine/mod.rs @@ -17,7 +17,7 @@ mod tests { use p3_challenger::CanObserve; use p3_maybe_rayon::prelude::*; use sp1_core::stark::{MachineVerificationError, RiscvAir, StarkGenericConfig}; - use sp1_core::utils::BabyBearPoseidon2; + use sp1_core::utils::{BabyBearPoseidon2, SP1CoreOpts}; use sp1_core::{ io::SP1Stdin, runtime::Program, @@ -83,7 +83,13 @@ mod tests { let mut challenger = machine.config().challenger(); let time = std::time::Instant::now(); - let (proof, _) = sp1_core::utils::prove(program, &SP1Stdin::new(), SC::default()).unwrap(); + let (proof, _) = sp1_core::utils::prove( + program, + &SP1Stdin::new(), + SC::default(), + SP1CoreOpts::default(), + ) + .unwrap(); machine.verify(&vk, &proof, &mut challenger).unwrap(); tracing::info!("Proof generated successfully"); let elapsed = time.elapsed(); @@ -166,6 +172,7 @@ mod tests { &rec_pk, record, &mut recursive_challenger, + SP1CoreOpts::recursion(), ) }) .collect::>(); @@ -238,6 +245,7 @@ mod tests { &reduce_pk, runtime.record, &mut recursive_challenger, + SP1CoreOpts::recursion(), ); let mut recursive_challenger = recursive_machine.config().challenger(); let result = @@ -297,6 +305,7 @@ mod tests { &compress_pk, runtime.record, &mut compress_challenger, + SP1CoreOpts::default(), ); let elapsed = time.elapsed(); tracing::info!("Compress proving time: {:?}", elapsed); @@ -341,8 +350,12 @@ mod tests { // Prove the wrap program. let mut wrap_challenger = wrap_machine.config().challenger(); let time = std::time::Instant::now(); - let wrap_proof = - wrap_machine.prove::>(&wrap_pk, runtime.record, &mut wrap_challenger); + let wrap_proof = wrap_machine.prove::>( + &wrap_pk, + runtime.record, + &mut wrap_challenger, + SP1CoreOpts::recursion(), + ); let elapsed = time.elapsed(); tracing::info!("Wrap proving time: {:?}", elapsed); let mut wrap_challenger = wrap_machine.config().challenger(); diff --git a/recursion/program/src/stark.rs b/recursion/program/src/stark.rs index 84133b0da5..44934d0d33 100644 --- a/recursion/program/src/stark.rs +++ b/recursion/program/src/stark.rs @@ -97,11 +97,7 @@ impl<'a, SC: StarkGenericConfig, A: MachineAir> VerifyingKeyHint<'a, SC impl StarkRecursiveVerifier for StarkMachine where C::F: TwoAdicField, - SC: StarkGenericConfig< - Val = C::F, - Challenge = C::EF, - Domain = TwoAdicMultiplicativeCoset, - >, + SC: StarkGenericConfig>, A: MachineAir + for<'a> Air>, C::F: TwoAdicField, C::EF: TwoAdicField, @@ -148,11 +144,7 @@ pub type RecursiveVerifierConstraintFolder<'a, C> = GenericVerifierConstraintFol impl StarkVerifier where C::F: TwoAdicField, - SC: StarkGenericConfig< - Val = C::F, - Challenge = C::EF, - Domain = TwoAdicMultiplicativeCoset, - >, + SC: StarkGenericConfig>, { pub fn verify_shard( builder: &mut Builder, @@ -419,6 +411,7 @@ pub(crate) mod tests { use sp1_core::utils::setup_logger; use sp1_core::utils::InnerChallenge; use sp1_core::utils::InnerVal; + use sp1_core::utils::SP1CoreOpts; use sp1_core::{ stark::{RiscvAir, StarkGenericConfig}, utils::BabyBearPoseidon2, @@ -460,8 +453,13 @@ pub(crate) mod tests { let machine = A::machine(SC::default()); let (_, vk) = machine.setup(&Program::from(elf)); let mut challenger_val = machine.config().challenger(); - let (proof, _) = - sp1_core::utils::prove(Program::from(elf), &SP1Stdin::new(), SC::default()).unwrap(); + let (proof, _) = sp1_core::utils::prove( + Program::from(elf), + &SP1Stdin::new(), + SC::default(), + SP1CoreOpts::default(), + ) + .unwrap(); let proofs = proof.shard_proofs; println!("Proof generated successfully"); @@ -559,8 +557,12 @@ pub(crate) mod tests { let record = runtime.record.clone(); let mut challenger = machine.config().challenger(); - let mut proof = - machine.prove::>>(&pk, record, &mut challenger); + let mut proof = machine.prove::>>( + &pk, + record, + &mut challenger, + SP1CoreOpts::recursion(), + ); let mut challenger = machine.config().challenger(); let verification_result = machine.verify(&vk, &proof, &mut challenger); diff --git a/sdk/src/provers/network.rs b/sdk/src/provers/network.rs index 2e737ea95d..5b67f1cabf 100644 --- a/sdk/src/provers/network.rs +++ b/sdk/src/provers/network.rs @@ -10,6 +10,7 @@ use crate::{SP1CompressedProof, SP1PlonkBn254Proof, SP1Proof, SP1ProvingKey, SP1 use anyhow::{Context, Result}; use serde::de::DeserializeOwned; use sp1_core::runtime::{Program, Runtime}; +use sp1_core::utils::SP1CoreOpts; use sp1_prover::utils::block_on; use sp1_prover::{SP1Prover, SP1Stdin}; use tokio::{runtime, time::sleep}; @@ -43,7 +44,8 @@ impl NetworkProver { let client = &self.client; // Execute the runtime before creating the proof request. let program = Program::from(elf); - let mut runtime = Runtime::new(program); + let opts = SP1CoreOpts::default(); + let mut runtime = Runtime::new(program, opts); runtime.write_vecs(&stdin.buffer); for (proof, vkey) in stdin.proofs.iter() { runtime.write_proof(proof.clone(), vkey.clone()); From 744c5918b91362b2641eb2b4636f012d78730126 Mon Sep 17 00:00:00 2001 From: John Guibas Date: Mon, 27 May 2024 14:46:26 -0700 Subject: [PATCH 37/42] hm --- core/src/stark/prover.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/src/stark/prover.rs b/core/src/stark/prover.rs index 4a65b38794..51d36b759c 100644 --- a/core/src/stark/prover.rs +++ b/core/src/stark/prover.rs @@ -146,10 +146,7 @@ where } } -pub struct LocalProver { - pub opts: SP1CoreOpts, - pub _phantom: PhantomData<(SC, A)>, -} +pub struct LocalProver(PhantomData, PhantomData); impl LocalProver where From 299eb5d9d28951c75aab38761961bd151ae531ce Mon Sep 17 00:00:00 2001 From: John Guibas Date: Mon, 27 May 2024 14:48:35 -0700 Subject: [PATCH 38/42] fmt --- core/src/stark/prover.rs | 8 ++------ recursion/program/src/stark.rs | 12 ++++++++++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/core/src/stark/prover.rs b/core/src/stark/prover.rs index 51d36b759c..7c22161e1f 100644 --- a/core/src/stark/prover.rs +++ b/core/src/stark/prover.rs @@ -466,12 +466,8 @@ where }); // Collect the opened values for each chip. - let [ - preprocessed_values, - main_values, - permutation_values, - mut quotient_values, - ] = openings.try_into().unwrap(); + let [preprocessed_values, main_values, permutation_values, mut quotient_values] = + openings.try_into().unwrap(); assert!(main_values.len() == chips.len()); let preprocessed_opened_values = preprocessed_values .into_iter() diff --git a/recursion/program/src/stark.rs b/recursion/program/src/stark.rs index 44934d0d33..aec5d9453d 100644 --- a/recursion/program/src/stark.rs +++ b/recursion/program/src/stark.rs @@ -97,7 +97,11 @@ impl<'a, SC: StarkGenericConfig, A: MachineAir> VerifyingKeyHint<'a, SC impl StarkRecursiveVerifier for StarkMachine where C::F: TwoAdicField, - SC: StarkGenericConfig>, + SC: StarkGenericConfig< + Val = C::F, + Challenge = C::EF, + Domain = TwoAdicMultiplicativeCoset, + >, A: MachineAir + for<'a> Air>, C::F: TwoAdicField, C::EF: TwoAdicField, @@ -144,7 +148,11 @@ pub type RecursiveVerifierConstraintFolder<'a, C> = GenericVerifierConstraintFol impl StarkVerifier where C::F: TwoAdicField, - SC: StarkGenericConfig>, + SC: StarkGenericConfig< + Val = C::F, + Challenge = C::EF, + Domain = TwoAdicMultiplicativeCoset, + >, { pub fn verify_shard( builder: &mut Builder, From 610888ff761f8521b4b15dc16aa8c8708ef3e207 Mon Sep 17 00:00:00 2001 From: John Guibas Date: Mon, 27 May 2024 14:49:58 -0700 Subject: [PATCH 39/42] hm --- prover/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prover/src/lib.rs b/prover/src/lib.rs index fad048004f..c0a14c804f 100644 --- a/prover/src/lib.rs +++ b/prover/src/lib.rs @@ -568,7 +568,7 @@ impl SP1Prover { tracing::debug!("Compress program executed successfully"); // Prove the compress program. - let opts = SP1CoreOpts::default(); + let opts = SP1CoreOpts::recursion(); let mut compress_challenger = self.shrink_machine.config().challenger(); let mut compress_proof = self.shrink_machine.prove::>( &self.shrink_pk, From fa80f87cefc1e6a07595b857683e9d8eeb2bc49b Mon Sep 17 00:00:00 2001 From: Ratan Kaliani Date: Tue, 28 May 2024 09:42:10 -0700 Subject: [PATCH 40/42] fix: install for `verify_plonk_bn254` (#798) --- core/src/stark/machine.rs | 2 +- prover/src/build.rs | 2 +- prover/src/lib.rs | 4 ++-- sdk/src/provers/mod.rs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/stark/machine.rs b/core/src/stark/machine.rs index b00d69c062..672226030b 100644 --- a/core/src/stark/machine.rs +++ b/core/src/stark/machine.rs @@ -160,7 +160,7 @@ impl>> StarkMachine { /// /// Given a program, this function generates the proving and verifying keys. The keys correspond /// to the program code and other preprocessed colunms such as lookup tables. - #[instrument("setup machine", level = "info", skip_all)] + #[instrument("setup machine", level = "debug", skip_all)] pub fn setup(&self, program: &A::Program) -> (StarkProvingKey, StarkVerifyingKey) { let mut named_preprocessed_traces = tracing::debug_span!("generate preprocessed traces") .in_scope(|| { diff --git a/prover/src/build.rs b/prover/src/build.rs index bd9ce31180..129ec454a8 100644 --- a/prover/src/build.rs +++ b/prover/src/build.rs @@ -51,7 +51,7 @@ pub fn try_build_plonk_bn254_artifacts_dev( } /// Gets the directory where the PLONK artifacts are installed. -pub fn plonk_bn254_artifacts_dir() -> PathBuf { +fn plonk_bn254_artifacts_dir() -> PathBuf { dirs::home_dir() .unwrap() .join(".sp1") diff --git a/prover/src/lib.rs b/prover/src/lib.rs index c0a14c804f..22111fbbd6 100644 --- a/prover/src/lib.rs +++ b/prover/src/lib.rs @@ -141,7 +141,7 @@ pub struct SP1Prover { impl SP1Prover { /// Initializes a new [SP1Prover]. - #[instrument(name = "initialize prover", level = "info", skip_all)] + #[instrument(name = "initialize prover", level = "debug", skip_all)] pub fn new() -> Self { let core_machine = RiscvAir::machine(CoreSC::default()); @@ -198,7 +198,7 @@ impl SP1Prover { } /// Creates a proving key and a verifying key for a given RISC-V ELF. - #[instrument(name = "setup", level = "info", skip_all)] + #[instrument(name = "setup", level = "debug", skip_all)] pub fn setup(&self, elf: &[u8]) -> (SP1ProvingKey, SP1VerifyingKey) { let program = Program::from(elf); let (pk, vk) = self.core_machine.setup(&program); diff --git a/sdk/src/provers/mod.rs b/sdk/src/provers/mod.rs index fb11e5a7bf..0f52511573 100644 --- a/sdk/src/provers/mod.rs +++ b/sdk/src/provers/mod.rs @@ -61,7 +61,7 @@ pub trait Prover: Send + Sync { let plonk_bn254_aritfacts = if sp1_prover::build::sp1_dev_mode() { sp1_prover::build::plonk_bn254_artifacts_dev_dir() } else { - sp1_prover::build::plonk_bn254_artifacts_dir() + sp1_prover::build::try_install_plonk_bn254_artifacts() }; sp1_prover.verify_plonk_bn254( &proof.proof, From d16f22923b1ab8812d47c4121a15469c4ff254e0 Mon Sep 17 00:00:00 2001 From: Ratan Kaliani Date: Tue, 28 May 2024 13:48:28 -0700 Subject: [PATCH 41/42] feat: update contract artifacts (#802) Co-authored-by: Chris T --- .github/workflows/release.yml | 2 +- prover/Makefile | 1 + prover/src/install.rs | 2 +- recursion/gnark-ffi/assets/ISP1Verifier.txt | 20 ++++++++++++ .../gnark-ffi/assets/SP1MockVerifier.txt | 23 ++++++++++++++ recursion/gnark-ffi/assets/SP1Verifier.txt | 11 ++++++- recursion/gnark-ffi/go/sp1/build.go | 2 +- recursion/gnark-ffi/go/sp1/sp1.go | 2 +- recursion/gnark-ffi/src/plonk_bn254.rs | 31 ++++++++++++------- 9 files changed, 77 insertions(+), 17 deletions(-) create mode 100644 recursion/gnark-ffi/assets/ISP1Verifier.txt create mode 100644 recursion/gnark-ffi/assets/SP1MockVerifier.txt diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 980780a98c..f98e70cf75 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -260,4 +260,4 @@ jobs: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} with: update_existing: true - filename: .github/RELEASE_FAILURE_ISSUE_TEMPLATE.md + filename: .github/RELEASE_FAILURE_ISSUE_TEMPLATE.md \ No newline at end of file diff --git a/prover/Makefile b/prover/Makefile index 0531e8926a..bc3ad6ef61 100644 --- a/prover/Makefile +++ b/prover/Makefile @@ -3,6 +3,7 @@ all: make release-plonk-bn254 build-plonk-bn254: + rm -rf build && \ mkdir -p build && \ RUSTFLAGS='-C target-cpu=native' \ cargo run -p sp1-prover --release --bin build_plonk_bn254 -- \ diff --git a/prover/src/install.rs b/prover/src/install.rs index 0fa5b34507..cb4d08f168 100644 --- a/prover/src/install.rs +++ b/prover/src/install.rs @@ -10,7 +10,7 @@ use crate::utils::block_on; pub const PLONK_BN254_ARTIFACTS_URL_BASE: &str = "https://sp1-circuits.s3-us-east-2.amazonaws.com"; /// The current version of the plonk bn254 artifacts. -pub const PLONK_BN254_ARTIFACTS_COMMIT: &str = "d7b2513f"; +pub const PLONK_BN254_ARTIFACTS_COMMIT: &str = "57ad9e7d"; /// Install the latest plonk bn254 artifacts. /// diff --git a/recursion/gnark-ffi/assets/ISP1Verifier.txt b/recursion/gnark-ffi/assets/ISP1Verifier.txt new file mode 100644 index 0000000000..4298f4b8cf --- /dev/null +++ b/recursion/gnark-ffi/assets/ISP1Verifier.txt @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.25; + +/// @title SP1 Verifier Interface +/// @author Succinct Labs +/// @notice This contract is the interface for the SP1 Verifier. +interface ISP1Verifier { + /// @notice Returns the version of the SP1 Verifier. + function VERSION() external pure returns (string memory); + + /// @notice Verifies a proof with given public values and vkey. + /// @param vkey The verification key for the RISC-V program. + /// @param publicValues The public values encoded as bytes. + /// @param proofBytes The proof of the program execution the SP1 zkVM encoded as bytes. + function verifyProof( + bytes32 vkey, + bytes memory publicValues, + bytes memory proofBytes + ) external view; +} diff --git a/recursion/gnark-ffi/assets/SP1MockVerifier.txt b/recursion/gnark-ffi/assets/SP1MockVerifier.txt new file mode 100644 index 0000000000..bf938718b6 --- /dev/null +++ b/recursion/gnark-ffi/assets/SP1MockVerifier.txt @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.25; + +import {ISP1Verifier} from "./ISP1Verifier.sol"; + +/// @title SP1 Mock Verifier +/// @author Succinct Labs +/// @notice This contracts implements a Mock solidity verifier for SP1. +contract SP1MockVerifier is ISP1Verifier { + function VERSION() external pure returns (string memory) { + return "TODO"; + } + + /// @notice Verifies a mock proof with given public values and vkey. + /// @param proofBytes The proof of the program execution the SP1 zkVM encoded as bytes. + function verifyProof( + bytes32, + bytes memory, + bytes memory proofBytes + ) external pure { + assert(proofBytes.length == 0); + } +} diff --git a/recursion/gnark-ffi/assets/SP1Verifier.txt b/recursion/gnark-ffi/assets/SP1Verifier.txt index a63e12c6ae..f7389163e8 100644 --- a/recursion/gnark-ffi/assets/SP1Verifier.txt +++ b/recursion/gnark-ffi/assets/SP1Verifier.txt @@ -1,8 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.25; + +import {ISP1Verifier} from "./ISP1Verifier.sol"; +import {PlonkVerifier} from "./PlonkVerifier.sol"; /// @title SP1 Verifier /// @author Succinct Labs /// @notice This contracts implements a solidity verifier for SP1. contract SP1Verifier is PlonkVerifier { + function VERSION() external pure returns (string memory) { + return "TODO"; + } + /// @notice Hashes the public values to a field elements inside Bn254. /// @param publicValues The public values. function hashPublicValues( @@ -16,7 +25,7 @@ contract SP1Verifier is PlonkVerifier { /// @param publicValues The public values encoded as bytes. /// @param proofBytes The proof of the program execution the SP1 zkVM encoded as bytes. function verifyProof( - bytes32 vkey, + bytes32 vkey, bytes memory publicValues, bytes memory proofBytes ) public view { diff --git a/recursion/gnark-ffi/go/sp1/build.go b/recursion/gnark-ffi/go/sp1/build.go index 1ea42404da..ccd278c1d5 100644 --- a/recursion/gnark-ffi/go/sp1/build.go +++ b/recursion/gnark-ffi/go/sp1/build.go @@ -19,7 +19,7 @@ import ( func Build(dataDir string) { // Set the enviroment variable for the constraints file. // - // TODO: There might be some non-determinism if a single processe is running this command + // TODO: There might be some non-determinism if a single process is running this command // multiple times. os.Setenv("CONSTRAINTS_JSON", dataDir+"/"+CONSTRAINTS_JSON_FILE) diff --git a/recursion/gnark-ffi/go/sp1/sp1.go b/recursion/gnark-ffi/go/sp1/sp1.go index 82c651b774..f3f3b24a51 100644 --- a/recursion/gnark-ffi/go/sp1/sp1.go +++ b/recursion/gnark-ffi/go/sp1/sp1.go @@ -15,7 +15,7 @@ var SRS_FILE string = "srs.bin" var SRS_LAGRANGE_FILE string = "srs_lagrange.bin" var CONSTRAINTS_JSON_FILE string = "constraints.json" var WITNESS_JSON_FILE string = "witness.json" -var VERIFIER_CONTRACT_PATH string = "SP1Verifier.sol" +var VERIFIER_CONTRACT_PATH string = "PlonkVerifier.sol" var CIRCUIT_PATH string = "circuit.bin" var VK_PATH string = "vk.bin" var PK_PATH string = "pk.bin" diff --git a/recursion/gnark-ffi/src/plonk_bn254.rs b/recursion/gnark-ffi/src/plonk_bn254.rs index 6b2ddf66be..74727c328b 100644 --- a/recursion/gnark-ffi/src/plonk_bn254.rs +++ b/recursion/gnark-ffi/src/plonk_bn254.rs @@ -1,5 +1,5 @@ use std::{ - fs::{File, OpenOptions}, + fs::File, io::Write, path::{Path, PathBuf}, }; @@ -72,20 +72,27 @@ impl PlonkBn254Prover { build_plonk_bn254(build_dir.to_str().unwrap()); - // Extend the built verifier with the sp1 verifier contract. - let plonk_bn254_verifier_path = build_dir.join("SP1Verifier.sol"); + // Write the corresponding asset files to the build dir. + let sp1_mock_verifier_path = build_dir.join("SP1MockVerifier.sol"); + let sp1_mock_verifier_str = include_str!("../assets/SP1MockVerifier.txt"); + let mut mock_verifier_file = File::create(sp1_mock_verifier_path).unwrap(); + mock_verifier_file + .write_all(sp1_mock_verifier_str.as_bytes()) + .unwrap(); - // Open the file in append mode. - let mut plonk_bn254_verifier_file = OpenOptions::new() - .append(true) - .open(plonk_bn254_verifier_path) - .expect("failed to open file"); - - // Write the string to the file + let sp1_verifier_path = build_dir.join("SP1Verifier.sol"); let sp1_verifier_str = include_str!("../assets/SP1Verifier.txt"); - plonk_bn254_verifier_file + let mut sp1_verifier_file = File::create(sp1_verifier_path).unwrap(); + sp1_verifier_file .write_all(sp1_verifier_str.as_bytes()) - .expect("Failed to write to file"); + .unwrap(); + + let interface_sp1_verifier_path = build_dir.join("ISP1Verifier.sol"); + let interface_sp1_verifier_str = include_str!("../assets/ISP1Verifier.txt"); + let mut interface_sp1_verifier_file = File::create(interface_sp1_verifier_path).unwrap(); + interface_sp1_verifier_file + .write_all(interface_sp1_verifier_str.as_bytes()) + .unwrap(); } /// Generates a PLONK proof by sending a request to the Gnark server. From 31153925b92e1ebf85a43850fbc99e98b5ecf204 Mon Sep 17 00:00:00 2001 From: Ratan Kaliani Date: Tue, 28 May 2024 14:59:31 -0700 Subject: [PATCH 42/42] chore: merge main into dev (#823) --- .github/workflows/release.yml | 5 + Cargo.lock | 65 ++++++----- examples/Cargo.lock | 105 +++++++++--------- .../programs/aggregation/Cargo.lock | 18 +-- .../elf/riscv32im-succinct-zkvm-elf | Bin 148900 -> 148932 bytes .../fibonacci/elf/riscv32im-succinct-zkvm-elf | Bin 127540 -> 127540 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 1987784 -> 1987812 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 115996 -> 115988 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 127628 -> 127628 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 190332 -> 190336 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 196668 -> 196716 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 2162928 -> 2160504 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 295352 -> 295424 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 200432 -> 200476 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 1175032 -> 1174964 bytes sp1up/sp1up | 2 +- 16 files changed, 99 insertions(+), 96 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f98e70cf75..7e2316c500 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -32,12 +32,17 @@ jobs: with: pull_token: ${{ secrets.PULL_TOKEN }} + # If it's a nightly release, tag with the release time. If the tag is `main`, we want to use + # `latest` as the tag name. Else, use the tag name as is. - name: Compute release name and tag id: release_info run: | if [[ $IS_NIGHTLY ]]; then echo "tag_name=nightly-${GITHUB_SHA}" >> $GITHUB_OUTPUT echo "release_name=Nightly ($(date '+%Y-%m-%d'))" >> $GITHUB_OUTPUT + elif [[ "${GITHUB_REF_NAME}" == "main" ]]; then + echo "tag_name=latest" >> $GITHUB_OUTPUT + echo "release_name=Latest Release" >> $GITHUB_OUTPUT else echo "tag_name=${GITHUB_REF_NAME}" >> $GITHUB_OUTPUT echo "release_name=${GITHUB_REF_NAME}" >> $GITHUB_OUTPUT diff --git a/Cargo.lock b/Cargo.lock index 74715b7373..8d167c45ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,9 +15,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -130,7 +130,7 @@ dependencies = [ "itoa", "serde", "serde_json", - "winnow 0.6.8", + "winnow 0.6.9", ] [[package]] @@ -410,7 +410,7 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "368cae4dc052cad1d8f72eb2ae0c38027116933eeb49213c200a9e9875f208d7" dependencies = [ - "winnow 0.6.8", + "winnow 0.6.9", ] [[package]] @@ -794,9 +794,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "17c6a35df3749d2e8bb1b7b21a976d82b15548788d2735b9d82f329268f71a11" dependencies = [ "addr2line", "cc", @@ -1118,9 +1118,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" +checksum = "a483f3cbf7cec2e153d424d0e92329d816becc6421389bd494375c6065921b9b" dependencies = [ "glob", "libc", @@ -1188,9 +1188,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.11.4" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ff96486ccc291d36a958107caf2c0af8c78c0af7d31ae2f35ce055130de1a6" +checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" dependencies = [ "cfg-if", "cpufeatures", @@ -1861,9 +1861,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "git2" @@ -2207,9 +2207,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" dependencies = [ "bytes", "futures-channel", @@ -2501,9 +2501,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.16" +version = "1.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9" +checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" dependencies = [ "cc", "libc", @@ -2603,11 +2603,10 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -2786,9 +2785,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.32.2" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e" dependencies = [ "memchr", ] @@ -3144,9 +3143,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -3384,9 +3383,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.83" +version = "1.0.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" +checksum = "ec96c6a92621310b51366f1e28d05ef11489516e93be030060e5fc12024a49d6" dependencies = [ "unicode-ident", ] @@ -4051,18 +4050,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.202" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.202" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", @@ -5616,9 +5615,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618d" +checksum = "86c949fede1d13936a99f14fafd3e76fd642b556dd2ce96287fbe2e0151bfac6" dependencies = [ "memchr", ] @@ -5680,9 +5679,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] diff --git a/examples/Cargo.lock b/examples/Cargo.lock index c0b7500c5b..28e72f4eb7 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -15,9 +15,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -130,7 +130,7 @@ dependencies = [ "itoa", "serde", "serde_json", - "winnow 0.6.8", + "winnow 0.6.9", ] [[package]] @@ -410,7 +410,7 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "368cae4dc052cad1d8f72eb2ae0c38027116933eeb49213c200a9e9875f208d7" dependencies = [ - "winnow 0.6.8", + "winnow 0.6.9", ] [[package]] @@ -785,9 +785,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "17c6a35df3749d2e8bb1b7b21a976d82b15548788d2735b9d82f329268f71a11" dependencies = [ "addr2line", "cc", @@ -1093,9 +1093,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" +checksum = "a483f3cbf7cec2e153d424d0e92329d816becc6421389bd494375c6065921b9b" dependencies = [ "glob", "libc", @@ -1163,9 +1163,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.11.4" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ff96486ccc291d36a958107caf2c0af8c78c0af7d31ae2f35ce055130de1a6" +checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" dependencies = [ "cfg-if", "cpufeatures", @@ -1855,9 +1855,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "git2" @@ -2196,9 +2196,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" dependencies = [ "bytes", "futures-channel", @@ -2513,9 +2513,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.16" +version = "1.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9" +checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" dependencies = [ "cc", "libc", @@ -2615,11 +2615,10 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -2824,9 +2823,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.32.2" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e" dependencies = [ "memchr", ] @@ -2902,7 +2901,7 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "p3-air" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-field", "p3-matrix", @@ -2911,7 +2910,7 @@ dependencies = [ [[package]] name = "p3-baby-bear" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "num-bigint 0.4.5", "p3-field", @@ -2925,7 +2924,7 @@ dependencies = [ [[package]] name = "p3-blake3" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "blake3", "p3-symmetric", @@ -2934,7 +2933,7 @@ dependencies = [ [[package]] name = "p3-bn254-fr" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "ff 0.13.0", "num-bigint 0.4.5", @@ -2948,7 +2947,7 @@ dependencies = [ [[package]] name = "p3-challenger" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-field", "p3-maybe-rayon", @@ -2960,7 +2959,7 @@ dependencies = [ [[package]] name = "p3-commit" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-challenger", @@ -2973,7 +2972,7 @@ dependencies = [ [[package]] name = "p3-dft" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-field", "p3-matrix", @@ -2985,7 +2984,7 @@ dependencies = [ [[package]] name = "p3-field" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "num-bigint 0.4.5", @@ -2998,7 +2997,7 @@ dependencies = [ [[package]] name = "p3-fri" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-challenger", @@ -3016,7 +3015,7 @@ dependencies = [ [[package]] name = "p3-interpolation" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-field", "p3-matrix", @@ -3026,7 +3025,7 @@ dependencies = [ [[package]] name = "p3-keccak" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-symmetric", "tiny-keccak", @@ -3035,7 +3034,7 @@ dependencies = [ [[package]] name = "p3-keccak-air" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-air", "p3-field", @@ -3048,7 +3047,7 @@ dependencies = [ [[package]] name = "p3-matrix" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-field", @@ -3062,7 +3061,7 @@ dependencies = [ [[package]] name = "p3-maybe-rayon" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "rayon", ] @@ -3070,7 +3069,7 @@ dependencies = [ [[package]] name = "p3-mds" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-dft", @@ -3084,7 +3083,7 @@ dependencies = [ [[package]] name = "p3-merkle-tree" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-commit", @@ -3100,7 +3099,7 @@ dependencies = [ [[package]] name = "p3-poseidon2" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "gcd", "p3-field", @@ -3112,7 +3111,7 @@ dependencies = [ [[package]] name = "p3-symmetric" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-field", @@ -3122,7 +3121,7 @@ dependencies = [ [[package]] name = "p3-uni-stark" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools 0.12.1", "p3-air", @@ -3140,7 +3139,7 @@ dependencies = [ [[package]] name = "p3-util" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#3b5265f9d5af36534a46caebf0617595cfb42c5a" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "serde", ] @@ -3182,9 +3181,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -3425,9 +3424,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.83" +version = "1.0.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" +checksum = "ec96c6a92621310b51366f1e28d05ef11489516e93be030060e5fc12024a49d6" dependencies = [ "unicode-ident", ] @@ -4096,9 +4095,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.202" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] @@ -4124,9 +4123,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.202" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", @@ -5675,9 +5674,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618d" +checksum = "86c949fede1d13936a99f14fafd3e76fd642b556dd2ce96287fbe2e0151bfac6" dependencies = [ "memchr", ] @@ -5733,9 +5732,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] diff --git a/examples/aggregation/programs/aggregation/Cargo.lock b/examples/aggregation/programs/aggregation/Cargo.lock index d05c04f332..692e2f3662 100644 --- a/examples/aggregation/programs/aggregation/Cargo.lock +++ b/examples/aggregation/programs/aggregation/Cargo.lock @@ -426,7 +426,7 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "p3-baby-bear" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "num-bigint", "p3-field", @@ -440,7 +440,7 @@ dependencies = [ [[package]] name = "p3-dft" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "p3-field", "p3-matrix", @@ -452,7 +452,7 @@ dependencies = [ [[package]] name = "p3-field" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools", "num-bigint", @@ -465,7 +465,7 @@ dependencies = [ [[package]] name = "p3-matrix" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools", "p3-field", @@ -479,12 +479,12 @@ dependencies = [ [[package]] name = "p3-maybe-rayon" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" [[package]] name = "p3-mds" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools", "p3-dft", @@ -498,7 +498,7 @@ dependencies = [ [[package]] name = "p3-poseidon2" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "gcd", "p3-field", @@ -510,7 +510,7 @@ dependencies = [ [[package]] name = "p3-symmetric" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "itertools", "p3-field", @@ -520,7 +520,7 @@ dependencies = [ [[package]] name = "p3-util" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#04d4c6e15a0296798331db82e696d29c455bafe1" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=3b5265f9d5af36534a46caebf0617595cfb42c5a#3b5265f9d5af36534a46caebf0617595cfb42c5a" dependencies = [ "serde", ] diff --git a/examples/aggregation/programs/aggregation/elf/riscv32im-succinct-zkvm-elf b/examples/aggregation/programs/aggregation/elf/riscv32im-succinct-zkvm-elf index 6bf5282ac295a5895ad675e06dcea2b738e25bc5..1574c0edaef09cf75b2d89499b8b694d8de88174 100755 GIT binary patch delta 23478 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 delta 23470 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 z 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 diff --git a/examples/fibonacci/program/elf/riscv32im-succinct-zkvm-elf b/examples/fibonacci/program/elf/riscv32im-succinct-zkvm-elf index 2e43b761d283e4c2e95f6fa7e197b519a8eb20ef..6d448181ef03c9c95d8d4b5e9dd3f56c8fecd93a 100755 GIT binary patch delta 21240 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 Cm)}JI delta 20753 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 Yl0(1e-P#oo<7~(}EZy}Di*{}Mf01LwMF0Q* diff --git a/examples/io/program/elf/riscv32im-succinct-zkvm-elf b/examples/io/program/elf/riscv32im-succinct-zkvm-elf index 4c8231f2009a78c2e092357ef0cf39ea266a0fea..20458bce07fe4b7911f1068c3dff84f0c8bcc493 100755 GIT binary patch delta 25165 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 delta 25321 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∋@=fCRy3fLSafI9Xc5kO?agcMqWyed%sGW8%NHxjJqc2N_p9C z?rKR}A+qjIf?IV6Vv!e)R8=9!w@I7s*)V{7Gd+Qn@ttzq-!1NyF;Q_|_T#+bpT#x# zsp3kZdveV0nq7YtyvYzL36XMrGOA?tm`1vSo(-C1Qp7{gGf}wyM$jy!RatElq5f== z)%satKMQw9&)u0^932IpMN2wDIFY-uHLGp(&SYHzc%}cirzRB%+iS!q(Wq4Bx%+mS|f zQu>Z`XWre=gVp4l(^}!vjY1NOpdHjJG&pESI&C8@+>zd5_&*>c(je&yUy5{a#}u?> z-Z=$MeRb#kiN)qpC5-Iin*5YbYPD;QaO%2UO`~Xm^w#bk^bYB--Cgi+&K~?*a?hR~ zw0UvsWF$q7=t89R5s_wJj_NVRQpw)wbe`0%v;-OGtJ3MLY*fjheQhao^^s=2@mllZ zmZ6GejlwH-dow*{UJJfdh%EXfoO1u0=@9nRo1fs{5pOM|#U*Fn`Y;+`M_IEtbU?H` zFHicUYzNIR2_6`M#&#hJrKRtsNO1>8v7$`~!jk6?K8x^NRMM#;pRuCx3d3YpcJFhC zRxsCaY2~3`nJZtK|NaTgfhFTUSV2=R4UlwYB&+>emep~WnrbVg28RbW+%s?r7D%FH zsd$ex{;-)YmtHuWM&qTuhr4&wZBI@~A>IsK6REhID3-|^l&tF+t&a0H@goFoB+^zGa%2IGj^NKHtD{|x&NjEM!ImTFzkCVOhzHCxiT7}f*lV(X3KWQ?B z97&h=n>6y1M`6~ZpB(K_yiHDfi`H-Trp3f49WDMxR`xEI)fVRHM48+zU9t4Zk)P9= zgIgqD7uI)%ceZ5g{=T2PN9N8@}thDh~eNHSJa$;GK8OTTHmH13O*iM9MJJ@Z9+!{R%$ zvezn+2A7n6(FNi3;}>S8J1S*-c`wuLlV*L{yq>;d9~KzudwkVO)EoDeP?3MtPSh^@Dy=>)#h0qG^n3P6XTLHvFP?le0bNdcQByiKmgT)x za`Dsv+FJK;vTimOLwcetxrvg5b;aMvQB*JQVafMRN0vWRTKbK=P~7xQ+s?)3k?@en zu&^i+K~+|X*_vf#XGUeU&5RNi5wnjd0xG1xz8Q!<_xm=B<;|3)e%rJ@NGsrodijq@ zOTXqCsQiF{ZsLBMNnRG$RmvO3XQP5If{6(a#%~UI#Sg)x`#1*kWql;F;_7M zs%V>|Y1Q>(DxShVgD4}nsJkea+hg-8B=ebWEN`JS^-NolGS2X(G24<;+7NTh1`^da zhLmnVH|FJ+O1;kxK_cd7hazA8e6|O2-z;@%PM5srhBDW5F*W~k?rZq!!ymh_qR!H_ zAM+XMAoV`~E-T8A;(vNBv-pQ(ogS+rJ#sr1K2znvos>nE$@(KNN&osu#M*B^HA}0g zkc6*fTa+V!IA)$B19(%64@69KsT-)&jm zXVS_ucS?bcMKI+xS=%p*9?Yay6D%A(53WOy8xBH zrbIQ=ZIu$inn6P90}`pwRY zzY@KG_|FCSP6h2Mhceyw(yYo{P_|T};WN_NN)yXFTax;F64q`{mvs7142>(=Vvb%w zvewO&zI~^qH0qB`7W1Pt>yI?yp+62{I+Dg*9L-#k?2?OvnQNrvx`cht-O{*AO_R!o zd7q4q_LfJ>t9h}LmF8c{t0#M-Xts3h(w%6%)#aQUB!_!0r-SzJ<$fa3lwajs=#!%v}$xMGMS_aSsqOv!gR)6F|@<-_4I*Stgg`-D>qO&01fgYN^@EBZG0!C zO~v&P%4^rVGgOb!*VHz0dHpC_Sew~W&Ac>9Y2XbVbshfU3?!MV-7t9-WN#@+R@3 zWQz1Ng>On0E}g{nO%zSbCfv%%(%> zrP5|?=!a1)b@e3O8ltq~IIowta770p=;_kz4)in1boKa^juh)TK0Sxd zVR=iqz7K89(>l?qtl*i_MV;t7jOD+~2X%o#Vwdp3F7#d~{$Uq70(G(s^d6?$$%_m$ z0O$T_pm$JEb4>IFrrX62nV@SiZ)Qeu1;58kKg6Y-g>rVsR9l{Wer%b&{2?VtlUaVYcx2c1Xf@lPD|G05)cq*Lg-{4FQ7x4;@( zH?_08b0G5mAhEjNF~z)bS88sQe<3UT0I}~CLq7ikAJkRIzQEUXMd0WC%8zuVNZ$O% zuGGtlD}^cA@CUk4XT$ZsPa$Q*E=;H^=B3@}z?8g;n5m+Zbp|qp6xCNq6+FE=m0*b- z-Dy=6+_S?))9EGtp^H8Yxp(x0&yMr)J!!X;Hdm9e(D|__2Gz^ziRzM&+>;IjN4;Kj zig5bOUP7;{d{Zy_5Tv!b1Ja6lw>xBMC3nzvO~b{wq7*R?Ugec{&=Uxf_j=1g@^fz} zwTB1uXg6r_Rvs)@!R`699cy!ykISc?q#vM7f_Uzw+9u{tek@-EAaB)&j%O8B!WJF* z>wRc_gM2i0}BmBA8;ip)YL-Hw^4ce-p*7J1H{ll+syu(g9JTz{MJmlU(1mwc_ag5NWMW+hfMR*Lge zl;U}%&kUfM>2wC)HIdp`^a%d%iF65FSNh0(NCJ(gxo5a1-|sG*=$<^W%R`g+hlMmV zhU}h|Nv!<$LYft4Ma;NxcH*<=(^kCuBzi4s#@%|p!%sV9weK)&+9UbXrc4@IIMM6R zn>KCAG(tv>)XR^-#iQ`}k$m1{n%i~^%EUo&j>CPI;nV%orgw>K{j15eLpyTliA>T1 zjID9rj`JqWIa364YA}=B2Bud3oB6RRv~wde0n9zYn2R%xzcGbA+_=mW(zg9bxnGt> z5k?Ve)g$EoBIw2UOr>U>a{J3vdPm&((R!8Qe1KlRi9tI(DGWMk8ts-i1Gf#){%l-D z4__^PV;XHhX;Ep#bSkmTp7SyZmW!l0uCciG!L>fFgK-t+Bc%^ML|KFQaNF_VY&vT2 zco1I&OG{j*KAVZSCFBrrav1&y*c^sG1r|2e_&*2ks^QWOPhx1q3ptyj;0Ij!cXOy= zI!Z+JShQTj$drv_F4v zKFy(v_}cl@Ob?eHpN|Y0jDs>C&dwy~!F&~G?DLtV8O{zkyW-5p`7`JPaUG4*hw}lP zkKvq;a~aO{I7@L>;QR{bk2n({_dmG)g)?RqFwXWkEjV2`JAgi9Rc3244xkX{V>p-K zd>-dIoV#%D$9aG^TtxdY*J^(GDQc@-D4vX1XsjM=Y@CoZ8la zWU3QOkjZ!RUqGP~`0Qt>H*U|%nZ%B2EBPP@9P9t1*{1v#a5?~9MuH)JS zDtEwX!Fean5jZ`3;&K|KC;3my5!aRthyrvfmG@mir_)XR?G>~OJyH703c7>dHFr}c zNe9&mcctN~;ap%b?8P7}2ahK8&=VlNgCg7 zls8q%PpqP?=~;et6=oX!7T6!fgK&zgzI5;lbYWE7vF(Z)<@|@2Fri-LaW7NzZI7wS zWbMGf19w+kMab6I>kIvX8KQ4Q_(lBjHFQK`DcIYfNK_F+sfhKo2*{G^Y%x2;cq+vJ@p)5lb;1JgdIFInJHz2AD z_}}8Pl(*Q33*onIgmsFzdn0X^G9#&~x)nXD;9&-tz+V&`XZeARG&$u|7)L5NW`N@e z|7jzV!5FUFMBCxgc@qTB;&+M5AwEf5n()QqV&U61(Pk|QTUJ$FL1ogrk*oh~I-f0w zB0^Xp@^S(HZWDxU<$vSCuC?N6o8fCczil&ZcH7*ns;YQV5r^pNMO2uDGOeqkEEaQt z;1d=ShbYTH*=qjmW>{-c1bc6gmZ40upb#}uh~OV>rma%0fuu)~I0R`CNU@y0hR%%P znXh3;UEqTS+R7hzjV9lAq(fDeaJ4u@%h`}yiL!7F9VokkGObC$*B{_KKL8QU1-nDk z@7*Y&_iQRRI}_vt{)=d6ByYF{iXFN1N9cG8 zKaiF2!CMgqJHe7ISa9fZMq|L1@kh4OEOyPrU)oC3ny)dd3aZ@@62^dSHUAV6Ixhox z6N=D?Ui4Cs=YyPW2^moIZ#Bw#^TchmnJ(T6!*Gf)&Z=>#Fu=oZ?N<&+Zt>Wqj9mgyUh5!z0=UQaQ@> zU=xREb0*4;@L$kohb!Ge))A66ft1=kBtmp~KgtrgaR<6QpAX)Fh*|~?6v~I-h(^Yn zkFrHPQy6pU4$P4k`SYU2N&W^d?23zjxdXcc2fr#xXL2Kc%+u{hy_4d$S#w8zRn<%( z5HTX$CwCs?mD~+7yOPfz-AU70^zT#6mQWx@I%AnPz;^+m$HW9l^I1W&3&NE_Cw{NP4h|Lv-^PNXJlCAY!Ij%tgR!eTDOz@}gY` z`ocT;^$h@P06OgMSF`;BBl$G;OcfleS{=2x$;)$=L58ZiZTy)n4R8{Tg zM);MFd!0siUOfg-rTsG zCbt*_(lAkuETH9*_J9|_GM~G5V~M zp8vg@c1el%RaJ=?5{Dk=VUQAd&pnuI*Z6BH65SXH1Z5h#Fjp$d*6_u9V6Nyub#%H! z5Q~NiK=$#s_sE(37jShxKcT8>0@6OZFjdP`o51BL45_FGc|XcVa^qf_)j4A_+=Q7? z8y&(ZS3q7jC6u&9Sv>w($7kT2y&aT-ov`98Mgn+Z)aLs|Y6{pBUOEh*3YS#UWFQc*(}b^elh=4VvD0 z&BE$TUp-fi1i1|5t3_ns5Yh@!hV=`iAtPLZ9=DBIfq7P@D;&GQ5znit#Ii{oqShgl z6|StRsthYTB}*FoCT0lVs*qlSJsSNP8Bvysvi_xu-=y!+!Cy|rV)CI(q6aUuT7qyXI%{Qr0mdZJxTkC%Ys9|`I4 zEpSE%2g&${V6RlY+%X|w=uE8KfMeALp9EeFY*BFu@DV|WhXjB9M=*P(>&Zox-V?YW z)Bt${_;7}v3{n+b{wNe^355|yjNL)WsvuH>UQfoU0y2tV5#TX010{FNC1eYFG#GSY z$+^It&;SO$j4Miym*Gia&v~;Ur=6Z`RU3ML9(r!plS)ibLeWD{V{*J*Pdce`yDx+# zU3zj-ZTEHVe~0b}ehmF8dxi9!`8Z~%K6;X>ifsgSo8)QwQ!*UQZtV&CsPz3$VmXUP zX<|<$)V&V84md%@t~tmNVR$d_HQ*)+JxH#iAOV{^twKyO?9p3KFssP@ShxriJ?H|9 z20jL!8^-_5V)P6A(JH@v2^<7$Q1NfT@n}#uSkyN@gAP?I)SHp%D40>8CyUe`RRLdk zEK`2OBr42*4wD!vSXBWZ0PCTENG*ciP~vx&(B%OwQ-cvztARE8Nhp633N-+~Fh=ubur8i$rmDDXIUyyWYu=+P2>Dl7hk5~50t@d^ zmdwZ;6vRUS+LHyA^X2c-9>H>ifBZ-_ZxAZadE+%UFxwG6+Cy0e`eVQoK~EH7K;Hm7 z3m6v}e~O!9U#jgA9npjF*l4{RmZJV6z$5V_Rpk$obtu>xDj=T#YtLmx1AhW*k6r~H z%rP#|pq7}H0q@fkfT2DIj@9G=r>#Vohw=Xd7|&`|PX#Gij{@Qa*tjKUI^%xOo$5tWRpXHA9$NiA=($AJH5QKO}94Ig-1v2&m%TLKwfp@+Dx+V}7J0wgB1vQr~2ETR)m%J8% z-;2O!t1*(Ws6bP+>I!ZdfxAWEkrDX82>e_G-VuQhYZ&dz3jCxMs2FbvR3AdYtO)Fi z!2gKAMG<%-unQKJ(+Mp8?8^w+@p=-}Oi0%tS)w2V&5EdB58O|42~2(-IO9n*YJqds zVwMcUlY!+QDo|fU`7U75fF}R52!*aHSoB}9fWDc0TaEif;K>nqc?8}KybcPbLV}2? zZ-BL*O9YMuLHpT6U=#4GPh!|nwZa%tQ$2*qgAw?Z2wV|?&qv?}V!(&V%Z2x9zmLGzBXC+qb^jF;*+lrOhlqh85qNS0emVkgh`{ee z;BO-EpTUTNrY*GQ6@^R@ct8ZcF9Oetz^_E$gAq7*KBAyu%bE)0M&N-Fcv1vj7=brO z;P-0cVAT&b3#y`8)l?ue0`~@Xyrx$Y3kL5Z;O@Y}kYa)H1@Oo)+)0mp#+*znMU=cS z0(b`KxPTw?{|?+OL%{?j0wJJrCRS!!^kk{bK*=QF{YWgz!N|k7HEcsA`Je>z5-AA7 z3xJ1(;pc#lLjjQ72nl>7-CJ6HLgLeSf^#s(ye zo(tR>bTRw|eH3tc7~KQh4fJ@Gz8LtlN)L)ED^Sn}449^60SADug$eiocyt*35^(Bv zJ-Ed|Nfq!U&>P8!k&and{D#pjz>kH|#{v&h=x84TCZb>g7&Hx+0T+e|cnNrUn1J_z z=ZDdc0>2tYzYe@Ej2@d!$S%;e4w`|>WV&b{3fzW*axjR5B}_O0_*9sHX~5rre!EJ4 z5%@|NeIsy2vAX#}{m+1#h`^E$N=^YAK(_!3`SscW3%cAsiV{)a14Ad3p*wK@Fai0% zOF@SmS-=Cp6T;|^0q+LAkxJhHJU5KK6Zjp_H4A(NyasfoeTe)41;@c4hLO-Pp)I05 zOh6j&@1Sc@oCmBAi|Q%B!|)TKUah|h*a5m-#pS?Lfwg_YufSzf=; zgkLAnNx<6c3<9qN)?RB6_#m)$h}3;90&m#>m+jJ%Q(zJcoGZY`UJr%}+H6A9 zf}vbxh!e|M^$-F(0q-o)lfx(zd15^9#ka6Uj8^bVz~}Migx14Dz^NGg8vYM(Y#7ey z0EL2K74lIqL&9LEiVLO#w-2lEBJk=r_2h`Ez)|2rC@^2etRr0VFFlYru$2>dDdfoq zBTa$F?boZAl2*XMMPUW)QLrxz8-dS;;cmbQZ-)fr0e26>1A!-m;ZeZL!mt;(G7L}Z zi1>4$$2rhR_>hCa2dtUw>_%*YH49-;xqfr#WfQT;JOF;}5H30kJOi(YXhGTtf|nf# z%?BXCS-t$AfVkQISl5qJzQK7og~FYxu^@)fT*fma{f=km)ZXf9pN+kB1(=hygf zaT(2v#pP4J2bYFJ3~1m3z4Ew@fBHEdlAhqYlb{SXVz&oMJTzfE^CT#T`0$gom5!Li z&qR-$r0IDbar+xAFPMZUhXelw9H-(U;OOO{E#em737_amd!`JYzkxgPFHX{&Hto$I zfmN?o9SVFBPZTgJaO%izfq927=$4dkaa)d7;8wZS`pB=R`A=WaoD?f=Dk^K zyu+8YpKc*;Q~4ub(ww}#xNVQuhO~hD4!AH3$6FCFz_DrrcHjv-ggwCL`A-m)xEQzX zLDEF+<88j8t%9jG*a#|Ss1kYsYwtP?h;i!25tjT!24Frl3H3GfD_p1?+&HUDOJ{Zo$m*sh+sdqR5M>Td`jH zOiv0`+zYt-u@Ei<-gG>~UjcdAA%@6zz~aMo#bmtKDVo%J@D4oT&|JuLWCQSpQ|h=x zo7oQj&?)+Hp34E*c<)M!qWgibh1qlkumyC@9S4BB18X+F06dE?_?q?$HglpItMK-e z+RatKGhPT`eOD1Gp+!?aVC@|-VWx+G`$M#9N3s@p5wPaR!@%M-F+81;?fze2@yb|Z z1qVs%ZV0&Ns|(0oz~Wu9B(=g!VDVm=Cg4?I@s63+_m6?a`)1k*x(Y1bJ8PiU&+d*z z8E}0S4+IwPqcxOqkda4GAYM+>7}f(nR?Wc35n%Dsn%3Z7z~TiqO`*285&2~{P2s`7 z;>ET`YJ;p)l6X6L6s`%W4=2E9Q!qXdQjb6M3Gg!DdMZ8P0M;~N^ufSefn|$9;B&yc!{|qW zFN7)3dWgz%MK|rvg7SY2z65 za^P?iH+#1xKIuY5^$_V#+>SY`=l#B?&2<-DVosR&JzkY+)sxTrp5C5V*b|e_>QKsB z!H<8BS@<&7ouOTVS9hWHFl~0df#eLF0jWZ}?|~t``bV_M&}J*J7629R)xej7C;Z*MYiKZuhg4>Z$RgOeRy~_PR(U*hm-$WAl zJv3%_0}D2Bh-R`5Vjk9d2)v~n1LC5(CxM!+Di9n0L55PhF$8$&AEBJ^?z@Oz@HbKE zlM#=-f!jkqx@jZdqhJgaIIR?r6!d#Wn1C4tAgG5(VM~Gc^EduYyJcP#gY9yttx+)H zDVPjR$tF9?Q+}ocV@O}D?qBBj{Y=vmb8vqiEYX4md3+dO{xfaWW+{r>uL_Nf&Pyx9DycHhO0-`s5h+ZYe=GwaEIwz@6g~qiK5b|#^J8bwXb?8*C~&9( zoWSCn2W?9B0gLY+nyK_>fW@~En!;}ai|-=hRQeCV;v0$jDoz+ovuKzu}@Y5Xj(_@F{F;eKH8afQg#!a_d+<0FgeC*(;(Fu=m<-v%tcyU?~G6M)4x z7@7qoVDUYMuy9Za{3i;;#~E6MpMb@O8kz!4hN8!61;O6~SosOj1K~z8t6y1(-Hjanmpok1e@4mED9A=YYboV0Z~+)rLV%!8#v~C7Y*F!LU`JF) z;8WNMtkfyL;S2sZ4}-B@2-o`vi;$QQ?)C}zuj`46wNn~ch=TcH3?&$Ur(eZ4GNK0< ze`S3AA9SGc8agr)a;K_#blZvS9@fq&bX+^c+)>5bT%2D7xpo4N@(t+Vvvd1Z@hw%d!v2=*Ln_s?&b-+>ZTJZ3^ z%UGH3;1A-$8jj){F4Nr1R-a?AHdL0Q!tj$u)$HWc{L*C_3~oem0ffo^g*u-C4+7TI z`wLk621uye=>(>~gv{!v(~kfz!!J>%AYC+b6u5sPJ_1wmAgGZFdEyZ6dRE2qDw(ll z(q^@ddD&R-K(@E>obO*!!`KA7;KXuPdOM_2Ye(&!<1|V?$k7d_W)Oh z(ccEX7KST;W5f7A0!|3S$APm$n9uo>4yNCf9{&^1SX0{k1IY^?T4}Bw1iX&NU8DC0 zAH%Ko?Upd@GW2UH+SMlhnO`AsqH3zz&*-ml^MpDJqu=?!FN3aA>Gynthg3OAQz9yU z0nPvx^#xv!_Ot{3;D21BiFsX5V`PLi@;I>e@t8c)RZLM+;CE^YsrnZ9H1GR2Ce*ll z@q+-LC~hsdy~r2*O}h;rD{eQdTB4Uv10TlMU~;d3_W;KN>qP^=r-2DR3)2kNU@Rt3 z(6s=x0WadsuVabt#;yDjn_6`du=W9)5LF5+f4HX7zX#SnNE7si<3b;>3G4vYK425r z3#@&(Ch!vAvrt72Ji?O58z|5Y5#c9z#dWMl{y=d8x}eR7E!}VgkE^2TNiThe)wW6b zsZaQ%ubbPd=n`Y%H^`)xOtJ=c7Ui!37uv8QQn#UJQBQmz!QMys@0mG!CDgdbBGmUo&eUq!4r6nTW&%AM|5aS1b(|FUj8b}q+c$t zU|mv%dk{DHYEK-(RzZPz9A!Bvn{j& zTLZq<(}HXZu=dTN(Ed2^MW~#l3aC3R)#U00p`G3kM2E(m3kQN1Pf`02uE=oK?~cZz>D|-9qVU$6SqYm zX|d}3ju3qTJ_SaBFxJ@!QFJ_yiD50Xo+sHf$!zQCtcokSGO0LI9OVcmi+<5v5g zRFJ+uhmh`%B^&G`nlS!|#}g%)@|Uwh`x(F;cVm+Wy1=EtefQvp92Nfwd<{*FRQ+|^ zc|5Y&l__s~1%DB6>g$>09ff}g`Cz>wS0Iz)++J9e5}+4 zh64LAFRsVBBu@Sb#zyf;ozlJk@(OS#6|933hbwy#(d*U|`Q>^n*SHnz%TO*p;1K0^ zO{}TR%n1A{A0CUw7ou^)s8Hh{^Ws?6rS-w{SU#iJRZo$2HKKO*ef&f$%N;xi)n|@V zY$jSAcwfy{AC184Bk++3{1+b{$GQX?L2P$-ru;ds5Zm_tnqmh>;8_uPV+8&z0{ z+ZWc5-@0mO&4Q{YBJgJ3ral`Oq%itUPbR5UL(l=d#+Ok#WnNRL+F zSdX6U1Dn9N0hf=~%jOXHF5vxPcqH&r;7%&P2l#M^9wdb*n1O->mEm#Vxxn!%eg^o; zNIjVazl#Q51U`QP->#_i^aoHMQ$>M_3xGex(;cwm>8p-x173srBK3&+Ev6w8Cn+nw zB(dXu6b?Q64>TC9Fw6!X)F)H^@Lg2UKZFH(CbEF4zz4u{D?$o(d>E@BES8$64Ll=o z6J!S!{|-PsSSSp7%JSSuU07f2`um? zDi2j<1!tqd2_cuf0lev;@=#XL+dm0;%apZCB9i%>IT%Sf%Kkej7`o3z;vb_YS5yTi z&qJ*4(33H$0{1q(N?|ua*wE=ffQ1{S1)hG1zrX`a~}S7MVxQ}9wIG( z0;nIa#?Ui}xmdUWE(^*&X}bso=z-?b#KrJ2mIo8m2JZ%ry{4BxV-O9@117++D*de` zSfzK$B>OM}3VP3_uqa%Vs?wJLpT#y_ui{0|Vpf3*^y0TjQDO8l%s*j1+%Ir47Q||W z^yOGlh2ckmv)f?(qQ;DlLm+}oQ>X**k+2|K`aCR%Aa$wo4gim736}>|lT@N0Jcx#_ zsu@Hjz~MoZ`~uc5*~)|}IU!EJg{t|~lj6D$&Z4km=j#4vdU1+#YJQM}49W;1$F zrk9_)2@9M94jz0~XaHuK;I!f%<9>zX5KKJTgJ0H{F6^3JWe$T{HwZIHxu!eu=fr#3KdI~usEC%x4M ze%pf{ejdszkL-mDPwGjL%71+?#@|j96siStOW`9E{>G6iAa@@gXr0oNSt{KLya?ks zL&dv+2mP!k{Z*XsFDUelp3G1!c`< z0GVmNicfxm9-+svz=`Ph>LXaU{uilLrGNTa%^0yAtr;ULfx}~D;Bn*uq+YEjdZ+BQNj?Uik59S(3Zh!aWDU)-}PMgJTc3aF& ztKa0X`hAvw!Dsb5ykK^k0)|}YEpr-gC^UFOsYdgyi?!T3tFbm~@Fx8-nridjg!R@r zZM9|ItbKcJ)|)i%xMfZwxo`TE$z!KZn=*cyds43K`NT-q8~K5g%pUZZ?RKx%W3#yf z4xi2D$kSRuu$bHqqu*)vS^`Fo*=KYItVXj9Az|?v&GuYVbua5?tu|dGYoNB+>X3-! zt<72;5_Pfix0tR7HxiZ_bLm*wBO6+(k(lfk4|TI)osmN4=z)n6Z}@6-)?bu%nn1qXmR)isS}TC36j%o zuo%t$fYWC-7#%*ZLK@VPHEV3}xh)R6NEr^N!C_DoSlg0iB$(ZPgWch`n0+2hq&6@A zs3lw5#bY#Djeds>NfdWhQ{MmXeCdm=@VwdSaa*iLuiI?&IZQsk$y=SI?OvzF>@ge6 zW={aA%kK!7eKv2vYO?!{9*4uiX(s#L8)mf`HXKu}&7YV_vlc9Da}6mq)DD z=?^|M#XQqK+5C`o=EGCS^r^od45HnTI}w!58nWo;%;(A_NokI&)^ zSj;A`)95yYd~b8uy>^emZt?^?HU}1LPAu0fCWqgKAz?FkbBz|BpUo@*yTxud8z9Hw zwjxZc{Z_Yt>Q2|qYUii3S@&d*&1`X4FeX#!NAA1VW~lczQ<~_dp$;< z1$67Jt758-j5<{@RZk_6tif6)GF4~FNZ#74mOA`ptb=YMe0p0p1SW7=ZEmN>YIHh1 z0UuUe|2q!Myj45aGiXGF*gQtF)#|p|JZ=nPb?NT4+6{pK2Btk=wgr4n1d=ykw7TtB zt~n5Rq2X62XSKg;a|R=XR!^g~StB^BC(k-LtLLH{aQbTYDYVJB0dE9r^;}dZD}SH^ zYf*Z-Jv&c>R*%Prg`&l3HaY^nfLR`s)uJpmw;f~6YcyHC0h86~w3z}%gUxJ4%14q! z7O={0ojT3$oib@E{sQgv+#5Ef7FrD;+YA<elIa2MErh_%>y&r97aQ)qGp{dF4bZ;@Xsv@P@-aZ?*F?4)lxSQzz>wLX8gXV z*~E@EC+1DR%_bHy*rwWU9#^H;o@N_qg2`_Q_?-d2+vp8g>^=`KS;R6E%vjOcOs0Uv z<}>0@WHEax!Q%+ne13z)VYJz>I5qIH60Bnpy@%j?hDgn9P z?z0=Pk_(uiyPf~K3byI}3>(|gW;YtK+VB|6)<6IWU$qTZ!*++oW_Q}4zS)7gPX6&T z%-Gm#cVo`QV#Mi29cO8yr7VsH%?^*lYqMGmZZo3Df;mMVD|Ie$)CjT|vCc3XOiqW% z0_&Nb4&yBfP$H;F?hPdH#8=s42~LyOjh+OMgacl;(ZSn2%l=I88yv_n2D9IeHLoWS z;Kt|Jtb_p6N1S-kX^#W0mH5;sJo$fklzk z>ob~e9$4Z5L645L7VV0oZ>0QyCon9K&7 z)#o!>O}y+Rb0ioIPP5sIeWD#H!)`V!r5NyLqtW8U=tq7P=}7Pf{3Z(qoC%v2Owyi! zQfl=$Z9Xh6ky*_azt6{|RqR*?WMz-XV)Rh58|Hw?ZNm0Wln&*t zm$8e7ss@Y#gV~M_AaU`2YuNCh!R+;$-2n@>_I`W75l~ZL-NCI*_O*liR)?5aaWs>c zSG8qu%UX7=Biv~)TKr}QG_<>++)ZPdk9viT?&z>sjBu6TYw#Pr_JHw!@Sl2x*@Cw? zgl^jEt@iXLV=!9eBRSs>@j9@)3|K8bgV$@sQ;J)4!_8An>DYB_0INI4IRC$UXVg~7 zwcTjzb&Kh?dgWJJ2ETtJ%SpiV8;93z!9y9h-|sV7#Ykw+4R5iOpaD~i#U={vMw8#9 zg>ap-xEjGXn8p;P>lC2O5jUR2=^rembipPzf(Gl9qbAn>cSY3ry0L&De%`861vNF_ zSi-FcP&4xl1oXT`YpQeh4J7c}x3F|>-GZNM>U>OL)Fy5NW`3(ftTyrN&}wnotyV>m zx}-*o@gUh~fNmBi-}x`rl>fbx)yLnsXLs{C+gO(btYWdzH(2oN z6dvVbj(TSsyEg%QWCK9JhiBAQOTfkr+nKYMoV@FFrb)|?H|pZ=+u48w?0zt7dhyWE zhZ)lCxt(}*ef~skrQhqtJ{KIq%RQAc2sysk6#MJ{@P@-8mv|$9%}GU zCo^xFHgDX3{@rfYIauc-B9pe;zd;jsJ+!DTBB<`g>XxBpjM_48Sw!`IBV>%& zYHKCn{|cDn!!uv6#p?871``jnwJ~{vMoVY!Wxwf?&GNDp{}^F=ixVp$12_K6TH{ZS zvqd!R24wMwq{f!16kDbyF249lT941a&K&sDK?kn0R=Syc@opUd;X2FGi9Z&DKM!BU zvf{++T!-JJ_+Ns!tMF{Ae-(?@iN92PnE#`SwWD~GSX?IXZQ`~j5rmKTQ;BF4{d8w?)zv5^Y>zGd_fnvxOBG%SsX-rL8L3Yc++mtY|YUD|(BVi(h40O(F^L zkalH;`aiJ7t4fu+En?d2qYCZCvYdv~D07{b);4O+3QtLU8ZBdmpO*Dc?v2uYWlK^X zr3^KbwT+o;nABdog1MfP_GTD`%N95PjAoKF`}cYh zlNYJD3yKrUU9#eDNrf#kSw*9=4K4EHnQM@gl>GuL>R+}!JD0KjO{CLpd$0o<~>%o{BMoA{xVsuz1%l>bf!TADZ6**x`k%-W-@pwDVrqXk9#5IsxM_01K19?}rU zEe3RqZSGp{P0++ii5emm)kBx+DP1C$rHO+Y3zZGHRIHUs2CbH^5AH8b8(bo_9o)aH z?~pZ&ky7dO9ZxgY3(~w{2#0mjnqeMM=i0DVjP#LO4ByR22kF@G0j%QHGTn$-H04^8 z{e(;+x1I=H7kn?ZAK5B({}rXUGIZVlfwbYyp87)zbo+>wQaY)Ska9${RFrpG8|NZT zJ`qAG>?Qo(<8EkdDF`JL#8wm9#Kq}k5+ zX~9^ikqSolWn{6mXLM%0qCY~V6-;t{*HlU_ja@M&HMj6tZ&D)DHtP@y!PvYQ>9IZ} zD|tB-fb6tnhX2YDHU1_m8p3 z_2xHfqNl=Z=T>-H(O9Xqr*UFt>~^gt86hh5@Dz-9C22K8F;Ydm+Nu<%iP6UC;5ZSB zaYTuTw_-L{(wH_VyDyGl6#KMB+q3ixEsls#T0L}KS7jUlA zZ1<+du~4V-V&%>hYwF9UKPsDQmfR7HY^g}IT`DS)&567dulR6-G|{`7ktd|9-mc8G zsLbNKj!ZGQ%#uHvCTfyG5{o20sgtp&kw7q7s$9A#Pa85CCA>m5@GYV(5z2PK7ndjf zI_Xwc5iiZVkR^?o+?u&EqYBI(b`vuKeteafx% zDtgG#jI1f`onm67n^ZOB4%9E}b9ZwW%`2Pm>KJ6@Rx1v*;I0O=x%A)7!&zbaibGcE z;nEIlb*Z$e^g$MvBV})~(N)rzEg8=Ap4zzWwAux;WYhKt>09a2#;uE@?e89<`K4`J zGUyfQ{Vf??clFW68KU?W*h75Z=hdd|w}xox{UqJi<`B|tYlidF{@S>Ta4durF@zXb z-KLE@9Yx!p8=}pTp4^&2M@XBuW^^qYSXqA1#aU5Ew;ZOfp3>4|L_Emw_$jA(;og!o2C`?pO;TjuT4 z;nWwm-;+{lE)Ru~U0k(`@}$-~76_+q*wHwKCP;7Y>`7y!KX-P)-%h*mw`|O=p0rtB zrWS*SBf2n@`^kf96{;i3%68A9eWiBgWoYKB@>z_GC>ye;EoFthrMa)a+AObCxMD@a z$co+G$Vl(ol9vdPg&#&z?s+2v!WO;pA^zU=<`W3D@7{br7GPUNlf*o8xoEjqBYjx0 zjmDJ)_T7cXN)d%p$-C)N;{H*r;za~u*;D(MBRm(C z*i6%wHc8DpugVm1Bu(Yd z(#Q`V#5D8Cho5xNY>`vw;+IO1{o+C$)r`x^-odik!W=o2$=%Yx>_;y&f2uT;on2Vf ziG)vvcw1?(zUx>SYS(kMsjgRe?7>FgI~R`jvd;>+=@s9c)&WwZF4%H3FeluK*Be7srF-S9pZ;+Q8h;n4PBhxYuc zwWv4oE1@F)s-37^@m2GBxD;IpX65YKEuHzw)J!w&?*w!?;YCg9!~|CPO4;QTgJ@>a zeOk?YER=L4w7@2zB&;bqB}Y+w<$aRxR7ZC3eyQY?ybRoQs%>Y@IV3zJGAuL-<)FHl zmARZ{W$RQ*Ag{Jm&HiKow;xR57!< zeq7!n>?%lT}C{qWxJN(e<3_uD_?%>{Gg4c)gk(Q^tE#oDc?Ea$&*G_hi%IrcG)5XjZsPcFEd zNm=m^#60OU;$`u%SsN<1W^I%j{%<&|{6+Hp&(<;TdaWo9S?_$!D6YIN9r#~IR#Ylg z{Vx;Yq`eA5d@K#T`fq^xzqe~v6es)IB_^VZMzXJe(31si%?hz?u$KQ+pIR|y;*~trkrhwiQyb6+S>d08+_IreJ_B-jK_l9m3F$ji zsHdaGcjG|SxN8P#k&nAlX>(TO=VMdp>QrmKqRy0%I+geESS{MCoXQKe6zOLg-=q~T zoyv7-A>2QW&J=jBg3l;;WO|5Rm`;16xBJs+8NE_|e`DH+YVzXnD1krGgmz)B@qBL+ zit$<=-<0mJ$3DHv4`f>O|z(#d$Z{TI)d-dro-r*@+NKQ`!TJG z;v~&Fq_6tQbCbeMc`WThoX1x_zPf`D^jLXz2l_E(MRELUM~d|vpVf&jV3kX`t{=_h z&2wl0JG88PNe+F7v4hX?AzfgQ#Y_3rE_6H;f4>X83w5##bPOxn#tRKJAI?2%ptn*` zJDKP+tY|wwWP+|5-o%XJJU+%u-^Zn$g>trkIiZOX$m^aI|m}~ z4^pc89jD=qx>9q)gBP;0_YwPUG2{;P?Ml5&QzcB% zhR^6moekPtnocT+U6@d#;pN@v;PlF0F;m5AH3l-B6xIuo@_0sfD!~%ly3=3`+_TL^ zGw2-tzKh-uxwrO$&qnY`y=b@em#&Hj3ug=CP`x5vRF{P0UUV=x;(OES!s&B+3%#!L zO}*)Tkk8DoRkEy%equ`z(*g45Ix~+T0@iCB?PvEnnjs^D%>HR!Ux@Q1QXEP;p%OlY^)} zgKpqErcgVZeJB5M3SCBzl|OJdl0fp^vnS1&;&IRF(#JpRp4rn2_zB2L0zpHA=Bw(melg(s|kiAV0Gxwc)PX-CcULTJi&6i~Brd%l3) znz(kfj)W-I8T5MXsl80X9eA zkAQ`>RsPR`yQ;Xn^P?CP)LTAf0j_-0LR!)67Db(btMsHH7)RsEa2?C%7ty;C3jqfK zuH)Yn(I*nut<(b$V&HR%A!0V)QB3Wc?bt7L=IbTelxr5zti*G`R&b5w#zoXl4SdQX zjLGBtFQCNOHG0wx#N+&y#k42w!yjHuJJE&wmBrLd50sx=jEos*0IfcpuP3L$d3W$)Z;Ya?1A$a(EH(f2hOoLr{J80vk>PJoX_IihVw0)pWyr&XFBBmi0iL7uj5R7 zT2FL1b8tFvb_RXG)A~#@62OOZ7S3Xv%WPZSZmCT2(rnBfeUbz~5`JnvDYPyZyHgA)jWPoag)tlq0;#^=cR>cU}3m$QZt1ypx z?W%*R6x#9fpVq)(Eib(i8Z6fy*2_t9I`m9Nogm67-{PmaeAv^}nR)xGA(P*UYg^FU zpmSpE&jS{@AovR3`ZR5os`8bhym6@f)YCMRp5XKuObSgm>q&bQ55Xy}P0L3;L!XFA zJiIle#$Nu@bI9fwdCK$Dd`m!4CS#kPGy%5>R}pRXbh@ej{Mn*EMCA!8yu%e96QBP) zy{FlBz*MlkgR8L5+X~w|T(gdLY7o0Uq-Jwm8}M(QrfE9=EU&x3pF49FAr6!ZBU^Ba zcpE$CA>!aO@Z?%E7bF(4Px(69CS@CN8?Xp=F)+53|Fn+2thr_G`s+bqCvgb7=HRSq z7!1n4x+-NZTu(=p4M*8g{?SINMHqj-Q63ALmuYLwn&e=xgnv^;wY>YwG=V1Yyq96I z#eB-kv>lztm%ofE1^guxcDR@t3?@O4I7H(U5e;WhrYh7FWwTLsoL_nw!QkT!HbI7u zTQ{M-g?xm#9OZMwr3GJwOSA5+ffNiU9ZsC&h4{;!FeHOmk=owJq^YsD34VBGRhY6 z8Lv?7ErKKrDGtHjA_lTi7HL!i%2uMRh0GP=>w~hjd>=%xC0V@dHmFbq71Cp~gF&6b zC-|3uFPSI4ihlcehgUKDF7r`99d>pI1|1OslhNXFl!*WlhfpRPWmoz7SE;rG=~z>z zfgn|ZUDZis&xtbo$yaF;%sE%kh-PA^Y7ggZrU~gsfd!{HM9ssfag^V-8QS&dQ#R9# zmg{nYL6;!IEB%GNajV0bjo-!&@b#N%R@~0qVDL2I*LTpy{PboT+j4f7U~nLKL><*f zLi$3~*}!S3EL~p;rzY@QaOrT!ShF)#VBCYUY#{`P4reSCIuwaRuvdY!7G*+`IAnd1drSCyu+wXNy||p_`*6{d zUND&mx;_nE!$aeJMXaQeD=kDN7pL37UC8y@5$31GMXNa`6NaLs<+{GX;9SuPVnxj= zv0_EpFBmM~>jk$Ca5#Tbv(KPl@Pue9VyH9~&7x-P;9ziXh*mvJMQBxl zwt?UK8iM8+SdbFrL-e2pTzmj!qH%Eub_2=|^DSU+CfFB?ayC*P27){h`Sk zX|Lt0c0$G(z6+O@hbIJsBL#EBAQZA@V=s`vFYSa1?YU+b?UJ763kHQmap-U!21iqV z+b)`wzR6!xk=RDU%=34_uYxpBR6&r7AeGGuauVON3sF6lS3-8P%afI4twg14K5$j> z2D_2+TvNlNQZ&66q>0?Q8#8z|9|w+GN~edjy-+_1e?(ah?!_U>bog^1f=|#aqKxm@ z4cqSJ-|VK^&WC1T^n|j5JXedFCHSM86&}{2YyN>(?cGxgeha*%wlxKv+$v+6UzJd|x?KE##NVY3n31 z7nwPfKqm5%GMdH>duRe95Av>iXmicn2ZO;S{MkLU2`@l7GROma;P}P-sXa8S*SUv- zK?B5!1A39+SntI?QZxQ1qbvz!lLb?R0}D|;mj4CG%}S%lB8sAPEJMv8}yY6gIMmwQQ7K0k{4deIZ?!VVDC|2y!p!#u(%S4b!C;lJu|hf_Bt2czC{-w%iZV5y zixy+ikBNLfM9|^otKOjR(xJ-=(CB@7d00@ql$9_Od1=GUQU6~Gy?6PRy?C}1@Ivl^wmLbR3ONP9r-4PV2^;`E16-)!mNSq- z9@GPc+F1y>BOB{Te{@suC(nVNXjj!^2yoH^VLeKKTZD0dG`SB}ZmN?zCIqm#m?nXR zJp?uauLZU!*aLi2(BUCLe;xREhK^iT=vBb|!wry04`8&k(2*gEg10^h1zJI2gbZW1 zQqnJgsavNb6BPmP0UrP!D>G1XegPqy(W9ZD3rlubh|K~TK!T9*l=71mc*xkxI3IG_ z=}4*4(9~k|+^i#2n4^TE_dJfdzK4$FD006BKIYPq<4U_D_`UDYZGm~vuc~)g-)#>g zobptCDS7h|LeBNqk)}#B1kINAf_)S`=}`=EJcSc`JfZF;;0?gZ3O)~fF#?ZA_pSk_ zh3EmY4h6~BbgC6zL4ObQ(GkoWazApHU7!gqe04YX+`fOG-_#O0Ij0V-jlg$w&ssbWPfMZpGz#D5{>JdvW1*d^QJkZ5(kSiPkZa+px<|?5w>=~?Kp+GaxMVQV6 zZc!K>XV0%Ckp}IIIX#!m8)(L-MkT9W892o|>dWa6q1U7(Q_B{Ts1wP=>$+3z4Q}Qzk`hY<;IT)I1F$bwV z0`3i50o-0R04yfba}o5_z*i&c?*q=BAC7^Gz?KNy1UX86T#koJvcT`rgW1qXjC|pv zA7N69+5k-4{#lG(&9^mu#}ekcmBsm7QiM1@_|1tI)#6#gX& zC#9>+h4?!};l5GW8-)v1jP_*(o>dDJ{6-Z1JPKcq!YPewDrAYmV}Sd>1#&up3uiqK z7f#ZVfNH{TQE(9jstbzN5i(fy8C>u#u3YSIU52En-=GFZVS)g8q+I$GNjl#X7 z@c1bFU=&^*gZgSp~QlL>uQbpA6OVlOlC`gM@Hb&z{eKou~Z2S^ZGi>HK5}H{s1Lj+^s~x zWF!J1U_bD+%{o#dGf<+}W3oYF2_1}d!mVKonB;>J3vmAkd<*dK2;3L=3n(ClzsNH) zfD2T*nE%8s>=GD6>LnTKm=Wzh3#{Qj`mTdB?^{;LDjH7@YDzacK|;XA>d))#S!#Hz%NJ8UjyC{ zLEj6!3v{)EXMrnZx@aE?TtdMiFo*;tOxPkD&m$uQv<3ba^d1U*DDc$?`WRqck+S(h z{bJy>Z8~s^gOUaexE1;`U{5x=V zL{w+B#jwLqmO7>WAmHwx+Z8+)cs8)QFL(j?zyf`sy5KMh7J}gxrNVE(>U$7EA$_~> zdk_K-1eV{2Q26f$Ru7S?pN_)C8{x7YI&uO`VvYF;@Uhnd;R3P=J_5r5h2gCz0jGht zm+8o1L5GbpupGYpCbp2VA$$k$ndRXg&I3+c5yl&VV_!r>hx55H`2kst$V>%)zBX9%Yl@YiJa8(4>cSQVI(Bn?fN%-`3FiZqi zgXHa(;Um>TSX36i5`J4nEHdYSUp<7+*8msbwG%Z+-vM5^FFZFiLPOhu)l@&d6XL(= z{&22eh6d-V6%Zsxgl5Vi8mNlKn~+Kmg!hVCF@7WXZBcks6rMLEs^Ix3{6-Z1JPKcq z!pVH;XLxWsm~Ro6C;5@j@Ydvs&iwjkG#5V}cm5oYgtzl?;?j^W6_+CZmbk?6pFT&8 z$9aR}KpK9_aiDp894?xjMkEV9|2WOaJB8b`uy7JODLj^FBIH-#LJW%>l* z$sg)SdlnibJAkwKH^*tGHYad95w8sC6xMh%9th&e0-_(MhD;Wi8^55N(rFOqz2Y1U|$5T0Nw5UxKKVUbxkPq>7r#JAXx62M(iHyz$gRk?5f@q%`R`ZYqaW+YR0X#z#b7=b#{GadeH!L}KxA^|5JO=Vu=tWaWHLVB z1WnD%*+$4mstcKh%m==BBD|?QZs(7jpdaL2M%{IIRZESc)()h?2%8Q7&H-I@#~fe_ zuxj&l!1zt@B)vWGK5h>^ttT6xn%r$ClHxOAd<^(FM5~LVAh7ycnc(l(6&quS?yS@w z0lW}c^Ivs4A=0E<`AQ~`GZi`UZB zzCQ{qUQts=&=z3vs#<-e{&8UO+FCsY$8<;F05^~^p5Nr6K)lbUGK>Ni@3w^)7+DA` z-g8qM+y*S(c~ceo5?H+drYfwt1uxeCH&hxl0E_qH8Y_4Vuy{vKmKT6Yicuh5m{T?0 z0W4meQ+sp*SiD51(&Mp;5--%L*aR$Iu4|$+Fb-I}Xs0T?7+Ab?r{XeT@dBPu80&XN zPN4vA;#F&$*b{4!hzb^9@q(V>Gco~KysW2H8hjjBytt<-vO+4X4P&F0x zF|Ta{PB@957!-Q;Uc^5zRvI$@m%t9-7GnJ-1oV6hdyWW(O~508*C-Xb{Tnkcuuj37 zfhS{Bh(k0u`Rx#felp$!e6ITGF(c=Ir>X-K{Ov0+UeU&%(j&=zg+kxlh5$!H{9cdW2g`&q>z+-_i;mCU3b`XXDR$aaB z-I_S=P)$553Mcf2Amu=sP7P+)EC{;zk?&|AZ>%VOHaw^n0S}Mp#cRMzfYlUy5_n|< zJ>gc^moGm<#{|r{b%3O%*zv&XORi#gJ_fu2^v-Be;GMu{fQ1PJZn_1lwjaZz;b1u) zxI;B{H2ks$GtpTcnGJs7x@?%N#W@{ug>Zlj6E;MF`1M#Y^f-V;$Pd6ug>$e`G6blj zVg7p|g+Z2scRz3o)fR|_xc^|o4J_viVEy|w>wk?7s0TjT`|*3~3Ct+Pis52-H}P-a z?mva`YwsY3TnO(j{;VP6Qm{!M`1MQG-mzrnRv1miES9{t9Vr7k$^L*&Nr)>KusAS+ z?;wMe0vakH%YheyL7p>Fq0wO|c%QP|0=@%SeaTp)fP0{TdWiXb5pQ{xwq^(W@E&LB z_;gzy)*EX3aGD!9neRADJEbncZDEy8?4LlOklGk!JnqkZ$k|B0d5cZ;J1;tP%st>oDLO`D&W}>0^0WnK{i z`z_p-1tvTOlc6cuWNUcK3v{q?Cu&?n7ci~Ko)E&8{7)w?I4JoV^wX#oDY8d7BuoFgLP?Vr!u&r#=dan@@|Gb_cq-3Z33wQ{yG6n*q1OFM!XWy^wq_9xQzX zfe{K!02U3(7C_jn2QCHfsVMXv@I>&pR&d*o(PQA23Z4S2zVI)?a0Xxc6YZ&43d2?L zkA9+^0w3b`YJ}IGLYFqchB`Nf>!~H?-aBOejB*q`Y`=Gu=swVfkICkMC5N7WM@HsPhjy~LwblFAa|oceB_X% zHUKO>cu+@F1@NSB1#$scdioB`7TY*)DIk5O}qODBF zUf>-RoJD~{sqho9_@Y9cnwt*6%m>^=q2CHDzO+yko(3$wx=2*$PXUWBFzPAz0I>KH zL#_V{a1pR9U+e{%4<+&^8mh*5z~XZa)r1AW;?s>ZMc^~Q_=KbS+4n(U@im89{}QnH zszcp;w73IPGh#xuSU+I#wTG~9K=^zn3dE-$YK3Qk#b+R@0*8RbCn2g!eg#&)b`kYk z4MVttF6Tzz+koZIUKE8-Y( z^xH6TBmi3!{1LDtCM?i{wf`DT=+}I~zv?g;l+0597l2jpSQ@qq+J&K0|;v2(3khwe_QFcBcpb>o*z*j6tz$qvBMkR|MQ2 zSXFNuu=-h%P(L1G3zGHK51WSruWS^?TY(3r=*eERCYtT^Ih+c4;t)QXs$hAE%$SyZ z5vA8}qjUW7fI~|%JfZl4 zkPm<}6#i3V_y@n!R_xC){AXMPgU4bo_HwBAum>3ld^BCf*e(O-G!Ek_z*Q0S8Nk;f z@B_dJ5&ZLklOynBz}aEUpZJ3gr7Ox${((oH>0f|Yif_17*T#-R0^ljv=skfhxK%#~ z6Q-SxewCnIb+#Y&6@m#>n=1YM`UGwsQ5Hj@Bw^mCie=xo&rpOb)o^_mB3elRfD|^tOHg9@JHZ< zTz?&F{qzZF8@kJZfxj+b_4_y>>Ky zbYrD{Z{QQaa^Mk`O72C0dWZ;roFBQ4Maau2PS_lt20sQ)<0(O!k@~GB{|e%90QnXx1Qg50 zLUC_kR|H-NJP~-IQtdME8Q{-ZNX)43LSog`mfbD4Apa2^8Xkpb)WoYcGd*3l>ImzS zp6Ef`h@X~m2-}$j<|&kQN*{;Y6ClY`7)XnN&+ws?WoUNbmhc(4%{zhHRDATu6an#G zjIs!90`3m1#?3h3G~jrJe=+dH@{iCU)s*3W4W}_^;S_GqaJ{%q^ohs9y>J__;I=)! z091o)0RS{kWtbWue=%;|yj~fL}^y6^{lu;Kt7GU*DMnRtdtbWl5 z93YRQK>e0cFzf=BziCt&41S56(lul=;r~_01xrL0A@vZUc^cWW(WBwe&xFN% zaH*=04|urhVzlSQ2%D^6r!d(=Xh8j7RN%j&8fc!6Y=8=C*!BTl$d_x_?WSqCl|LvI zorg)%z9B@{Ur(mOI>K0MKvxf;>#ls>Fpjlq^RW;Ck!mjc3;39-BjmK7B#(?Z)-5m$ zx9T^lqKUVDz~nj*>onL$G?8=`&ne3A5wuVN+7AZK+=-nX=mM_*?zIcQ*C_Z?;LB)g zq{83y9F`0_^zvR;@Q(pbeoar_3Gv@S9+{-}AhZ&DB?=#l!oeuqadOT2Blx&@);h(v z7*-t|4(vj{G@f-yx$QhGgW}_wQ1>?TBj8TW+JJO9BD4V!z5Z-6zaGzWjf=p(66I^* zZBb6A)NCv#3g5-YC7|(KG;SCbZv0WcG=X)=d=7ngpx6~3lC~wP_VFqFR07K#+7{L4 zP7K*hv>J1F%~o@x@Te%fFbZ$u;}Thyz>Y=8Y;L{$Wv>wXWfYs{o|?@VqVSj~TpWdW zMBx)Pab_@nYRv{rQFt8hT#pS7oPe3Od-SAA2|+EKu+FEievNi>#}rY17bZD>E=A} zUbl|y0l&cbFLTJ;(K^{20@DI)79wyGa3A0tg}*UyVVE8uIux`=L9)VN1a<%?Dfm|4 z(vdnc4}KR73ISUxF9vO z;!73V?9TAansI0_HpE~79@0-wCaV?ZV1cej7Ely;;65aa%CLf80FT6CDNW(;aX)Yx zvV(%x0bh>5h6gaY)`P-Ap7_b_5DKQEfn=q^U%(|=NI6{KT+dSFP|Tz>8Og)-EYX=A9N`By|dHx&uPMwx&+rS5Q>*U?H!1l$6iDEt3lqg()A8iq1C8(dI z#E|K6tWe_QfF2A{8hC99e2nFR>Vp3PCtTCXUonUV+ARemaDu`=dKqFU zM^E-(1{Cy@Pr{;bQB#H9u>><)qUv)>+Aqhf0vG7SPmZF(B?&9h2pD z_6#XB1Ne+bNAUkc%L;A<-U|UE6#-?>AZWA0xFe#iX&#o^ipzY!Yhgiy!hafggIfnA z+N0#Gpnt2E+ebkx`5gsgTOkM)A1!{iW>jAgI3kK~f39X!v*$6hcEf*hqA1WqV13x+ z|LH#MJ?>%&9)=`vNpVh2hXpxFi6a;0oonuK?#DCe+N8^ioX= zOa+b{*N1^4hjE9EH7(HjWi+@2&-WFD|FsD*5mxR zK19LYD5&@ke*03Q`Z?gah*FW5QV^v5wjeKj8CsQ#)Vd5f`8OSzs5H=RD;oG+NBSrY z{AU+@{&_gB4BrhG9@mjVh5w7)h`;S9n5q;^D2IJvILPobv)FTpr& zq2MQhhg{H+feOCxZzyyMKdvekJbDm68zCkN6nPo%Vw4OD2Wi2P05ab%I#Qts==1>; zKxSI3;Ia=f?9k%`;1rCK`;THW`5#iNLNEQeW{jkKQZq(o0Y}D2$4}vNq+Yc{M*}EW zG5}GkXx!y^&BXH|aAe}yhDLqX68Zpxy9Z=*w2t2uGIFX$? z4TUf&CMz*Q32&Lk9u62CUQfO)-);3cY(}Ta*x5U2POgFE4s=hOJ}uX3^EezJnmrz~ z!R>b1eQuxAX!V%vPK(=N@a8&in$vhgp@ADpHJWc;tmWoejkQ?=f736csW$K5u--hU zt+vd+Yu{d*^>3PY+%%_=+&ydhvr%#&czBgC)eEkU5^Yx9{EdiUylJ9led`7R| zpYJw1@~Y+gJQlCTY<8IZM!(79vpNh;i`Qf{nk|06-|o*fh5J`0YuIQ}tW#=>4F^LM zZ*A6aFx1Iv^*txqYb0u30 z`F_90Zg*HL29MX~<~y3Q76EHr?S$P^7pE9Xy?Yx?c-d4PeRWka2Ev1?PF@lHvizI3 zXT&JDvG_pP`|_BT<=?y$jDl6JW4-x4N3sU~IUF?i$7qwfJF z^o_#Ja;2O1x3Svc;UxOE4XHyc%HPfZemHVZ2K!gt@p<#XX1aMb&8nJ#+&Tw{Ih>X2 z?7jU487v}!$#a*9Oc*`LXu$u|>GMzETUsz z@e;vbzZLk6ZimI1Z?m{f`8KQ7DvQeDBU`a1jhqHxgWYL2n)A(WPpJJ@TCo<%2BX7b zw;Iewq*|lRVB(*)V(Yv3oo2V!=CB#u9*^5@v*!JCx65B@ji=Ah$l~;wAkLO=Fgo3M zwMj`MUc1w4v)H_Lzs+Lunf(^8*XOhuJx-^=i|*TbqMm)5?DqKVevi}W^*U^JThPJ}c84?97|xw_vfB9AHmtkWj_D5Gwpq+r2YPMB zyj+7I82DFhSkr*RYqTSr@;wf}(d%#;s{^4Y$018mQGnQ#hN{Dc1bY z#y0*l*+lN0!+&kdhK$bl8q8LY4U1w&zQ^x&=KXWU>cBR5@||Xj$DWS`7mVz2n>;3q z$!)XQtQI)f4@=K($9e^T@;wL|o7sjKaU&fl1G`QE)$Xp7vwE(p%^8T&s(Oa2%^Jm7 zJz>L9C=)y9{1WEth=4(vSjxDn1ygWu-$n5@Xk7J2Yh zH=A$vSbb)P)#EextTvxBObp|KnSSr|dkdya_0P(UmdGFJ#F_-6 zOXYS#Vfjy$Wj0HlZOCl@q)J?fGy@bEi&4Vse;_R;$tAw3!SByTxd> zS;?1|4JZ_sEX$fGSw(CJYM9E&SRdHY!l3a)!TEj@;|N*L!aPxw#Fk(RL$2 z0lAwuDZ+9i3I9I=jMiugiD6TZeT+R6u)@whzt0Q1nGH@W@@}Yib*-QjE7f+%P1aXJ z;Ew;Z0L3=7>+|Qfu_pYT$Jvw)nA?0N^bS7v87x-I-^Nk-h$q;~G}+?L_n1vitltby zH)dC!w3O)^+1zH#k$#iWYxlug{8TY(&BrWd9g?xNv--s7HeuP9Z};+*OIf?2W(QU> z4!;eHHLurfHr=dA?IB;?phpdsu|>%itRszP16EXyd;`LoKf8@J<=4wtJm0^J6(w7o zew)Ld@AP}H;lyH@H#)+arMst2HQFazjdr)eYI8fp8o*=V#ZR*PJDI%(zr&E9Z@1VS zPMhDOTE~E95M)lP&FQckoe*l`?MkrvHJf~Po8RlUVnN_=ddnx3utb`i59=DRX7T5n zu*@}C__7u3j}*JzXvZqhVt1Rdh%or``1Kdr9NusxiwpQY4xiOzbNjFsz-kiHoE&p? zt$cEon6o>u*2SvXWCvKEfKuI8rHS$J{XPvq{B_AVETIr0Zat5{IhQ|)hVjf9@jTn zU&-MS_4_H)-%ScoCZY%d>h!t%DP~V`n6WW)+w=2nm_^-|{5&of8*P5G+2ZzMpW(3D zOctfsfCqQ^HnYX-MxMm>O)hpMWA4buO2*{C)a-V8L(IuYIGA31RQEkr$L?I z>g@eLjHsJ5pFAXo-=Oa|o0|SMuav*Pfepfc8(PN`j$G&8XN8;WgE9-%b_n{=Q~Xp? zrw;0>uC@sN<;$#7BRqG(xUl;$d=3751E2pU>%dR_$kGE&s}p-{%;Ja<%nx{MaC0-S z8n*w}nOB(+ZZPwff4_-MrGYxkNy0a--+fx$ z3aHa^tsd}_&Fqdq^b?I*4>XL50GkaHfenjPgTaBt3lvhOk-8pp7!@zxP(VQZ##fgF zlQR5nDB)%VsMC6F0o<^K<#q5_v6-=%@jwwjF-`~#0C*z4Np55`5UZ;gScQ7Yk@f5R-!eYx{_joLB z>|H(i20Y7@2Und|F)BHwwl?Acw9Pt!m$bu<#`o7ht}WSyER(N$YB?kr>3eA718fP1&HmVEV7 z%+$f3?=g7H_z~LTwb>1Bvl1({^(cR6E9*@8!*Ev(>J&=ETDfn^F9ON6q*R!D;79cCsnj8xazB zvCe@ypBb5yOmzbZArIFrLCIA&k`RzxQMU*sSKLU%O-fMGRg{ES*+fUCv3?z~Rksu&aoMr*af*jDkgD>hO1`PJccgrC}%f4rA1p*P|w$KJ{1;ybUi z?zDnmy3Sf_3U=d-5S|`nSsL+wzO3c9;5Jdbu65uIN-TVN5WfY?3$i4Q_>X80@TEc4 qjvnB<#APBsDJ~0FX=2*Z>{Xp(+BIE>cQ=lo#|t6Kfj2Sagww1 z?&{w96{}nq&X>8$TYJXmrwZK#L0JFuBWWvBHs2%*^q+(|LYyGD@H6I}R>GLCd*HuE z-smZ2zx(2EnMz8l?Ourp`F0nZ(HvDRe%QkLN=ZNGP>^`#Iz?u;^)nTnL^BbqtMgN^{Wx*PKhu3Br&ErW|no}-#2ri z{w_76kG+y2_A2sduk6PLS0KR@ssBktDj-r9MQU!LM3LKRnM5zeGg#$lYaO&6{*7q~ zfhKZ-vC^~Dr5TqzqbF)3cmu%^UO82`LlByKYzQm+n!|LX zU98Xj#RLcIj_YD2m+NDrsOccl+Hb6F`nYJlYIJWlIo{fNNBu2-cy%cbP${q%b{LzR zJt+pZ8$+AV7Of|Zoz1cAdSgsnUVLEP9raHfz_Q7_Y+&t<^>G<4vDJ3NYLOrY-ZW0M zNJ(n7J)%2tf;T9IbjLE{;`2nIg)t<)fY(WM?J_pUzmXJpW~xeL!%eVvJg9CSr;7g% zBj8P-WsC45Y~4}q-Qc2nSJ*0zeo9(pG-xh>b%idDss@efRtchY!Z^@sr5LC+3KK@q zIvW$(x&|A&6PD9NufzMwoXdhzOOwt1q}(m2_6aMK?cAc+D#`vb}c zG*36?Cbf0>jr)@3i~cjl#U#HmzU^puY-4Ow2&8zf+A$&dU#{|N9uDyJIB?QeA5Xe?~slftXo52y0E&_0EJT4&_ZPhkd2 z&E=^|p0YCX(#SL27WHsVO(t31COCApBw?yRvZp3B5%PcTL5K1)M#~NiVKM(y@y`YR z8Is9h<@|Fpvx6&ThtyG|J-tKCLIoo$joeP>Tj+zBatFz^^y^)%8C|kdU0)kT*?q*p zt)cQ~`6^?3_SK@lrExGjP4v$&>az>34m35;o?+(-sJYm=0(LIyq(HSjP=tB##8Xl$ zV{T_PnJTU!_js5Naj#CbQ5F(^WJc&oDDK=WDS_FHC%9o6{1yL}{Q%YnO3I+I4>QGA z^m4Bp=b|>qt1AN3H=}lFT4s~U7y5uy|9yds}$StN-Z>;H3Ao|OUqg~QG`cpht zIR9vFP77i2)L6IZZPSrY4-zp3@D7w70>a zvF}8e+uq4B;>6RhQwwc3O&LM5hvlv&M&E1NxrlMoHG^qqS6(w{xR6RU+)Gf2?zS)G z6CvOw_NA$_+Y{Q$Fn~kGW&DzxS{wx|EnMYG?T#~dx(muLHf;^nZ^gP3sK|-^ z25;QX;Eij>)c!Z&jQD#0MEw85{)0V%!QnR22cXp(V2mFy3T^6+ssVrc#X#1Ms({BO z+POP+uW07NI&ZBkqtL>#iWpIN%QzG4DJE|>l2`Y4$;M5q`?|;u!2d;I8`OW?EZ=DI zkI|z438VNQN08-i_h0Hv`uZ|o6se~H)lI1qbpBi-_4$liy&tER_&K#?$1M+hz^13} z5B3rLlZ}!Ge-i^EjJXdD68*!C>W3ahvp)FY4lV4iyrSNnSJaGqAD&vOS5jxjm;SzB zenI^PeUmQ()0wA2=_h?zn9lw_lzz&WgXvUPj8lFy))#&0EkfxnSYPyIjuajER;(}j zviF73Ph)+`n&eA;Q8L@|MzL`V@dg=tweIW5xX_TjlNF}c9v3L zblW;0Ds}HxA1zY3HLo;y06i5PIxAv)Y4l6|E^PKVRjit~d^yM>|GUPQ{l381%0$oR z7;Tl*P_~`FZR+Rw(l()PppVDkS`}^HkPD{fBMz@x@Fx8lYQcW596+)Hg3lQF^fey+ zZ3b85cZ~H<9)<}!@it-0)xx)A&6_IB=pu^jB58_q}`GbE$=qo zZpDt7+uEVZrR}(HyNr|K8l(J~DQV=_JA}YhUJ{EOH4z{XgSr#Q^x~|LPq~mtywUR6 z4z5I_-?MoM{^gXl{PqH}slV2ZY!ZxBnrf_ic7!M_F^)caovW#lTGb~Za7UyZIl#;5 z$wmnU&5i=u9Asa;!>aN~Vjy$J!Ro^};G68&_|m7U7+AJr>7E)?`dfDl`S%J$~F_Lj`p1vcu>>k51(|06)zj7iDE3@)C*Bk9ca@L%7 zr)$(9%z@qg#XYX8S1%kOnhOWS;Gn}&v4dk?Z7=FSmsf#PVBBybz({iL4wA8^IshcaYqKh=5 zv9^o5@U{gqUcuKr))KAC@I+y{F}N3PWNf!@+@SAw7GBYk}ZcttZH^di6^1etzln zmEc1MURg{-23@)R+`-Z_S>!=q7B$J}%Fr%Ob2+{VszeT^Q!yP<32BJ*QWADK?QX`e zu|6j`275v}u@4r_1fy%Y6h^sd8@5_!-?Yf~-0_|7IXB_QU zVSa;tjT`oVliQhL(l1wPPr6Qep7P74M(R=`J#;AAbckXTuN0%#C_WI? z(NanddC=^Ui?f0KF#UR0+vNtSq<)70bsjpnuKHi$TsoRF^LKV@%@`>q{_?h9?-=QE z%H!V|gH>at;BaTKGajwVXr*BGmF4@Np!vRZm*C65PNTe_o&76s=9qDk$JH1iB{y=b z^mh#GyfMPyAk>b(7-n28xS*a1>}Ey?Y7Wz;zaa#E8ZZ6U2pts@uS~{}iPEQk+h<4u z>$AYW8uZ!Uuw*W|Nvd!~Ccj&_JD^R2)SIO*FVCL>ttT`00)|eOaJg9s<&&j6G0+?K zPnL#@{vl@EEmDl@wnYq2kSsJvxg!(n8%7XyH;9(O;o2m&`eHJ(zG?(MH46UUM&P%? z(qaj{(!W=p1I1E~%Qk;4mR2{)XZaNA&&K$yoXYvEor-)~KSJwi$fs}$3a25T);F+z znsj4nBWwzfH$r9eNrPby#*@^7q%*{eia?xHq6b(6&A+O$m) z+H@&wy>5w{K$`VN|6wXJr)4fnKUm7IZD`6+5 z)9m}v1W0`R340?_u#Y>#;goq{zVtkj8wD-^WS|Rbnc-O)Y4zuZ2swOt1RfrQGt8EE;WS2NgnkE;QR*fU zWfJj6(lDJK@kh*l_u#xX8!MpjScMD}Vs?~JGclbN5vmuL$DBgT8=)XfVIE_dQE0V_ zz{3%RP6wBlmqF2}qIpc6UeaJz?Q;^!X$G06UlS`WLXiXy0!p zmrAR}VUEN|eiS`NBKX4e+|0C{(_7mJd^Vh0!Rc+ilGEF7CC;}231Z8rx?eJj%b32O zg3%;5^jytq2Mrdbd57M=03zFU;dEPH_QMZ zTf6}w(m-Pj`2UQ+9R@_LKjc0fWe;XSQFL;KS@JNtGL)RSM|tbrAH_8%rYoKF{zs(_ zjZ*Vkq_sw=i8d$KK(>MCk(wf-0W~Gj$r)z3A&rx+ zNZxMedk)*BMmO#;K6uAG78?8lr$fk#v=bTp=K9AjAKaX+CXw=Cy7}PdaCal{*)Z$z zhJ$4tLXs8b2-Jtv7P90hsN#s zil?v}L#gi|H9Gmd>3>Sv5JRnV`X$XX$B_8x>ry?Mz_ir0vo? zS1Dr1cFc7Sn&)(v9G(MHH_5pEltXhM_AKEphQCiE61a^G(@Hks^lJn@APOF---JZE z9>zQ?<%cF&O@p=1N>k`Gdf{0qtq+|>L+x7~8o@t3g5T;Gf!jkWo}aWRzL>{mFuMXy9z zrQ4t+IynH!X)-jUbc5EOwB22T!iWg_lhDh`FTh^Jy&`=n8lCt^JyxrXjV#lrp?#+`Y#M!G=?yM(ua z|6K_WSRaJqccp| zrH4Yo#c{RfAeUzS!BAH^wD?;`+Cph%A7aviqC`?^h0F*^NYFuBk4ym+*L*9+LO2*qWYe> zNoA8o)+QCV5QoOKQ#9D$?ccOtqpZ9F>bZeVbsu~~j5T=<&P z-|rhf%!|K?>Zy?spvh3zbc4!o8uU%wH@t6#oOAkSA8{J7(pgJV*5*^(VfupMlcN zjHtRf^e5>v5@n`xf0GWQ&+uTypP@4@4_YNp*eYfIDNTuqnuX1^F0xCaE^LM~xH55Y zlWVY7!(18Ng2hdV3TO~_?CD~vg-MI+4dxt_zDHv*px z7n^eOot+i4uo;<5qeY;qIl+C)p72w1k|7G|kQ_%QidJV>5=U-vErt_uq(=0&g~}Er zNQ-C2V{z+GD2XRH=X;JOTkP>HoLof(ENc%hh|ypuaD-He7C6%PZkq7cO`7isdT8<%YDnQo9f?x4YGq z+Fc(mmzh8&hl6eQg@S3EV4HC8jT3BhDg<|eZN3i$&ur$wHm?6qu+1iR6pCRT7;HoR z_!Sszvq{RQ!8VwQ!8Vw9nH`_&%!J5fBcvvh{_*YmzWw@nbAZhXw!zgHQ4>oqe{ei2%>A-Kc&5>JzzFb31`P8(dfRJ0-8J^C&OV!}~clI(WUuRzNr z(legC>Ih0=`6}51laffEc(RwK4f$pE^{V9GunqG)SD^s5yvxul+Cf-<6?ur6loZ029Vb%A7{Y#4deo_C{@aMLI_lM9H{|kj0604tulNyD6O=0G;0@Ae!<)C^bxxuw=*C>M9 zNtnzYO_Q*6H2I;l;CWvfYAyznnLpER)Lx+S^JU^t=jm!5SBFELr(fi8bvV>{`lawt z=jk0-pT^C_(9l3GbGtQ-t#iun%>RXUW6d)dnlE_a+c9KVTFvntx-FD#C80*%_sT`W z%z*5q*S!zp$C94n^pBx@EJ^GC@-Z6JoA{=i-bg4iFx0|W_p&fGWtYku+43R1CE>tF zm>4=XHEx%O!=|5r`mrRbwAE3sT(y1q!=vLU?OmjB!#Se&QPy7m#hUEnl0h!@b0&|3sNZ}32#*Xo0) z2K`Ps%nOx!vp>%x$Kd2RavGxy!Mc&8csJJ$D?ZEx2{3?HlR)*!z1OBVA2F$J}`lo-!>r{e_N=<@}mAUBu^xZJtU=U ztCoTxj46;hiOd7fO{BR}_ZwYymqF@HBrE>q+2&Xpu%O*RzZkx@5GLJ3r?;n}@}|o$ ztQ3Vge^<|}n?!18cpYpj#(B@mFwYi~43Z^hK)su;;wzXFLgxax;0B%-SjX~uV9T=J z9(v6nY4Lgw6Xyb?s2BZuSCeaC?hKOTv3pa^_6D_nP(FiX#FGw8(}Q+LmcLpnf&-1_ zkF1zUz7+jWn`dW|ct+sG+2k6fmWg47>7PS3kWxK^MLyRtO23MtbOf-xz}aX@X;~IX z&C7quV3ayy59Ua`1f=uh-CAAJR|9@FN6&Yznga;9CmR*Q*J$F&lBC84{I)OUZ zcueWIsM_@qH=pD*CgP&`jfs9F+&7<`zO1~R1xpu@<8&YB;6l;~N*9vrMByWvxJUHA zPrq3(e-Rlf3h%()MdWaj{Rcfb%^%yIigF%Oi!uIGtoq}yc`+)!w$(han9OkD#T+wt z3HehJQEhUUA#Yk9@_=pxh905oz&7=Hha^z9BC@G(=fT2dsAiX`&q&y|3}1n(FOrod;5y)ut_JoPz2XJsw2*~I1dkx2(RqRE zVb#A#jwnooo&O>mL~WE=^f*bu$mae~@&p+tTD{BzPmlst^zVeYZDeMTMP9r`1(kH{ z34GnhR6&~oO-;RuwQgXbwS#$FxHZ{c0J*P{#5Rk)1Y@un zF~aC5@M0)_m9(9H7mM0sVCOyvrC+u=Uz~>#(bX8gynJC)zC#Jhf;V+t6l@{XQA*~q z+bA5&&!Kr!iy>|gX^V@!Z2WYbf7u==6DZn^2793Pd??vN5_>P9*IXR=4-2Z4U+4i@plfxW&0Q;?}WyNc_h_!#A9+$W2 z3S#!aVe}xWXJ{YLmzlY*k-lP^(#sA@9JH{?A{AndY$op`kH&~wf@bx8a-Mj$R8Y^t z8`Rgsws%k!^$iv8k_6FCfY$Hggl|8Fha^bvav1+Ec`ZqM49Vt34~<{Q$Wen1xd+MC zG;Kd!1NrDBP3|e$fAKVH;KD(YlBD4x0PAPEVyM^X%O2^NUF`tm9wG@@+S>@1aE(V$ z5hQMswRdpc#{R}o^>=9=E)-sal0&3_*rT_TVfP_iB54O%9fcf%3z&|#Yj}BbnB}YX zVelVD8*0DDmrnLoJYTDYHHS$~Lhv(htM)=Sd8-hUfetG5W`pu6s69-MCs=(9atbHH zTW6pdNq}NzYkHe|-y^e$Xq`4QkCBNO4|NDu9mib^|65RZ9EY~w-t{3Fg|{Ty!k7~z z=m|U>x^e(#P7n;je~M1ICYM@0WPXIMzI_$!{sx9%D;l0(~{Nprf@5&N>L=EhT8aR__AQ$oXD30r~@A1-IZ5u9^bp#Eo)FfK&0AEHU7my#T|`FeoMI1OzLSM>i63+AL>NDf_P zn`?e0ImDy2=gg4|*ng4C7WK}M`v-1Gq6aqZ58`o&=+l+_iB?t5h5P;_kBWL%Gx-wT z`_#LyTPmY#l)r8p{q$USR30wsy&=^lXNYM-=?iD0nZZM!2YVg99$Pr>OVaCCV`_tr=BhgF5&eUeW(zRK@=0Qc0dK zQae~L%SqJ6#VYih0-1`8G8aLFP#+e^Mj4BiaWdSf4I z_dt1X8F%yV!O@)vag=mF_nnw#V)=tuF3Fz5gWnlz<0)&7gKz`H^`V`X0hxVJ3CKby z>LVxh)F-nGLkyo)6c&X{7P2dL)ahU_froqXwiZGq)=dabc3|9BV=(((s708F-*fo& z*wY`^h;}(q^Gw7TKOv(LgzeW(4r-qN1)IBsYttqP9lJ=mRZ-^c!d| zErqxu%GS*e`kxz!&tD`bILm9MJ2kLjgwc;>QnNAj+j|~;CzER z=;BA}Smzjwi?Z}D_`X@-#r|ZfMxx|;wn)zEA5l4j)MI?TN{#PshRl%39axV>mqul=#^IxsH6A-y~1?}>SHC=5$)yX{*m%8^qQu*ceI?u?j@cW zCvOm`k}sTqs*B&s3GxUk`1%R*LyBn6F$1^ClVg(fn;Aij*Z@B@tQG1G`qtif|$#r_@Oq7xSD$JcJXO(JQ!+pS&XLSVmU-X+bZn5!A zFRP#eb&QD0S{AM+Yu9<{8inKI$C`{5?H-(UVwroDwJ8=S%4Rg?tr@!Uu{d+a=A&c{ zVy`eWXW^8N3yx}jd<_}-4n zo6Os=_|y`m*p9;UvTXD?f}z^bJYXGWNSsUbFl2!|j`HdRxq`Jo#%oA_-S;Rm>letM zQsJ1ji{-=2lvFN}&r|7?-;Gj2=^VTpOW?Qa9yBpHj!xbqS2$8kG9S8E9^wiqIajAF zMh8=CvKG!Qm6MXR8(7aWxX^*YL&8g4CMOj*0^%CM10h0tk1Q{c7F~x91K_x>j>_){ z0mMZq+(^Gj@$O}4g(F&rn?sGt08*D@dA%d_TQ2vHmRaR;xr^(cP`ezJ0QcF>(&ReG zUaqD=pHg|c>j|hV<)GcA^5|=xqRf?rrGKOGI9%tDtP@kknz15L|C<+XVk8j$BIoV|A+1et;CIa z5hIZ0RtnDuK;dI(_pD{Gmab?swxv^<8Z zAbtS_^9`aO#3@nYI0UXhy!>I4euH`~vqzN_pWu#aqcv~CKPD#dYi=?Py$-IQi+oW$9Rsm-q8 ze_NkJ>n+%e!e>xEwb@9X8TbhHZjmR8fe#>gt9-wQoN<~w57k@cJdgGrQyE38hjUwT zWCnJ_!KdYSMC(~|{WkfX7!hv}O{+qhteJ443WuyU4bZWbD^kOo>&^l^4=dSpf+A`6!v!ru+D7~ z5j^>g=lMO6JS~yuHR!Zho@XhMa^!y;d~zgD^E&v*f+o}{;62$Ky1$5~O+I3-c~QpO zI%v9fz9i$xo&Q&;+aW(B`p=ssJLUeE@i7MLqGh)}gcC306d)gke!Jw?#DEPKcgYwf z@j8q*al~7D%=M;RfLn-Q*1aOXhBfbn%01YP{qen#-4tP1b+*gQJ{(m{eDS`Xv_6#Lzf5tY|*bVxgE> zlKxT37RU1}9`wh{HRpMOzL9b|p}6tLOEnc*Xtm~nx^uk}q|diylQLLm)3!g_0?rHf=dyPDccOjkKjT zhqxn%9!+cY5mav4Wj<|4eEW|Rm)H-5{g(BAH z_e4>Jdl!tAyQA{F;ANS@lBmpq zEtnt_ExY1N+=tOSm{b>oS|>B}OZj=1Y?(}71Is(yIIdTs$v7?$J+E z!)!?U=dk%Z`Ny%#8#YCQlMp@KD3ayntSSEYvPe@!0u=%VK;1*j8FI$Gd}ArdzJ?lH z3g_xk=jDM={Jq?E!X_VmU5QaISJLKuS??powb<0iQ2rAUuH?rvHsf@Bl=&Uv&c7B+h)z_4I3~H6y&Ry_Iq^jV4hO6c&|2kts5s z_$DYlY5uGR`2(Qb$v@B_-w*W(3X4|Z_0h*mR9Li1aiYSaRqjiS#y<$E6FL5~4e|#= zTx(iyh}pfhGKG|)cA-R2yJCE4^ow1dx=%DI^+75X420r;4{h)o7w__GS+E)ZyC4#5 zR(|WJNoqVFqo90WO-h`j#fg66+(Fm zrTlu>nWE%j_Zsz2w_;ILa&T-^_l;yvcJ*Ex2aP32}QlSThr zvpid=P^b%>*PtJ~-Eqf{=?)1M2t@D*9T(_9J^A$WCx4W7rdMnIZuIQ_bqm%3S zz6x5FWw5HRQb5xs{geba-B(%TBxp>ZnR<=V)0JY~fN#W#UJrd@%#GUY#^H{eru7%- z;%0=ou)iYXDZ_bKIv7z4c=2d3vPhRiLzLs9^(CAgf@$G%NY@m)NeN>#1z*kh4^(PY z6dz(x9+F}m1+{>ddmn}rD8~~5Z+gi->O*!#Wk8A0#{6$U?zPJ7B)eNT@-lmNccwsu zvbWtrSTZ}WRl2mg6~io&W8QHis7(ZP;aa6z(`o3LCWcG*8mjbdItxpC!&!l$O3wsq zdp=bHw>B4@;AUaiK?)PLa2P2;RPHdW^)Q6_D>=+wfD$8N*tB8FVAoydwqeRBwh?vl zItBftTVPrt%04g~stU0?1Ndac^-7XxO@YkoQIP}1P*U0js00y&eMNlOh}%Ds6$-@yg&9TTDLTY~yCR;AtoxkEOTKQihE0@KT~w9i6`MO2H_Cb6O)&uxwyz z!_Mv>ZNe&Au4n{TWNE!8+Jotl+NK?Qo%(&kuC! zRSHf+>a9wi$4+E|RJ6~{Nti~5FBZzDDDQ}YOXj4h$_U&|K=*1oW>|;JB{P&aFk=(+ zyG^MPg>@j!R+ftxuCr=38iv4X+;~+qrIwClYo(bvM~O$1H3j<3RUmv1yxu%HSHZ)6 zKSmzS!_g2Zg2H(UF4l*e+vX|F(6se7ci+L?xF*04{W@PQuw?%Yl)JCZT<^Z-HnrCV1rq8xALG%v6yke_`-V?+zj=P zHdB`?E3sT(*j$P{((4tal!IKeFhK3OB}4rR9GYm$vR7i0!Y^=fC5~+ieaysKRflRuX=Zl9jdYkF-I2^f7FwjekVtUlYlwvXeN$8{9=_U01DBRDtN9t3U^O7j* zx4@hT3}Xr7UZJAsi`Uqdq!cosVO!49mFrwznDz=PJ#HjazM>?$K815@nzT1Rc|~cD zM`KN(*F#O(L&rVJ)k!u!(d-w1acB)>U!(9cqii25Fg z+lQ{takF}#@&oQ@?=d&OsZ4Pd$Zk%N|LF)C;_;$4<50SV<@cbJIw8iqk2Xj0wQf*o zqnxzv;j=i-Wo4v{o(`*QB`u*~o--bJdmL{E*lR0o+q7jTT8t|p3ca2Q^@u(zI;hws z8uCDl8x!!g5B9SLJoJyD(|VZQYm^sUt`p{&x0E+rrP^FCJ%yq?F_pF0*`1?bb0Ycv zo1$dkrgfb16KK9u{&psMhQ~j?VfiqA9x%!D1KaKtZrDGTRbWP`U=Bwvuub|9awvL7 zxxsZSRKBC&wcFWr%5sJoKSQ86$+1biIJpJRyrY!5J~pSltBjL|qy0nGaA@Y616;nD zUQ!h5&p#LmEFS}2A{r@1c+uv8RI7Axoiw}GDg}4}CEZ;5KAmN-qt_f!lKMn-G#BW> z2vWTRJ$rPNhn>E$_;9B|s5_!yEJ6pka75`!eE{4YDr-173oh;h*ekdXkg<~c073Rh zGOiAfL-7a7aykjq`ii~*&VHb55QT4H)lu%XA3Ta9(tixpW9UK$jzD+%^?zm-A48QF z1FyjT;|j)a?*spb$~@8kDpY@{tQ3ddXLdh9XIb*BdEZA${}|Cf0S=r*KY$(duhIq2xl-o zN_*P3bqn%bE#6Vz`~u@k4jzRPYW0NUOo-G8lWPQ?XB~~?1&{H(zy~Z3+c#uwD~vy_ zWL&L3#_7R#|LHUE93Kz4d6@=L*zm+@C6Na1>^`mdTz%o>X(cQEi|3f6gZd6ud$qj> zT7RzK;h=+!JOf3aE4a1u2FH%Krb=kK{cAi;_CYyKhsx_{T|QUlqutvJ>0eM+0-sO# zLK&11JmRqPI3t~~ZeM5O7q^Vp(=XnV*kbPdLP{`%c~v%ngm+K<$m6xO@Ub^Th8sL%4=O{Y7O^ivC_qdzW0+ejwgW zX8oTYAxb|2MSswNaujC$fi4u{*!u?x6mguvH2PWtq1Pql&m=oG3c*hif#~nAD^f?~ zpl&hT*0)i(-!(8=h3ETO)Cm`ae(2?c_{%VTLcOUCX1c`c``JKtv_OqCX>pxJUBo_c zL%OJ<8|Q&SQN;j}CQu@(ZIRtIEU7{@ep75TQutUgK|{saekVej9gAyx6{C_pQSi4S zTp`NT7&R$R`_@a)IJ3UAxKF{={11%iRrA|tqRNx5xT;gxH57u1JvRnP(%*#g7&Rf@ zZckZ3-RsO)TCL^4?ijU8M~yYh&<6H~nfwI+EZ_c$9!c|j@)hEC>XLdNb6_*=t_W|ZBu=9I)Qp}M(RkVIHH zL!#v#X;>~UPQ~}rzl5SV^-0KUp~l0u7An5*)&iA_dGddh+&{(!vakXAxO0e*l6Vz2>(85Krt6?&HvW z86Oeqm!u~3zkED!H~&sN&tjbtA@lOFlLKp$)K2aK#?Ezq5?v8_6w$Ix!%m{691zm$PL?ZR$)B3*|5@>D!)c9l6l6O|aF z;HGHVH;3bGlQRlRoOn1KVdIk0}e(_fs zI7R5StxdtEi*d^XUtYUaGU--FP`(w8rl`JFQ!rb0N>1g}$>Slmo!Z}{@8=B!Z5Y!| z?US(RZMu=m`5pWc4Hq-?v2VlXc50eu%iD}mC3qdwwo`j1Xz%cHG0)OEylks?AURbX z(6zAPCQPwluA|%Yn#8x~gA!|2EqIrH@n<0p!kSdIXMb{trR84^v8L2uA-x>yRdVr+ z+)s?v*CNy3J56ml$jcTS43(|88Vzy#!}+`D&Q!1sZzA{}WL~ZIEgjYkBh+I;9WBU$ zv3hkBHnQDmnSJpGEAU=$sAa)p=(H?uCm{t~kosRZ#NBKrEbUp2C!xw|o_!5*SLo2NE*71pfJQ=8G|D|)DJ;8jXqC!3e&&77t-(FhEdTf?&{-h$=>P*uB(ttx}?Y1KaN?rYa+X6q`*fXkLS`^#H1BTFNW^@v6)7$GSBL-zU!V%wG|f| zZ$iHTYMVrwASA$4IB2hAz}0pc%pIV%#j>=CASuOPDpPy2Te*bjP&)wU+Jx

c=@4 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

*Fqd3t`yMy$z3fzzCddF}?#=y6L-c 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

    %H;UZjq7N5dY?u$mHZ14Xei7 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 W@kl<8f9YEC9)7HsE_`PoT>lT|iP~)d delta 30661 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

    ?yF+bA5NM^dna$I?qF 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 TPvdV~wIASTdg;Iy2Ey@wFtFfd diff --git a/examples/tendermint/program/elf/riscv32im-succinct-zkvm-elf b/examples/tendermint/program/elf/riscv32im-succinct-zkvm-elf index 03cd8208bc08989576448f38204e927295ec3ec6..1173f0e585f29a2db805d5010ad18012f7882b0e 100755 GIT binary patch delta 303080 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

DK3{9-)-U-PVxrLF`Z7^g0pziiZ_EApZGd0 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�PqxGZb{{adrrH7NB;f;vX$^7c|QXC^w zvKa?UQXaus>%I2Vf5-hKCsyGq@pfGAyT5z>pP(Sz%n4I6cQZScj9@K}DD@t&8y87Z z`PZ-$N{5oM^_bVb3`fbb+>aZa4w&;W(MX ziGN^OJ}Kw_VhUEu12^IbnUX^|Ql?<)bIhr9csZ_?Io^uHWLYo5MYimG8z>l*3l8EM3F(v< zm~)B1G8`@=+=8p+@HvW`WS^L^jr&RcYHZg^!43){CFCca3nZlT>Un@HQyb??ME2k! zi9p~VNopD3LR=%)um2*axJ8OL2^McvzcplyvwAj*y5<-_AOh z>sR4YS!LU|bN?S%&_9ri0>STqD<);aZu}{Wb-K za>Ge4(m*a)g3G1Hn{cUw^sv)j_K9gbu!ML8j*z6=hU4Tcv5!*_BU2FD$cQAQYjBW6 zWEYN<5Rc$ssbBCCKQ)txu5&C8+=nZ?0rB7e_zPJo%WN@@lMrsibuz+3I8sJ5btm8J z$pe?;ItlSs93>q-hU>@bIsa!jaRcdL9})4-xg_1ZSC~UtrZx_e2kybmvhf7|jrMZ=LR>#O;L-DcJq2-+ zga>eoglzI|j!Rj`OL4tKU^5Pt!{!JMmJUsCA;~4FSK%<<0NwL{I|Y&3y$GDZm&<3#tvF6{ z;25rcQqKR`Z}O8%>0usDksI#BC33o*!qIXZ&wq=3Kys)U$4LENoFMzcgni_M{`)_R zC}@`sY`|fX)dz97EXyhF>;tkfEyJlYC0lT#B;8TmCOI_YZO;D=dEjaa+NHq`+$hWJ zB(9N-Xx`sBT%coHsM+s@nIZh4j0arY47oqQi;$C zTrLB$w^0x$%jh@`lOD$YgLN!fy9US0GTMbZWzI)%g*;%vL8eeTv<^pmtHieUQP41Y z82J9Jmx*2M?Q-5P#)&fL8*z+x1M3iOmMNI}K1nP0TaJ4q2e#sfv7F-kKSn{6B*p9x zNRqJzd_RB_WW+mhn@q_m93(k0{}3aV2o~e$=e(rci(`zP^M67&Qy?Q+gnOmO8*rV> z@j=`!9hmYV50rgk8E%jWZo%;~#Yb_aJ4L?pf5t~-v4m_jE?V#Pcn6M_2%W^~l2r2! zvolJ28&}BIy9ZZEQU~@h1)~ufJ^vRv1(GD|alPzp2XLSKsCDwk%(--UDGrt?*o<3c zl^ntG65;8e5OLoWxaa>W3L>Qg+i|^w`~hg`oEm#&xd{}=_`a)a5&I9%jx$ivaH zFYLrg67o|xRHkHp|7li>Y)r*CL6UGUuGfG6cf#j{R35Mhr^o{~;A&Y$2XUjU^C|yk zZLp_SUr{gjOSUP9mn<&BSu(=?xI>oRr2nu? zWduublZ12=u9J0t7>CQ0PCLmelI!gi6jVskY{Stq!s9qiRzd6#`-0qX4Nj5~?!xI3 z!4cdbTls?jlH}g~ZEGC`O_BrqaI=hP;@9MaL})Qikq~dhy)ws#aHMo_>M8aKSyjt% z>R3{9{%@tAUsk~}93^ML>|q`#bC!n_r9(S$wVVZ~aEF9={x?KWmSHijH&f)C|9dH@ zdDzS13IAgXqyvj^hJ&)~mn zmm+hz8du7Bz5{1Uhfd-ush>A4&`OdB*|(5A+MP`eY6l;w*WPT*RZvbo~} ztyJmIT0AV*@5artRr{Y7Xw^B_oAW=Jf_Rz3GTb7oU_XwLoR}0CXeG!TFTvF^fK50} zI&|1+FE1d|f~aQ|jGg~0C}@?fbQ{i)oH&jfWgW+!9>{-u)=SzoxJx#wT{wMgnelha zaE)|u!5RFw6ZPN!Sw}&-^mrexm86+CA<*iP<9RVom1VgRcS{Ej;WYU)JT;gB$^Dn( z$jx&8Z>6ACdUy;cN{DBlNeAVIc{oYxcj6YA<5RdvA~yf5Kr29gC$t#X*)qbt6r{^W zF<~NEE)Q6Q>m}(n;0EzQoFh{*C4>&is#u0I^`3JAZL3F?Rp2BdAU9lyd!>Fo&XhSkfIDTYog7M* z%PLxmQ)MIDj1#5)NT?lX$P%0;58Q-%Wz`(U`7&U8+IfLiu*~ra zoGI&m8_t#&lH<5d<}mhr=3J(14bGID+J$>$S&razuYUW9Y*Z?{ImpcVA1zT~mtlMKaN=BCr>?%DSBp!H6Z~i|~LX(FUC1h15ET3uKO` zT*#Ek{g&YncglU|{}u}3B#S-#>~hmk}i6EV-Zz z$4H3x;|^H`lP)F6B+HlJP+8WSaE8<$#vSC;*!e&0GPX|1ffaZ_Ii-pI&=*8$VM}JHXDs}Fb~Jc6z#+V(t%SrL-&CgR+()! z0%sqfpjRHS7q?1>CR|QLMwgB6o6<#iNTz55?v#DvpwnJ*Xv!QqEY~l?cBb@b3k6xS zY>wh|3HgjzvRIO6HO?N}O8JXMxK(oCBrcSVXkJ{P6)sa|$8r7-$+Fu+gBsvt$4VaEB!6!r~7fcL}=3YSS9kn zCAdSD-6otU%iKOpLAJb5Oq<6Wkwjz#u92;I8}5(?9><*$^4J8jT6W4cxJ8nD7f$y& zXj>x`WOxPEf~(ovrHAYAu;j=-+$uMm_Q&QUF0TXB|5(J`DaH=Lb_C1QEFO***KsULeFf8P*in<;kA|M}O@Bk4df?w2{=i@Rhi zop3E7l@Kq&1=4{HxLrDM5D!1(9Y#|YFokZt@BCjz!GJt)3(nSk0H?^5%t&I+B?ngH zVafU(I9noi5)aD#=UvAXkM69a=f6!srsTjLY&Cj44!oY@SC-8}+$s@Rk5`(I643)V zUm`j=nJJd~rMSRX@1FmgDOf2ZKH^;Pyw`#0DV%n)x39uE(tbNGlqooYBV?zWdjl^x z`@CL)E^Ba)CW!I9FTO*nuE zkDdRADJYSwpO#7%%U-?$N68Jg;V#L6<2Y9$5_=<-2(G~evI=(Lx*9qEM<}rV?1g;6 z51A54qIHgCE8d5*BxfcrA}J;77vnBD4L9OpiO3-w@Mk&yr>2p$a>M1gUZ!9x4w9ri zhKpp*Xa9(#lM&}(Oa7|$P8=XUg}e3l|K{IB$X@ayP>g$Ij`w0~omW3$FEL=?B2#hz2T4v%&ftTHOzF}Lo2^zxyqN|q z64E0$S2m96w=(C_fmOI$w&v|PN0Rge4w5;admEp&C4y^h3JPRScHRE?9wcWsbMu5ShZ` zI9Ng+dk2;Xtik2p{cUR(1r=U_HG=cy0SlJ#-LKTI!#xu6eRxnJG%<_AMRH;>PL-V6 zi1S}E5#ankL_xIdY*X(fi6mspalzOH{Ja3C$ODeyA?d*EA2UKp+B{q!1KNp)O?&73 zKSe>KWaa$joNkhY#kfi$uopK;`w7|X3-S*XEW-Jcv>O~tjvU0@?$+%)|EK(f9?AvF zaF=YQTX1Nj37MaD6qibbX57WHl;d_a?vb-$2TqeIIEi~l>qpQ3c`KMB38{?(WJG&# zg@iP4B}peqwh+h26t2f{;sdx{4ztNWWk9~`-SdAb1%)z4n{l^f{Sh1{51jrpA|`wN zDqJZY+>Q$+XHMX@^;d+|WOV4#|`x;}BU^WjJ59*8R9w zR>`EFbARy?oX(Vto&TFC=#dd0#?_K^(|$n&BnMXDLdltJxJY~)r$6qEICeD=kfdIN z`~N8C|1Ju0W$PTlVX~7g$Yn&*!F9Mql5QWakq%G1n*qsbxEPm8`;9nFzyCkvTp%Hy zdJiL%t$8`lkP&UgwerAYxLT%cb{@-egBO83Tqo^!;$Hpye~N;7X)r&Z5X!13#)Xn} zdvULfaKbOi0g2!uTq7OYfQuw44`RDnHj*j7BBb?RkC)*fS%zD1xvcx6I78O;j5U0| zmnmC~Yo!A_aGm(%8qWVd8Ns{)PCHozHm;Bd?!hh6;lN+Bt|h4!;!K&M^|(NGz5_T* z>L=gJ`ClX?IVm%g(e37fQ$u<33q- z(}-BPETa{;Lc9$(ND?1+A}sfdEn;i;R)uY?p`b*1vfyi!TlFT}m_!1cI9miYl(;M*zP^M7&~1#)~Y#X~ZJ z&A3pu)+0Damf`erMkEhdg$E@f+i{jm(Fxq_4A`9ib01}+kp^pVrR;pWajrbj|1mZm ziBK}Glx0|kt0ZFk9n1YDttYA3n8wckB@|T24L0ExnUcdeN#Rz`eL!HnIsDnX*57BVL5F<#`*h9Vr{nK?=g9$5X1vVp-?Q zaITDa3yzit9L3d=bTgjj4d_o^2Ug=DSrt2;=KK$pke{SMk<8(|-!dXuRyH1z4()O3 zWoHZA#6}|#S%_E4h}Yv%IcpAV;&h6T5l^n>gM`faQpYmF&A3+{a0K^>r$57-%Yatl z3K_t594_@IYziWzVD9f&MiSz+xLTIwZd@)o;=h?3k@xy!Tp{&kxLdM*KdzJx*^_Dr zxh$(CxJ0I46E2Vr9ma*?Y0naJdB6%>E30H19+sW-I1cb~!nR_6&$5!FS%ae_DRLUrd4ZsF$T1alG8{5bl>bp85x- zK$2)V9+3L2xJV*&4A;mM&VG)4!z871{^wCpzTNA2Z9j9{BL0vlII#P;AyabP{mRywp0mpR#ig<;HseIu%a7owv83WZ>F_6}K<0cEu99W99alQ{H|PHe z3fd&A=WZu!C8^fpI+@emj%AtoH(+^SGH#VmN@X}vrgT3pCE{b}|D-=NVhQ;Y+$-yP z6RwguKa2xp)l7Sl(^Hai1x}I&Zo~D`;p4b(tDOI_I~cL-WNUDROvx@BBuO=bQ{({) z8cAZgejOeb@57Zcz=l@Yfhm6_NhPV4VN3pvs4ci!a^xtkl>5)v#pj4hFXF3rasF3Jh|An#CAdJ6Y!i-@8yt4p%K)bB;rj&H$X4JE@irXo z4ZyaJQxGq68r#YUAL_xc(>kT+YLVOT+Nd1(33Ib#!*?|)!DNo{53GuwQnbWa3^s{UnBM;nz ztEEGMf9HPE;f1)ySMQ$x>nTW*1_yAQ+;H-KrbHsJ6xWzJWC}Oq0SWmLTqmnydIxXK zvWiyWP-i1D=l^yJYGvm-fg2?!=DtJHNeI{CD%o0h<60T9|GR`(UPzL0jJNEpGF(Ud zvGaew(?BkmbbuSm2$$e$dEh1-CpmH$H%W)5b&|BQ)vmxbvQuuuwa?4>f1H9M2~q5O ze4Lh5um-2d6z#(Gk^>{SMmo6QA3Q)-#X6iMIkgWrmfGINGVvfcln^e)RTA=zcu?l} z5H67pPwgV4GKI@=w+vt_PLU2A!wt4Cj%>BpcI&L!AFj@_F+2XV99U`jW~={7Hd%W#*hk}Y^hB6bu9$<{pM zL(czUX|Vc3Ml2oJfoo+>PvUqBc-ZC!l2q$y zkR~@gfSV;klY5vV>CjT#TA>_ad7cvybN;WQpjondJ5KzQH=+|b-6Rb;Gxr1`msPVCN6Q0t zaIlPc1h+|q77URCvh%IOP0!n2i1tx1 zC|Nu4zl2yKuoySU;js}1%SLkur%H#XeoX`|Yq|<_|R_X8(+#(&=gu^8V4&x-*$fgAbSyA5oZEFPu88WBaaI_@Naoi+R6dM#| z<;aNE;52!K+l5o)fg?CZ?ziA{1~j%xIRDpC&^cDX`v6Xt8%{hU$cm5=Eyg{SUXpFZ zz2ZYSL^h(S6S%)ba5-)@5p&M}txf|;s$)1*=6rT=kd-OxI1i`F2zTN}dBZt{)1-d> znL$>U46qotxW~8e{NL*o$VN2btRSmR=6Defl@V>gxiSR@ai&b+l!-xBn6zK!SO&BO zr;aYe(ewW(1zi$>86kvFw${}+L#AX0w&Y(tJc(N#^QL6p*>qU0w{g1+Xb&FnZFKJW zA9zlX)hBbf5I0NGt;gvS(gV27%pp@ac@lFf9axIHCFGlNmQ3Lhr@a$#bN){cWd!oT zRX93WcACG zt-;}vWV>*eEV~h$EfHIAKKIk_|JP9vE?K(|N5~B)PGMt_4lKqiC8QhifOO~(&XlB` z8qP*0%XB%;vE>F^DTt5`9K)@W6SKb?WW~u&mWSiTJ8_zvZl`d#OxgSkm{Lj7Vr(}{ zkM>fKAUB*al@UtF7U4G8CpO?rne&6VN>0Bi5hSe)Xc=yi=WU7L@4sZp4UW(G^DYXq8YG8ooGSOy-4luU{u=_I5}aP#BdR=f!pG4S+eYQ;ZE86M{vN{*}?h0Ug-KQK&j?ACU{oN_?o&UuY#7L6t#nGmRbZ|lpA(SatgwrHR zH{dS$D0UF9lvOb0a<*!T$THk9+QHHDe+vakvdospl5`uReZQ;a=Qqyk_QqAbo|r=ajRepHSA39!Bxc@}riyWB1DvtGb` zpGCVKXT69A#ec=o|MKcz!x`dzc%`@#mpFFLf6E$YeMmvAH24&EijU)A@emG5@H#k- zM2_kAI&eB}_}ue3xLoSb$Mtyh`E+0!1&z`m8i&aZuD~TcaE7nDe%3M^arNa^i0eo2 zcItoOdh40vty&_KN?@G`pLy1Jt8d&)D`(uO%R|Ro`3aZXqcZ0*h+R-in|D zE9s!qp}$=*-fHx>XIcSn4;RegrIQ|4x(%YP46;i4qOEe*FXGn0Xe-{mVZvON6%k5x zy%kq~5p89;o)OO*({Yl{^>1VVbs+@ zRw*IMa&Pb`PWSh`y6taIWFrZjX$`vVkKo)OBI?%v@>)*EGram!IFbQ< zpZ4Pz(7Xkl|JvXslF0mVmf<}lO@GKttHXW3j)~;RcV=2$uC0*qR?eiER=4XLaecVw zk8#apuYK*=CkF8-9Jxc*{C-=2!^lkfo*H^)6_~S!a2!n)Yo!7CGMP zoZ{7ANYchn^afB&QU*|O2DIG1l&m~|rq%0?;1!$^JkzRk{dvr{Bk)n|cq@pAnD!Tu zBl>{tSRe2uQ>dOdpTjH6>wxXgoTZ%S_4w5Ve1kE8Id(g6W)e9;L`=wU!y19DSf^+Z zH=pgbzvepbcaG=Ba7yS{2l(&*QlL{1b^W(T^h>NAcn#|VCMJLT0U!Lo92&t{7tFM3 zoB^@XB^UWwIq#T_i^_Zo3daiktY>jKCKG7xXZ;-~;277Zur-w|cW*fFezsnA!qGo| zRuWF3e)P{cD;4KQc)l6entIMZ>vjrSO#!|Ow~JTf5V=7CZosAk9XRDecbRg1%mW-& z-!~)lvu?ww(!u38^pepIvHy>=R#DLF7C6qs(bK&i7ve0r!GpM3>L0@`;*GdXT!TBr z&*QF9JLeC_DFr>!U>EKax8ecu+qfyp>)=0dp>(hZ2St1JpE>QtU*Z%Z}SP^C*lP0c{oWt4X27{;&ky`oGHErXFE3M|3V6SQZDCTF&a&}0$e@Y>(B!@ zC&qI*4)cw`Ni#p|DcmUaHMl>;YrhS*OZ`i@e9lbo{NL?d5a(U+Ca#x|9>Bp@di5XT zB=J!^EdBzojQ84~!ZjObT0{P$%WzQ%Q}FCeKL5D|#T2y41&`vYO`PA(=|+xxiW9H$ zZa9F4zvuZB?vM_Te~|ilUVRA8UgUWSZhgj{X_dGgxSN8m>%0bqctE@k=SoPQz@_46 zaFw_Y*NAuEM)BWpn=J)zQqV2##Dg-Tk8tykybgZmw7<#oAnup?5!|rEt3Tr*Hl78S zTYPs$JpHUIuw74q?*)T`EDHMNf>k&q$-Cew9EMH%S8-H^_kea>DD6+;5@~)L%q0L+8@Ww(*FEX=3LreSIYk1agBF_ zTpA1~dJouy1El^9+#vn}w}`_ZW{&0hWZaBR2k*fZ(*7Bnf*L7k!?|*U6SzQbaKR(I zcFUCAfPSJjps}};11As zHiC5&gk0-I;6FGK;?0hw{(0QxtM{G1rJ2+0^$0^B1bz5x%2^RXpKxEVJ{{ad(2{1xuN zw#oX44J^C;m-Cg#=;3f99>AvlUTk$-Ze8luZ^hBr)OX@m3Gqj`x7HibQJf|1Lo2!8 zA2|O<|BSP~OF=FT_>C=JPW%8D$OUU~#2>sH7U5FrgWdLj#Ff(i1Dq)BkKkJB&v4s^ zJV}H)Y;OctQ;;tgT#sAif;?Oy^@aE?>dohb=kb1gy8D2C;4W+;iBsMBs46-j^^0*f$8UyP z|C=h#|4s_b4W6e#B8STl-3FbwPCSA`I16rY>o0qnDZ}Ran{f}m*{v_aX`BTnN9u8= zxa(>5|CLe@@LO&uj=@FZOk6H5#Z}@)Tr2Lu4dUQUL{NN{O+lL!+=V;E8*qZ;NDICe zvv_<{^f^uvpI_}~T`x|?DdK$m1F`)q1*sI65d9rzNP|=OHf)kK>KQ-l3=Si+jBduE zIMnUX12{_Rx8ph3EbB}@t_Sepwtn|F7R&f za~w(o-#4AypuwphyMRq8m9NpH{l9PGCnoHCzMYZwF^l>3oDStW5y9O=!2EH()Ef6Y z&K8!j@8i33{@p-96b0e5az5!ig_Fde;m&uxjb_qjwo>X>IuW6L9&Xz@)2eW${fmP97rX{1aFci#hc?Z$!blS5f#0uTnQimhC*$bW znN~bW;?zHkTkF00CvYSk3ZqBPzS4{n@LcEoa|%ACAfE!WRfasv4aDEWA#`B$&p0ay zCm*=nN^)=b3tW!P^-tq!aVyU3BqBu2dERl{?W^~V-_JV#_w-6GxDNM=b8)+P6RsD( zfrrIk;9wqTIuyQz_X}|{j&|&ve@>6?p&(TnJcAR&ZMcMpT)|e(fz4k3Ph2bYAzR52@jToqz6&>s zAIA~W;bz?X58HdAIZ8o@G#G#3c&qz8Zy!j;xu)LF&w2!>iH}}1-m3U|rd8l>TvPY~ zMbI~%kMaYGflpZG?nZVc-vvk7A9)3tv&LJ&AM@R=+h79U{kGEqUlQ@a8*%f=nO3L! zfM;;`iJ4Z9JLjdBbA2z%(5*j&GyC~2*{zS6LkGT?Y4yAJ&x;#x*-4*z7ra41VV`%y zDg1~eV8FYejGvHHcF*+fY)+CLzyZu@t~1BD>_&b*fOA}T;l#r;tp?W@|B#;t^mz66 z{E+Ye2c*Hyn}e(%GiQwWzc@@h?-qV^D!vbA$rQBU7_t8nIv~CtXA;rXbjaD7&#AM& zy-eoTk%Z^X8vUUWS$i+;;RfczWi9T*&L3yl{@rQcDyQZbYPa-!<%rTbm%_ZP6Q^o^;@wMkwn*1n6jb~a)OXKIk5;21kSSZT^Hl*kXcse zsBP;VZead6$K!u+8V?-(!+$sg7r1sperY`&yuj(6^JkoOIUb7e{5_}sLeC3uf;bg7 zj+xKDH&c);54-~>UgF*0F5DXBc{T197vMqh{W#)Mul;w=<%d)k&$2?C(~*cI@IsUL zU8cZ^fK9<8Twwk<5!jBKB;-;2WVFhdto<3T6W8NXaV|fobRuTM6~D`}DV#BD?8ot!Wzb$+g-dWEqwwtux3VvA{m-zo%+9^- z+t)wf+4f!VwO8PC-qLSh@c#dc(Eo7JA#asL{gIr(=A+k5_*QHVw?dpP?VrQ>zV`0< z-$6kt1F8(QAiOmC_#Pt$^%{X7`_u=p>y$HOAQ^kjI;gz#S z$M5vnjaSD%Y>vAO=A{A@UcDRn>TSbh9#xPI;|E5kj0f5tB) z#Mm*jtZHuHESvl0@&ZB9#khVQCt=^`0_vaRgT`?5EZ;{pr+q2QvW5Bxw|yDQE>y1n zoK;j#`&_sFicC&d>UoRzJ+BqpS#rTsw}1PF)r`peaWhlpJ0gO53};~ehp>*bmcGQY;f7|) z9>jGw&a%?n`n`CNdXuDI;!^DVaaKY2UwBQI`sBZG{s({LU2qQ#!mxS3GdKxHxi@IT zq1ep%3Eah;n@=|1-N|u|`DEjJU^0%94&RLn#G7miI^}_H;9l_;cu*YP#1tI%vN##X zVAJ7ya6At%pA)LF6M<{o4!wbUusOc%0SW?mfcbnrvi*N&CpDnCm_7rM>w>PT3><&J7vC=pR4pD_ou7Z5-d=wp%@) z_E*k(sXq&cN&RFTA&$V=;#7W#C4=inmnG-_ll)3Ve&(#P-&DGG8NUU)bk^AK`Miw- zZu5Lo7B7)*hn>^yQXXLbIIHA`II_pfi2~exhqp>z$3xh+3Y^cs7w_Wpe3rKgitz>> za0PdDvi6TSfE$`QK8Q^RoOSUrUio7$LdS6Ma?fAkH1P-zXw<4 zasKBJDJKFG_t2xwv#coR(<;6Ncb+xJ>S5<`9`FE8dvuo7>b8FkhgQrQ{p~lW1rX=ay$GG9=^+twPN@x(|N!S3R0e!WrZ;WrvrUB`ay3Q zoxp`8-RK`b>l<8O=+y_l&UZ$1z$D!q{J@!W#$H12z`e)gtQHzL&nv@O_57v zPn>}R9-L!UaQZkQd=OXt&kK12{#bknZ^9-iPkWQMWNh96FMreKC6WTOwPwXD+zH_xpWLeLQZQe}(UNKpp=CCzM}d^|%pz z!lqy)>zF|MMzkB}VAG*~Tqr(oA4w;^9#@O=a5y$2tidT#|2EDL+h0>qE(O!udF_^U zdJ}#go2~Oc{1TqvcDN3=h!5aTNis8_|KUFIrEmLL|MF~G=@bkSVzX>)d=i@%ju-H0 zBiV7F_$F*3kb!TP>x=P^vFX5{@M>)C_dZ^W&v7Ei=U*$J!_Rt@0`nu3+4xy(*6D5d zMQq;L9>lNX@3>RYfIqx9Ti=2=V>7~j{46#( z6ZQ|5CH5s1t&;FwY_8A6A7RshYJ39QCac>h7^c8{4j9D#e%=&B9Ap&OOi?Nhm-+&H zsnplvE2O>yUn}*)_=kRT?6EnG>LMg^K|21axCsABZcvXOkoqpXUg`thXYZH#7+fdy znV8R?-Uv%6cvTuS;5dIT3_lx|{&w34;q)WpGu^CX|hn)X?6qu~7qrunMY$Tm{ zQh>LNtdIED(y-}JG@gUah%<14xCCF1&8lg@DRO=HN9_L#DKM)b=rEsL#Bum`xj`0Q zCN9T!ikt9qY;vX--;GT~LwZPJY_{?Qn}Ua>!AkrXHaSs=pTXvaEqI%>@5c?|u#edX zqbvk3sSoJo^u#7-V(?3N zG)ZkX9SYv0z+`DD{s@~9HsXI`vy6K1F>E>z{7;e=n-0d~z|-c89mm;tDmF=2fiJ|q z4msz4GX;?pm>c%tSZqQT`YHd7Kx`h6h*PmyW;r+un;faazrf~xt@u7{?l*uR#?JkG z=YRN7LP&ubVG6FsCTsKYvr=D!w_=kc?f7MEIy8je#wO&EeIy+=t1Jz_KUzO}{uffv zO@Zk^9sWeziTg$`@ST>{XG{S$uVB&mKX_~(z*eAFUxFuy8}PZ<-<<#56r4waS(ico zB8#zECUN*`Y(|)ce}qkrl;aF+BGQC^hRyNYi|@x~V+%RvXZ;p`$DIEO6l|9ZR^m6X z31KCE6PppY;7)9Eq91>Z&76nz^F<^!NtcAbl=iuJ1oQWwMqfaxDF_JilB5lXVDrF1 zJVojwKIdOKmikmYN9qgk_pup3Exrbu4t3xKL7e|4WWyBPOarqFqy9|@u?cZHz8jkk z72!g0Jzgj7!cSn6^#RBItlvp}41PX{^WWSslY&NRP>Oep8}VCm!yfz(sSh4t3dHfa zADb!4#{b1;iYjoBeY%&m%@mx2O^Et%sMLpk;b&cdO;RS}+1MU;4G*i1o){U1N;4hl?26L1zbS-TSF zV3VYkc#YJz;9_h#+>a};xnI~xRsl8xNWxXvOqrca!6phWGW!62MJ{N=d$8&8Anw8@ z2_uI5tk1BCKq@{d*B9V#u$i)296Vuc%5AHIg0m?wNimG4U~@s#fB6+Xe1Y4+bew|C zR$YXbO8a{JGi)N*g@1)j2Lrz5t5`gmODOuPx34wT{-unA!!ZV>n2zsU8$ zr}%vVY^Ee0zk^N0vhgR_Hvs4Sub|*73d|~K#$RJIM}7DkY+kWKhdHc*y;rP69E;8M zIXE7h5m({svFT7NUW}cc)p!06P;i@D;CvVj|Ax0(Y$l<#iMH=jY=>N0HVsR6@rM?nZVH2Si{99}y(2uua^THD5=Wp%CW(tz< zyVy22$fclDZcvT?iA@LE@V}&f5TC+knML^fTY-FCZyuP6r(kn^0gk}tY^lYUp2hiZ z3OXp5Ljx1CVSEKPBZ>;}x30$~3Da=~HX|y+tFY-nJ+`qKU>Ck$95CMBDn5(z-!zD! z;6WOgIm*QAvFTtbuEJyc0R9~|5$M4$V3VZ5r}>0pdCwDDK2(h^;gHt;yI-VKlx_>N9Yp zxa17m-K|7gC_V}G2%EJE6&1Kip%j;;wGFR?zJhHF9jjNY%Jmge4ThD zP7zn)h2j?cLvcU;kvQy3e=A*VCsB|=K_W4C_WoR4b zd2Cie#93rLHmfQX@5JUcz5xFXyGhRb9|f%xn04NP-;)~*)>H~i4`c8p*o+_(N8z!30AG&H@!E*zWAnby zgMTOvKHJ~A9h(lt;{xm(kaPZLQ*fU&sKAe4^MGbtg-wL|@blR06QSq$TidbO858lV z*zAlsxD%Txt-|lQ*Za=@RtgTe1x^kO;E%DH)9^|D*5}xaAO(Ld&c}g~UWaS&cd&_I zJDw~a!slTkHhTU?h7w|FkcKbArUQle%FzpaNm_@mllGlBS!{jB-?{;t5l7=6V6!h| z;B-8}oc|>hER!2F;5)JDKsWxm)CZmGZ><)`;k&WPfh=5v%@mg7$HYyz+G%gj|6U5V zQDAx;GTGm%$7YTb@Qc`lbR}*SSK_~jTW}LL1L()C*mNi?jPoDc<^f3*bWvbNkc*FE zv+SyIKQ_y(4WASbV!w;MB#k)F-e17C?vRuAJ8 zY_dA)e1B^xHW5k3w~LGLGI2e=Q{07@Uu=6f2$;O(wou>PvARHW6yX z1=x(Z2Nz>Az~FFys|1^f$KywA3e3imO~D3n1+K4*jmb^?PjQI1x8s zGo?9rH#Qxt!uDGfm=3g3Z~&Vg4&e9Y2H_X@TYcgbd=i@x=Hnr3I$VRl7PsSJ@z4dF z|JEgQEGLG}#uGV}Q)q^FgEZ_XF2n)iI(!;79qz=z*i4xf;cuOb&HF?&K2NUCh_HD} zl?zH}a4|L!X~47Of^Hmx%>#ojBuT|_I02gnX5snROi4Mu5t~)eWK(b}1tx^O_%>`p z7;=%nl_^fZcZgTwEO90NF*Y4&!9NlA--!#v)(n5^H{xhq;xqe?GvW*i9-+Xj%M$z) zHdD}mpTQ>N-S|0iP&7Fp?c?xYuvs-(_*JPd$8CmGx1BrebBYqc~4)@^q#ldsKD18lOq z6)zSK;7n|87#_#BT-ba!oPr+|=i}dE^DSBpZono-+T%F?|4M<0zz_{u#F1C{TW??! z!ZiH0xDa<@v+>m7Po=&Se~!%q`E?5Gq&WIY&i`?jdmB#%4bH)4Rg~b1u}P{1e3`f# z&&Fl|L38=iN*sshVH43ToFp!{DY%gWlXOiuP27tYW7C0l{0=^xa4y?q>#g+J{ z(!K@%LTvX_kVk$|A_DL((2i^QYqL< zfeBFoZV=bvm%R(D4%{Lh#(S}uKd`Q|C;ZMfQ`Cm`LXB3!a)P=voW~&WI zU~=Yoj=>YenfP36t}n$GVYAE{@ocH@!Sk?h6*=dB@YQUU6qscgkMF=H3A6Ft*hHuT z-z#p$#n|LfAAU$2`hDK8u$h8HT;bYx{^wAzQ5sa?--%oCAF%1b0REFWd_LdtU=y(v z{2De>l8@V^z6Kv0_2~KEPQfP>nDc)KpTOpUk%@e8kQ=1oz*uj@h4>6{9X=DARnv*j z5nI>rg#->YpZ}vNm>~@^aE!PFUx7^s8*l#>PwC4L2)4z}Poux%dLPeF$? z2utF$!lph6AHgQ1xwubUjXxK+;V;F5_#`$FjJVF<`d=*PzbQziV0@f6;sP9kO^^S8 z&lA6kFOv2nc&5}xU(ZJ~Z0>(6z8aedJ%m%^IRDKEcTjK(4UBtm7B=VmnaOOO*zAPg z!};PB_+D%xREcfztGEQ40sR|4>NGF~Q&M>8#HIr&xJLX-`~o&P@q7FdHY41Ro5jO; zkNDCX{H?ddw_y7nDJZ6(OWc4DWAnfd@xP@0j34-0Ux?@8A#pYy5kHPkyTV&FfBOOF z|2Y(x2OOipcd;2!*h0Rq7hi{GU=y)>aGZEEz8afl*^Y0(=KlZ1>DWx+C8;(a7NuZu zDszra2a50t@gMOou$kizaGqQrcq1>Z(moCsiSNYg+SBoe3L*TwhYeb_|k1^lk~AbwvQkj7iC z_;P&Ivu)i$!N0u%s|r0n!^hfl z{=Y%NMPmj0S~QNr<|~+pn|S9F--x5J*+}li2{@4h-T5rJ6&L=%yS@|u2AiB2x0vJF z*g5}aQBW!uEX9wQ2Gp10_2QRsrL_M9KP8@+&d&?5nW6-|S+4&nu65h{&i|(VVX-t2Gf!e$x%0JnTeB-Z^r+@W(pp_ zBjW8i=ti%;8=sBMsyY2O-hlAf_y1Q?@LjoJIlcs&4prbNY?A5~JX`!Pd?hv!o4l0o zc(93B621|e``wKf-6%i*{~ZMxG%zFDhqG}7S2%Mvq68wcMpXY8+D)#K=8bF3~m2j0g4cXIx(bRTfq?R-(VoFs7_i^K2YcRt(; zvT)oA9^lqLiidwX$LetXSKOX6$6|l-b>OITeXiF&^bUWk_a2_d-w|~>cnwaq*LXep z1qG46o@3Rx58Q-X?`30g-G&1Sz4l+>?)!*yaovm4vAO>2J30S{DaddeeE&`wRB%IgD_w>AYw3_%UxicuKu);zujB5QnKCyg zzQpBw7@<3WsXxZA&++|>NKVL8aqHeW){uL@U;o%9WNpkLr-RerIp=}{bNEXFqdtH; z4-z5whSqXA@Bvf8R~k)sC^vL_yb{;qc-K$jZrtFue+`$PPkYv>^T6Y{{X+i2 zqT4?FCnV)XJkK3~eFFt?@%$Z7H>AJ9jX(4{v<0_|J8&=VaFgg8r+r%N*k7}~>@Je{ zN8a^IaDuo5r+c=oKU0w76<8nP61>tK(S#M`z%AYl<8itHGPeD#*?AWsS6Ar!IyTKt`g2UVg2K|g>h*Ml&fqSuez>jh0 z9kIT@obKendOVEH_03NGG9t|NzVrVx3JNL6b#Hj?Dtd^`1q*OMmKVZYoP;yn_RrvI z9Pj4DTe$O1@A{LtADbzO%%KB6_SKJ`|39K2nu2)uhQGnt;%&Hk^a5X2ci~2cZz?D`>~1WUYwcj z-ER<=;4pLkU$~kPIt6Y7eux{fGe^!GuEpU$@#^bv95x+%4`<>Ex4mC39l+-L**N_! zFT$C)9NXrB4^vP}L85zuzu;bM>W|>)yS)d7+|3PfjXUR8Mr=Cx2i%TLMBc@NIK}PI z2u`@yTh`HeMBrZj{(qa>;8qIK*OCG1L$8ah(SsqqE2c`ZxJSf-SgCo~@ z%WyNU#O8kO1)Tr&6lA#__%98DOT7k{{F)nx7vlun=C&`w0S|jq_(xohA-wEcq9J| zhp#>7e+~tWi{i%S=xN-G)7%lff#cHREGKK68=P>wGH&c8)%hKg_QJTaWq2dbxi4;P zO7F$Bc*uRj+KQ{6;Qmeoob$hvg8rxC#a#EpFtddX>zW869Z1V{fNZfqG&yr1iF5BKw({|OYtJ?Ay}DbBD&_y2cV_NhVCEU}`}2KC_L=vb z=e*}R?`d;p=E7mCi2{E{`X{1BuGJ)G0WW?sDnIq26}%cadpXkE&;KpPg_*c;fhEyq z;H|I00ZZ}&!0kVc8k;P8=?x(K2~A)*Z~<_ypHYC-#y0}bI~X;lVE3sD{3~$#7O^z` z40x6g*q;Ae%!EgIF$14ul?*B1efW+?E>0FTK^<_55WeeSZ8Yu%-g;6jtQjwS96d-2`)h%dSF!mP4zx{c6l^x(s z!0=B#IvK+!oVp@^p_RV?zacpQSle~}-{a%7yRWD(m+4ercm-dl9g8m>U2i3Lb11(1 z^`~-U9Y#KF{}uS>Tk)MR%Yi69$G83#e6YyE8uc(6tJ`%?3Qg$}k347pR*++n>;QO-0(loxtzH zf$o;Qq8c?u0he01p#GS>^Y4N8~|RNk>HryumZ}k zhk;jQ*iQyNBg0+?yeh+fIq=L3`vbu18tr)g9~YKnBzO;aOJf4#W8mEx_Uu_`!wh>X z;P!VmRv-nuGsAugaIXye1mL}CJLbPBxG*du!6U%gOB&m78SwQP_K$#bGwfdgFUhdC zydBeVhP@;38yWWB0~gtLz5gAE3*TfUxEeTWCxCqhaL!$gHCzhZFT?%yfVZ7 z3UK?o8!PY~@EfMxod15tg@G9fI^TiA=nR5l;E5UbVZd86>?45}W!P^4{wBkIH}Jj; z`x@Y%#jeYT0_$*L>^+Sh{se41(HH~!b%qRk5!T-=GVEbs|Gka*M*#aW>|=ntX4vo2 zSlgw1I4}kNA<;CUJLj=+mEa3Szg zV6%KUP=X83Wh96KugbuEfY)WTn9WX15X4Vy&~iLzt`e| zuCboqbd47SAB&L-v#H>Xz<%JMh4%sv13uZpC)@=EfQv0W5O_VXy<)l=cqg#^u-e1G zE#}n6(l48Dz=bjlH1;6mAFL6l z0GDcv1<4HHA#<&P2lzF7hI0tk2l~)SFWEl8f}|zvSZYf84mCMO+YEeRO?{5hG2_BK zB=Be8&w#sR;1g|){>?Kwy6te&6CD!Rmeez4kPFa6Zzx>j%bJm+G@7InMP1@b3&ib`u zdDczp8o;ct)f4*asrRc-^wm}B*xvwqKcG(f4Ow4R7i!q+L3OK!&#EVW>)5&3_Yb1K z&Q%+K>zIGq@$>MI0i3eW_WA)o3yi&m1lnc5tAL9vJQsN9Ygj2`ohe_|1pacaD&N~7!GSO`2vscHKW1s)4*FUU?<2>X{sSF5*Z*#jma4Iz_5^N$BJF;60dPJr)DXFD0QLjh zBi(Y~e!zn*`^Uh$f$f1P`ys3kP%O^5B!30)L}061)*Bb$!V+B2>ry?G-Uz%KxWd9) z5k&3(RxY<#bT?@>7QgfTW_kLz*@M7q-)gj91Z=$BXrBo@?wv;a3h>+ivW=WQ2iN1m z=alhT5O_~~^%W{krn;XAs-uhwn>%op2Pb+;Gc^+sCsy_lh2jT68 zngP5sqal_8|D0j}5IFjPYL(?XtG>x2c%oun%vfv-09-b|5jS6qz(HPnsE-4`0o=n% zUkRKIU+jTy7VrRId*p2ZUIc89%wGUM18hAKf`{54Mf5dZFp|LU0poUpv`97Zjtqj? z!2bfad(?}-2Y~G!^(F8z5604`>#ZNdLoLAeLoFu(`+;#65d65QRf`M7842b9N74!K ziDuw_z;=QE1Re-%*Qm|oc&-@OcDNVt<-m3fj{%+vY(Lt47x3M{!l!R)t;U6gxPUt{ zQsZxcp9HpR)NTpJj0}4p;58Ze65zLi?N7nn1N=F#?eHtWJ2UWizhN1sK z;PvP@WpGg2bEn{U$AEE{Pw<<-`=n!GQKu7>UV~rHdA~8iJ-~k8`>YH-uEj5}0T)_W z0T-bc=zn^49d@0GWt;-O2l&g|Dx^Sd-vV4__dwwG*W(7r9N1C55S)h#y)qKa1s(`| zjAj22cvyzrHx<7P18h&%7XpvVus;CYOBZ0}{}lM<47-0Cel`Tye5eH;jlhLJXAt(p zbbpWC&0wDZ{0$^ef>0}V)(rfR3G5ORu-^upDe?Bh@at$&`=6eD_1}dbm#g=h`tq86 z2IJ@R)vl(#{3gderH*Un>(l1^r!W&?AW9Ev>cVEeimV;#7W_~B%<(zKoR1sbnQ|5M z0oKEgcJB#b(5LSp#r}*NKEQSaWZ!TozVtBs;bFM%(nH*Dd+_2zFC4sDoq3F}{#lZH^d)_6ui}qP#FZt`0XhPWSUh*k=(YUSFcguAzfo7ir_cJxDH~MN3 zx0M_1t!`H`9h2Rsz?R4ZXXY4NfbCxL6|i<#|I<<5l=(9202Q9p%PWtIXf@1p7rJUVykA{W-pMZrQ_!aNs8ffG1*3H3iQ$ zPQV;H*2Yb;jcdl?M%+Tn4j)$m8^HP>>Ts@cz`7ty4kYN0$QytJ(xSju-h^NBno(h{ z%79-0ZUKATBrqO6%%L^v{^NX|v-YbOkMoV{F#c({XBV$WKHyCYRe5t?N!!=)_kgdg zyRH~${VUX^&3&Dk&0m4N#zHl_xi7!NI{f_&^6Mti>zAK^_bpUwV5{%+42E6U?1}13 z;3>ctSZTLiuJ1vX8>3M*-Dk=sL28s|H*Y7@MDc*-n&e-|fBbPx#eH zB-8(NIp3j)`vFTGfv-Rq2EVm_1Ok5l6WI9Ly3+`phoNWKH;rS#?dbb!k-oiE&t(Y1 z9N;4GquvRl3*xZwpN$=57;rL!VANj^so25mfTw?_`n2+$)McjbWZyRy_9cGJYhK10 z?mcyXE8jWIzDJf-i`1@GzWlZwp2eCINn~us2;TQumEYResrz-f{`o_VW5r{@#>0(x zGjP$vYGi9H+xFq_RY-fh)(9=s<2k&_18h&>=K}8rwx`^wz`5X(zK`^u{0leAb~S3= z6j445)v&wKONjEfp!sQ58|(+p1)ml5^+vx5Xq3ha#tpzV$Y2M<-++f@G~zJ`wxz&! zx7mu|S&{CCO^xzfu^-)8Zk%B@igCqlz;MVOu>S$P80DG#)lH1M&&t@a8&3L532)heJ|C|!r%8HO+=HRrDtKl zoAMKSxiyI2eK{oD-RRWu2w2}Ewy;f%^MPByZV&1)^v3l+Hb%;7;E(>@$Tt{kt>j+( zYK>XRD&rRn8;gEPUocL?u(6^sfpG^~-uG*x{m*Fm&oHoXbF3fS_)_y9WC|MY_6KPvBdU*Ayjg+nioJPgk~3_q!E zIo?;%{asw{Wvc{L{|!6`O-39QprS!w43+yAs@ zFR2SVU}f`^x}^gqhM&|E_@8E{y@osPavZBKX^K4x4W__F%7 zqi=B5{pw5~eEYAu2LID#!<|?LXH}$ES?8}hv?i0)+df}?{hhcx3uMw)AsRv^QfAZkNN8^ z{Jj%4dqK8ZJ&_N(PjGp_qiQ3P)Mvkfoy?<+`c?q@fHCz*oLmT;2W-#RHvsnpw)bw! zfQJLyAe* zFR5?+2oJ_`qEc%69T!-e@%=iu)lSMh4EXDz*92tsldH5@F3tbGVpo8!!qy) z;Ncm#7I&Fb(xj2}Iomd*GKc-`Y_aA)6l9gcksk}qkrMS*w2 zR*1oM6#ia{e72IyQRS_z%x#vA%)1nJO|VP%f&_E#&oMU5Yutu?1pE!`_O@;K18B%# zMS5wn3%GsAJT}&R(;vi=3|R94<73q7mM#dn$KXfq61BXGFTdF){9Uj_ZPb7Niobg; zQM>ft-CoCCq9v-;3BLTHL-2Po>SW)exDI##u>I-rne)*Dfo;Fv0v-#j|LLYbZh?s< zjDa6h*PP%R)$Dc9%v_?jqljid;P0E4r~@bXPHN_R19Q+4)#pUtNq;;=|NTVc-hKk` z#3vhj$o;@eVK3B0A(q|%UJSbx(Z-L!>tVM$X#U@Dg!iP{cp`e+srY*)+>{8!e@_IS zkF@qG=t1D8fbHJ*Ch&iO?Hd()fSaH!`!2lyO{}nhF-p(boEtqSdL^q(AxK8J_hdkl9j!PG;B#0T0Z;=c!A&`<{-E#O2{jW5yP(2HaTz99$MNUPKSl_`f~__=yn_y~R1NOoJFEZM_`5x9MONO$=v=E%#3D3>?p$$nt`(+OzI*6!A3Y2YJrt|AihNzNCa7?`Te8-I_6&7L;K0FPa%CKRLN-ig0wu2i%2->dNVJuB66{C(Qj`1>*Bu{&4W4d|E| zxHs@7V0$Ss7I+D;+_FNhyMcdR+0d%QcTrY{H2{-eY;@pT;Ok#h(@No7`;FMkWZ3!w zzwx44Q|ddZ!=?B;`=!Qw_X4+gNwq5Tl{8z6zp=dOQwGPs$KPXLQX}=>9o|Fuzoe$& z@B04udnxkU@i7i~2%NM>h`GQMf$f2DE%4L8_I&(3@SDK)z1R+$u;0$W{ejEiyX=!t z>2bibfXj7*<2Q>9g$r96FBq=@N8ylN;19s30iR%IFnpWQSAp#z=M>-t!1hM24`!HI zgDa#Zbr5d>?gD;kB}7z*`>@Rcmf;4!nQUBu3tyg7k-l*^8@PKq0e)=&xJL$Viz%uk z0}lf(&cO5L$LfF)+&U_Qo;eHnNVCc~W>_|e4}SAbk&*;;2Pi;fICA{-9oE? z|NaUN#VmXf_-623V71`yAH$79V14sIr@s++@v4~dnwh@dXz{_Jl}H?hs}94rABI;R zhW~LGZnfo5{?s8@ofh)7ZSxqKV)EF=eo&(>3E@U^>~Y*iz~y;h&|2JaNLFml4#Qs^ zhI9XZXwfGhhU*T)cOHuC53V}&!ojZ(!)^cX&;oiNhQ}U;?>-E#IShY$2tH-c!S){> zT0q~!@TG_0dk@2F)yHAqIrZz%=x2S&`#)7LMSY#>_a8*ZhNDTVey4wmg4-2J zecNIX90)uyQ7CU6XgmzKEZAtT0q&ZCF9+URQ7C6+I{h`k(G2?yz*}M00}Jf+_$_s8 zIdMU+M0JM8fJc`X8rP%YHGU3w>AU!)Y0ExnE56h4ojE?Y!OrJ7;2fmaqlZr4bsN&- zhSMwy4+9=|jCn&{+h+j}M}9q_v@zKuG|=H z*@u3Pbzls`orPxt7x|%}s|XK$+yEH~o9 zfEE}ttPH^~aN{-u-vylPiV(C4_y~AqzB%D&!j}I)jch{T%Yn0-V_|CXZ3JGNf#-jT zt!}tb-o>rg1dDNDU<6HIdAI}EKcvE_u?l?epIC+TEi}ejgfD)LnCVj}+f1GRzZ%CY zjFp&mG%o!H4nXoVtn_WaMGPD;Z)|FN?sss&#QIlgvWynrLn7R*)j_E7kevt;G>J`6 z@&h(Gy&HpY@h$`%681^rlFxz+nI0qZG zah8Lvf5R;e1YMzpll!pDZv#TB%|`+IvCyy;EIfcV?`hs@&<>9U?p07>?6mSf4g5`h z1%8Fpy6_DyEE#5QpLB+97??KwvBJ2=vR4CtbY`OiZvsz75S?KubPO6Rn6kPR@}C5} zv{!{O+{!;5cxyW-Xf@GF;PyH7jWukNm2J$-sKF_~Mg_KzYP{-2Z1xY?eO1a8?)*$kl2#U#f40X|9EV+vFXG{NoNDsoL^zg zvK)E`c=rVr#yZQPGmb+AiYn3r)l}elh#9+=ya4P&FPUzo-wj;fq7QzM-MVm2b9jV) zd$Wb_0p5xGv$lOV@Xagm9E2s|IT$dWdln<36=cr>58qNI?^o$2Y}+#1cw=f&dSIId z+_k)ivDO-AUT=v97QPJkNEg_&RkksuOAljm3o~j@1D^SEsgZ5f_y*u5U3$tQKo_t< z+dKC#ezxqbTB8C>3XRWa;2|B@Tb__@d|d5`YHiot6jyc^d;P^PYVXyAS;^R$xA8@jN zQ95XENn{&~`WD&aM7^;K7q$%TZq#6lsy)0j2?c&E!aLO_{vNpIGQ@~g;DaY2{a?DK zr`O=g*~SHrbWQj3*MXB`yBq6qS5EV_?*)aX6{W|K2H>3++7-kDOMQByUw+ip*lo30 z+dk;Gle-&B@raiur~-B4pa|3C5jY$H0b$X*f|SDpqB|5%c)!OjcND`d7ZC#wM$Wg9E*?q+PU zdP$$*2*Tmrj6%!d2S#CJ8`I6W*;1fGH69H_`ZKHwRs#|DS3Q)wnHe55+5i zXD;eyV9pQ)cGaQ=8TM=IFto1jW+W~9zsEqqce)u{tr}M1Ln~8W>|yk>=7zT~L$9ju zj-O66`SK@#KUQk2&`;rO2`|HiA*Cg9W~cEpz`aUJ(%tGe;C+2d(u>fGE=TyDULx=8 zNqXStT9+E5Ek*tXJh4*=eo)jbuAx#AqE-#w0G@?`#15+4C&PgsON=rca_IuU0$y2F zf){>GTrveQg!K0Oe(N<*@Ve4;n|}s86WDIz__at6h3b1*K{4k#J-e0QC(lg6y}(_! zml)Hn8eBUS0}+N&yMU*GGZ!e|0QbsRpbV>rwGrSEq)uvQhq+iye=w=6LxTS0iqO=zOO zmC3ukTCvB0S8i^^{{X&kbA6dnXcaK&W=ywlm8A!k6~I&8EK5&LKL8K^pv)+;(qD56 zMmpde3%>w-#`}%w_W%!kqbwb?#kXRv`MAuOXgOF5Tvm?@_GI!1E-d}1%$RNweg^!} ze~RTzQVFu#5Hz1)WWy~{ji&%Aw(qo5a1*n?rPz8 zf$Kj)jqMt>xE)anY-czVc*)z189L3zUU-c8q>Of8IPhNJ7FNG5o`cDzu3R4e)%J7l zL`)ouD7T{iap1*YbWiV`_TGv4zZWiywLDs)kl>**BZ=FSnqV8SZ(gG!$KQvseo0Sb zRcq6JA@Is~dm59iAblKoCTjSR#rFm9kWb6fd%?i{SOYFEGoq-W=D$Ek`<*Xoa!F zvi}S`0JzA)Js(9(on4U*x+%c9V;Z-1_0QwNePOKeEW-VdqkvP2jL{ZB!Bd!wva!Ok z#)W#|b!TJtv+Ns}Ax3f=XT!vD#8B%ZV~NH0IB@&6MRH1_C2#mE9BAaPH(q=W{kT_= zG1&@|+~+ZL_Q7mu5!Ancv41;a!s_R1R)XO5vh*6RNjiO76(rd_TUctC98*_zJ0Q3JR8{pxh(sVcLvJpY_V5uBLXo5As*FRJ$-%Zds z`#rSr0;IPTI2(BJ{8D3xd%Zy++UfU*SS_ zeIwz<&6sY_Elv01R_~)91KT^7LBK0+EluAcxdXUtR;e-Fa_9r#pZ{2D46ty)2WY|> zrSjaRDDr<8Sr?W{P|N)P*oUa${>ED@JAu~&mstd(KSvOu0DC?^@t=_Vic-1BsR`%) z00q7+F> zvhb(CzOI;#EquvO7#X{lruXyz0iIV>YJ6iAaKq1N!je*>#!5e?Wm97wn$+&rSGI0y zjKdx4GJF1iJh!QF&r^6R$s(x1JMyESY{b8B*VNegg!yc%uJQH2HNZDp3atR%i_NJ$ zw*Lp%Kd2Gs9pBXW<~Z||L+7sq_T!ztafm;O(uKINZfUtO%<}jjz;pUm7*Jm9cjq-V zav~U7Eu759JNp=#p{&?{@;5cIG24A9!{IURSUhKC7&a1*UJk`gBrB?0jKbr{=b#BJ`xVuA@a%E(oqEYX z22b*?!Sl6NlRN|554UJAJ7fRf%=jLUcHWG~_Xb$`ubqT*pnBZd+-pgieFeTMu)f@w zZsA*iCvQNISh)3-I2Qpv!x{xJVmtH&9t_It1M`?HOdE8PPlwRxhFw5b@WMbZ0yW> z$q{~q<8En>Oqw|Qq)Dl6>sV!7Dj7^htLkErWF(;`z2Hyf#zWy$q&k&M)2M!u~bbo7>&e^UapYZd}&@Xw=Nlt#!{7` zSWP??4c64D89(JsP^*Xd-p@@WszX)b+GMz@rlu}f8Jv4+UeDY}u(mE0t4+k~f|1%p ztV(Si>g$|a6RfTaRmbAVSY2IZG8|RS&-Hc5O(d((>WOewRiq}EsH#)Fa5WVRCsL7U zth%Nu3eS^~qjp)%Jr}1ko^gO*NpNZ0BN{9eLDJv^Blg=+V0`OVbyRe2rN*7JNV`qx#}Mx)hs9Fu2x*gQ-X&5vh$t63LomRYZ>=wdEnTXM(>xHxf%lYb!&c znn+EwCK?K=Hk14n7h$AHR@VlTden_2YAVy+&yzOjQ6shckG|tO9IlSkGwM{&+{5ds z3Qx=LB4W&);>%SlhUewfS5}X$?RxsKuA#)(SgbNsRT)hsqKQbfHq|)Rg_D&S6DuR} z2J4xoUHe#neJNB zqdZB|o!m2J(uhpH=1*g<9)HbMmE9*@RaY}6VO%*eH0s*R{xrTko~o`1Rz~BIR9$7F zGL?|#4eH4(d2(G9Cak(>BwU>eRR*imkrhuSsuNW~OaygRaZGA;soG?9G@PuBhcLkf zt1+aiGq2B!j0vG>6OmxFt}0m>3nx?m14Fuc-i0O9t_yv=+Ev9dbH*xz(QtJf^J&eg zF(^AG^W~&@)b1vFv9n3R(-6hs-`L&i^d|MWL-^NL^@@f zD;lp%pts={xMG->VyRR-To($)^_)=~idV<=GDWxR#4Bp6FCRbgl5w?HmOCFSMflxrVG(EDh% zLQyvcRk_^XUOiaiAC#L2V#81siAGYP1lIUcFO;1VJnqa>c7&vo(Z=?qDNWJ zBqQj1H1!MxT`AOAW&VDu)hvH=HENc>ohmN(7dD9{Rhu6R^3^5h`+aKk-Tqv)tEc~X z^;L!cZ1qmLzeU5{W&Vy?s_86$_lC>M{eQ|*`@bmcUs6|FjU`mDIuuRTM5-~KxtBUO z=#S)v>SC!-s1kEzO{ywbnNpLM79Ov51^rWU!{J12xGIFHC0bn@PKIPnmKzDhlfk-3 z2xOHuh9~`p)t8baH~VwnGB`0ykM zN$u;)|KAzR#`yn1fbr)7JtF_VyAU&*(1Acbe3E}yeK1m88>y^|*5H0bqApo?wCY-e zmILoms%yqpd#9?YXU_0Gye3MYe!XebtphC)I3 z7fq?ne?<77JitF%{npQ4ky{(bq*E1);%;RU%l)7_sXqowtfqnhbv3mZW21F(b8cMS z-{1B3N4dGNJaDe&J%xkYL~EgB9cJqkZZTr|JyqpCPsLrspB!kQy8-N;GnwC_y+>7_NeD^QKw<~7*r>H8f-*oN_E`L8~v z9Zofp!FUMEi%1F?qu8t|O{Myt>+jh1NUL6`cUO0u>tF4db@U(nUUCK~HugdG823_Mnrk#UXHUHK>S?&JDf1LX28vn+2F?}B>7RG-@JiX&*<_2cz+5B!uuqZ%svlhI;6}ydM6b)gxU~6a=k# z(;dXLt{XP%b<4azxa=FZVYWM zu%g_dIn4a|R!?$BpmYuM?U~@n=2p}H>bpuEyvNtN;mVu*Et)v0)PJ_GOy$1fJ5?RH z2RD1$-Rke>m`)m`{#O4f&7B)$JL1-=i-SsP59|dYYeVdmVDs$4-#4ha{u&weJeGIve3!i1Z`Eo6g2=Vps}{KA9g2NoL%~A-Kbo|QVF8*< z;ItK8HWI?UP8=NS*-+i|u>Vg^)`m8Z_{aUut&dCWw@@n{^FKn9G*<_o@;6hrJ?`)3 z9HCvl$?NVL!HsBugDIhePOv^RED@ugwu690Kw zj!y45CeTBj{G|Wb_R$1RQiFPBgM-OXGOmAvPVMNO*Ii9}(tphHAsn#65RGB%!x|=- ziiJXk+H(#%+uA4n&0OrEf#_}KBEgxU%dfs31=if>*qtST72}QxLSOm17ew7tG-}a+ zb~z2h){zxeB18Q$|FMqNJ;w!#?0)8!yTD!qxFzsoX=N(mlwv}0pqsjBxxc@o1DluN zrcBn;{<<-cS?BkwU_20LIPZ1;Zs%G(6; z8~u|Vlc0Z9xEYG_-TR$%Of~X7e~x2rsYky*`|}%?z2^@(cWu44RNXfF|Jp8$+o17O zFcJ-ild)7V9u7zJ(AGtb_|V@*`QP`S>6oN{4-D`N--nb=1ln3)Zz|mq_~Z6e((P{vH7+94yyiRf2)S?KJb5=<2dQdlAy&lDCx8$5bGdno$YG1G|X-I zc$@!p*X1Y%SbMMPv^3T$t+>4%c1WNHK=u7+E{hiJe?G}QHQ1v?_uZ0R;ly_1?ULSu;JU?{?oBecA1s~*hsm~o3dQ*u9p3Tz;Ifu%Rutu zPc8$Aw)(MGbEP-uw%xPx^3;^wz8>m{pIsK}dQ)I8V;uZ2-7JWbZN>C|`zu^`EZqxI zwgwJ64w+m}{*V8ICheSdb)ggUN2$R->Mfbuw$XOXAv;{h#5XJEq7XPfHF2;1SoP*_{?+Xrk{GITCRUWM z?8Cy=(VR6s534=1!5kCl`~^Yx6b(@84o9Kxy)@A4-hP3Ojw@;y|KM!c6sT~N9ewTu zH7hI7MxB-w*yD2$PES%vHEFM}gPwnmQMotxk5Q`+;zr`FO#;0gNf*7I-%0(_B=CZx zRR)<~e;4TQeutnSYK`R%{#g4(G7d?kHE$aDkNYaRAZ)GXo%*xPSFaosI8MztCUA#a zmrw8fohZ;}i`4Bo0YtO&fKjC0bF(%U-~QOZ%Wec15+bAy<;P;V+wZu*aM%0=VY{C@ zc!<43g=M&VfV2fzE35WCT<57J(ZblL*1bEnEofaiW=H-uix6 zYAnjmYpyo63A9i<`{(slyIThG9TUrLrhlt|^Nj;N+Z80O0nKeXFGyN_*e!wT)jB{{ z15;ZEj&<}+)(WpMYvYvQQg)HOKz6lr-_x5(m;AUvWrcxT0tAW`q9ldY)16YxKQC~- zDs1Z#39ZNAQAD(Lwpw&SAX{D0HZavu%B*&Q7aa}#6Zt*WFYR3Dr~jj%iyFBnzm*!= z-X+Pk?E@D(GVlEY2SgHv$Gn`^Qsw#r%~i?qf&8{d)>8GIRhU$_A0H@kWSVxZPnepj zoyP}Gb5An5BNosVQ}ddsJ39nAIi`EHLtwn4pn^iY->dySO$;v06xs_FZN-m;7OS*W{#@4CYs#5a{pXSW$Web>eS% zV&HYh^^7X+ig~0-*TCJ!JKb57dy_rXrmg|p5_GupXxjbO4F=Z~-2?Wj+cgQ+oaR*M zltN+SnqF`_ZYm{#eUsH`*Qpbzk=-$exLA9rMa=4t*nQ0{zdvGkHkTAZ$D(ojC*1Ht zk3dIk=8|DNvxs}LIB*T&unC7fF}1k@dv<$A?vS9NOL1UwR=Wg_h7zez4A1r@k~q{& z#6qf1NuXoH+LFLun;ahkX(EXSZSZ(x3a{Jfr>qQ>H6_2hTG}&!+sY1hDH@NB1&+yg z@=Ol|sibDZ$*%cJ?QM5ta8r| z2A*%)4u_TTpnkRzH(jFPXaZ^}`}W)jN9#jztnZw%!O+9*@h_?=~^Gcpd3=CZCoPYDB`90Kzfq`S3&6-}d8l=~n4&0ju1&X-h{q}Kk@A2V7)nXHl%ksu6BD9>ySS*7{O$XE^he?tl7iCZm9lOK{RUs!$^Tg zA|eSqXoSP-IBwA4WJgAVPD27YY@`?syYon4Yu;Wh84~Ey-mwVy(8E6Dbx5EJhXyL# zbK19C9CAwadZ>*<(WY+Z?ke}(z%h6l;PASu9eWCs4OQm`MrX0A@B0Inrq3{LpANgT zbTYBOKP=FX6+iGix9rlFW}O#!B)ctMFpT249}HcXIdC$PNGKeS4pVb43an}$jK-pv zR`4b9!Dcs1hj!a&29)q&zH$26kY`L%&j z?UH!>0(A)|6G_wzH_KBog?lD>>W*6qn>XyL4a9Li<&b95xMAVoYk2J3Ps ztC`(eZ8#;6>=%!9@ldQyFL5Ss2woDX$!d#d&0=AUnRrY#te-tg1l9Wcq58&4vHEl~ z=3XW(d3esSepN-@ylbU~yprG5XHJt2;erPQbh<*H+IU%@i(}pU&oE!&Yo#_!%sW<{ zG%ir;m~O@ve`j^yxWEOD)*Ypti>=w(K|e#ivKxVU`S<`1nlV=4bp_m33}f!V$_O)o zWnVE~R;6xsd%SaEP!panytrY^gn%EbE{76S`jA4sba`NPyC}}UBUm_vamtj6gd&*q z)T^rk#d)Tb4s}qKqy1+#beI%)$fbm3lLGS^>aGmLvKRx_bpqZl;+Lzd?C#S+UUKd#D99O#3hK<(;u502*ym@h9nYyJuFsMx|foFj6 zT4w@}vtWqBLUhtg=>M&!2aaodge|OOSRFGxaHsQt_sSyw)#`>n2Ua6^cx5+DHfj;EMzzEg%#=vq%?it@>T~5MS?4%uGFIFr5;?fY3n*{NWJ+zNXb`r#) z|9WOu2X4Y5*(nHwoJHS0|8?4*BI zo&!}!&2drn)$_P+VkhASJJVINlYyAU8#(#bq3>_j=(OUP1M3O}G&;UwUmxj#_MRv=<0 zJyqLPtNUF_m)t}+v6GO4J?J=BO0k_Da4ELSvs5uDmBgCZnP%${Y~>HS6#fjXEZD?O zf=%p9GhKS0dG4jNU=eZ>YhowEo3^XL^W6(CW-I@!g*@2APJ&I_)yM@drAuxi+?`+0 zs6ck-Sd&sGEM%n;#l$NTY+@(D)@3ggpSH-QbZuq920IG}$xbAb!e>9k3MT`bu#;dD zJCROGU+^$1od{R?C=WKVvtVo6xkNqvh|6>*xruUOCnKBKiFVqq)+~0ZyW}RyiJb%; z?9Q>SZ#}7vkGd2qH>QYWu(N2B>_jsueEVapaH5#7lV}q=(M(F;^*Ae?MBAkPwCc}1 ziC`qkX}dbG#HDb_O@tFW2{y44>7?{lPqNa9aKcW44R)7cn}}fR^ps1nJ78s!iJi=& zVke?$yDDGGN+*&DJBzl7G#;ezKFe6)B-mcP71EH~Mq($?rtNC*a+lI2HxW+kB-+GI zq?6J|KJ8vQ8$*Pg1e@52bZwqNN1L$1rEqO!F(-BsbFe#yx)eL@8JA**E~3FArIJ_^ zJL#ZO`0T&B6fU`mVxgCKu!)@no3^V3&$^T@xk<3W&cZ>mlUS3&mp{h}C&CFk2{y44 z=_+5)llb#4rE4n-wpZVyRY!K`Sd&sWzQ9T)iiuYw*u+jWlhU_0u+oWQ4}HsnP3$Dt zU@uWWu5?+nNp2EsVkaY;*ok)9t`5BDQg_KsloLCNHn9`!LI+Xz)-Su%T_4ENXw!Bw zv`K!Vowln^t6b_XxruUOCs7BxbFfRX<*Qk-L^2%Su+c@I?J&)>UG-VxQn=(Miiw>> zo7jnFQu^RmSm`X<%Dt=3lzR=$J#wvE;jmKSw4DT78*OLO>Cz{>%1UR#X?7B9DBU^O zv|DQ0Yphr%*+@haS+%v%b~3hUyPEyFTj@GClT6!Lw2kEPpbKB{1}mHdn^cVqZDJ?V z?YSDIFaMiM>DtPK6FZ4Eu@mW}^fhm~m(IozAt%8mb|Re=zVR*h!s#71{Tu{~IoO>; zT^^v=zRsmsp(TomodlcMNe`9McfHL@Cz1&}i8is5Xv5UH7mBCX?6(<+Ew8lo=MomG`GJ*=R%KHUc90%>=kt*Hd6<cU*X zA~pVf>HvwlE?f9mCw4NwYP*{DflKpCZla#pN$|n$9P?7_>@BQVqL~y+#yYVR(Io2T z|D9>h9wgJ*>4Riu0-~EZulg z_>oKVOKzf`*h$pE?i_Ve?DmgYu_WrGSQ2$&C!&ewKYYS8w?81^I@ZO##=1DsO&r+& zDRsar>f&Be7bgme11+~v2Z(^1KjTp+b`o{kt~zaZX@1E~)Dt_2InkR{7I(tFVE9&fbx!vMc4cb8+AhMYbctxH4K_gcOMtngXAW_%l zD;{-XCkkr2n(z;oc9+~F>cmc>PV7WJDSg_PtaK7}!cL+NcIT+mPr9nxzjD!BTj_4X zOhBT}Oh9xK2j>5iIzVJI`AO8735ay!z_PEY10?E%-+o2bDXPr`B<{q4)!#4&LLLI9 zKOO1rfQN=^!?)A{4*?78uVK48z%|74ao@SbKJ=kCP{htd&^7jp)voVZv0OEJpHAH3 zvf+08PF6aXtf;_#uh~^}`?Y4b1ghmO*6Q}>oZPY(M96@r!@9u!kfIxd3j9bN;QE1| zjCrO5L___Cfhyna(gNDb?%Ro-gq_$)zm?Ma>|v#o=o5A_?7{9F^iu5Lf3aeTWTL74 zg(<2q>k`{tqjih$rkM>|l2eJ1KU-e_63aGHLY$Ih`;Qc!k}vy{y#}L^YG&E9??P zISISfzfcFf!Y<(zb_ov+)rMc018jdG3b6f!nZQFswe2_RfQNtuNfLXe10EWxANElP zh=BT~FLqi1yL0U8jOxICm)I9tBAeJrUr~^bl{i+}fI@q0qPG?kuf7i+R z1xKMJvWcApo!E(PQu@ejRyxs4*h$cdororyk8jE}XNMKirtGl7OhDul2c|Zo4iNQB zey^xwhZW+$?Z;3Dh=BSXQxw3WyO-HlVVBK ziJgchny)^NY0eHSq|w=1?`8s`n>etcId#A*>eyk0=>Sns9N5-^IzR-}uO_po6FZ4I zZCATmx-`G!ChCcuL>=tTQ76S7XvK;pnn|%F>cmb&gXVa}E!U-VZKb;jZRhhVJ=B)c zJGEh@^N6FjP{ezpos?eQmX%JF({Hr1a1%QTH*Hsa+PRc2xk}92nn$IzVJI`MsuAc1j@*OzlV=AW_#J zpF&_!Cw3Bb+OB5%T-sf76ZOPSqE75YJ}G@c9xI(hov@RrgWWmm|=uO!iwdp(J5Bk;l4m<|vP_4jGi;BGE0psj3y zCw3BcusesH6g#pzE0(Ax#gg$(>_j#xeL@dbI+08?Wv3Ko0NG9SE}0N!STH2|L)G!%m8A6=uaU$@KC!{j+}#&yb4fDX*{# zL|CiaziQ-k=4sltfT!+~F0rqz?4=5^lgJZ0*9~X!DONhy zjJ{MMrE}3R$)ChDXXg~4=Py;53B00i{>jt!gPQuSfrNqq7D!N^(PA1%@o+3 zqfTd3YkIr1yU-HZ#7?44>_j&yePbV1I?+tn$zUgTBARX#wXHAHoSjoho3e8XGXarL z9QdIhb%3a6@_UVS?4=5EV1Iw=01;4s+mc0{*vWLO?W)x&F3m5wiF#ru!3Vo@%uBJI z2C!mD)Jd@<>cmb&6U}>`$~0#$RY;?=mnzHzL^pAu_i5Atuc%`$RhSMC1;v3ur&9-* zfcPXTi#q+uRJJzOb~W-0m*$t;Og+s`q7M0;qfUyQa3(93X{L)MQ73LQ(ezk1^(>}2 zJFbv6We+`>37Br$f!oif4tPZ!d+5n@fGMaQm_Lv@Km^oZ(q&O6b~4tn{MS4d=LMuB~)8VJ0BE2{QrFO&r)ZggQWE zGx^C3YbGGli32|jr4Ep&6MlAFVJ0APCl2gCmpQ;*sxbLUuIy58Pu|o)B&QO=>VB( z%>+b4{b78yW|T_{Xe$dlv6HY9JDG2#^o^rg=_LAuokSn(&OtB5Zm(p;63IkUc3fd5 z@Cv&hs#vSD;|i1CE9}^Dg=SFutEmHCVaJXuOb?lc_(28Ls@A0i^v^A@uoF88JF%0n z({|OVj+IWrPS{D~M@VFOh5w9Oh6(}92kEYb%2DP$xmX>Oh7ag2d0jr z4sZeKwifixu@3_tzZ>ro``XHmE5uGBPwZSb9Li5%rE|^b%@iq}i-t-5a;7;ut^hqh zt}qjLMcwL&)B&y@Kdvwx;0j`6KZ!a(1k^uq!)~U)?i_VGquPFjOS=m#kxlF*>cmcT zlhSux$x0`h2|HQZiJge18%6D(%rs}m71E~cxWY_8_jxte9*N_ zb9P)Ijn0lM%mhR?abU!C)B&%kW5*Sy14Kb_VEpye0VW`RQHw>L{>3e}Hr94EZK_N2 zOKzr~W+zdH{LWD)#m=6_ie;MVVoB7A+e|b)*3GYHnzQ2yX;XGwVJ2X@X$O`~rw({U z9XqZt9bgJ-2UgFZ4iEwL53#YR6FV8}v|VldvrF?!Zla#pNz{p*$S0+5zk!ubq!V@$ ze6Tymy!iuhGhH;-R=S%o6Oi46@UOm+@)Oleej=Oj&-x4HC%T#ZL^v}6i8^s$(M`;O z5D7Zr4|xfA`OTEyOTdtqfPHSE{9XdG4?u}NEpKJ~Ve)Yg(TD9UgnujNC*9WM_YyGd zCE)JcXa&6l40}YNdSw>lXWxR73bJDh5peeHl;2B0_AMykA2FNqlNGY*zlVUT><-HB z(SHk~UJ=N48B)Q1bC?5BF9D+-5vW?>;*5|Eu>2>-IXnEx@40kD9b zU>R!grwi{ZX0`|#S5wLtN<@XYhZ8wB} zKj-%t01M(=z!J4Vxh$PfdI{TXh@Hn@3A?W+`FZy(VLu{{{2|9*lGVg&#r>>WT(uJR zi>F}69_s8v(uNkg@4e4l%J~xevhbA{&|$&qt6y3xqfhfM_sWB&Sws=gA5Tc z#pAA69pwC8045OshEX!4T?6#jD_X8i0iDdA^Z58?0h2<7(@FytYi`hoM4Y1j1MLqN4^ zG4-GHU*Tt44>N&R1a5kiIlz9^!sPc7aN%Q=-%CLDp(yQun(#Q~_Y#n8J%qpa62>1P z1EA=`o|qE;7Ee%qkN#T_@e(lN6@i6MQU|;QWLpoZ;E$A_ool5-4kbO)_99Z!Rb-+tNy6w;vtY6Fc+4pHh zK)UVF{DWVm{9XdGAJY?k0?IAe ze2)NB?{R)F{UToaE%+PrpPhDy|8&=(<7@nzl;30gE18+#e&F{AJ9YU6#?Ri@kP0Te)-8QDQhu*>OTt4y)$%>c z?=k8XBs>IETRFeSs8>L@9%$bJcH*HGR=YQ`3ev5I@OugP%4W*%B_R8Dt@uCteai18 zAl-UseMWr1_}OuX1TfutX#TP-l;3OJlJXLeZauUE{r*lJAOdDB^f>X*2~_L>+V0-F3pK;d8ZA@!dOfF{3(fa>~>7(YAi5Pr7xFcWwQIOk*PfR})5 z>mdS;`h@a(2^jJcu>4cT&z`grec0AR{NK;{$pC2bdkCo3Z>9c|8N}rG5|C{@q=KJs zV-B#bhd98t9>V|hcFON1AlrKg|Fq92zn6gQSNDW}(C04vcYeXw&0;4j7;RU99WF~u z$xS-1*ok;zC&4FnGWv;~hzGm#?OvU6?mt{=1x4viX0a2^v|YVN*@BM|XDq?OHRpmwxQLL+V$N z#rWC7RpJ0U?-2e2oZm}7_DYBFZ)igO_nLL-!&Q0!oA*1$&kj38AGY%_6Y!~{SgpvW z4tNR3b{-;NeN)QsB_R97Z{Z)@jPbL>4$+70JcK`R4CVJ2|LE%-!oQRAdvss=dWTs- zk1jm-SXMu_@eq2p@sRqx$N9bVV{dl||AOPF|6cmBw>yM?d~+B6%11rUI?M!Q1)~$F zUM(m;>AogE5ztIPdayV!q$PEL2x#(?9xVKwTQPq2n3eFejfe2>;{09$vbQ^ge|2l> zKUu+;{(A_hX5~_T(tWeqcBUH-v6J`{JK6V&o#+R<^U_~uR1@2FcK&U4p(V13ov0@4 zecLg1BAPS`+jvN$w`|WEg`IDh{6sb3-^%$t`Ye5;!*qb?Cl2gBo>tIHK=ww5@W0Z5 z@v~>E#DBK&5dPU6DZiJ1?2QiLAK|0?9)lizqeJ-1@)&=N^jgt}Z9L2bUJ=+YpE}?r zAbXiyD%iS!@_Pvw^N2vTo$|9Y57CG1JjDNHe&#Uuz z0-Ye%1@>aliy1~_G*VXFujyIzy)+(^MkiU4JmU8Y;Daa zTMe=ExGPbedop&eT1h?^twimj>}0(nzH`Zn)v9u)I6LP6Jq{AMc1Xa*D^{B-r~_O* z@N@Z!)xsd<=lX%)OTY;s#?Q_{M;9f$ZoJVE(A`Y(OT z%5=b^3#*Aq>VTJk?8OeLVBZwuXOCEk|7^!0{H;!+{9XdG7dwQ18|U{J0O^Yz!oT!n z>c2<-r7w1ffNaMh4y^6P9AG;Rli#BYt2=sAelG#piyh+s$Ucsz>=6EaoZqAW7O+RGOb0x=u*&UED@X*K)ZgV+FAOE>^ZqUiGi_zdKCzRIE9_7I zp0N|vgq=j4uunUMv6D$d*okD%Jc-ktfdgC=*VY1dwqYh9%RVy!5lVctqgb!L)u}`q8(@^$7PKyyaQF9P}Z`!qlA!Sw0yp%=TX z`=wfIFJ{%^s?iVk?U;x=aW#;H#*D&L^k0cF@o|F)l7a8b;4gZlJb*2Yw{EQ z%mk#{iUa*dF$dV@L-^@Ahi;(OZqE*z*}Vj0Z*++N+d03Nfb5M9;a^tC^kLtxk_xiT zhwxutMfu6n&*b+Kko{tZI54N0I^ZQB`^667A63Kn*+W)RLALo2{_DwLR0NZ>>1wS9d9AFPwnfx9RsGc56`Mm^WZ+D3Q(=MU> zUIMb+hwu-&l=0Ie4?PF5-G}h|FQfb(GYEaVLmG(fKE#3GIO>3xfb`TuPXPxhKYPeZ z{Aarl@qgoZ=0E#(uF3BafolE)%I`G=v)4P|K#3ZExyuSkTiL=-?0f}77k-kTcVD{j zLw=WYeqF60lUTL5YTgUKPFJu-p~oD$SF-H}s)d*NIX_p8|6+&muey@@?=fr8S2{F5 z{lyM(VAEvg0DGrH_~}W97I5KJl;2B0_D+ZRKjBZ5-%CLDPKWUKzS@QV)m!z>g1nV# zCLqsO=>)396v|K5Ehaw^&`dxk4soFH8tMQM(BvmQSonXW{OtKE;b&V9;a_tt^PfFm zW%7FnsBXWG@{?J^J8F8PowU0ol2S@Za%g z#?PL%k_xh|hwzWQf%1C{fCcRR4&m=Plk$5Efb{(i;onF3*{O%@_R&}`i%2?3CP~>5CNCp#QbNc9^yaSdIA?07y?ggn!^Il;2|pq3?H? z735u*K41?5y7_?JdGW6^s^D!di+`cz!qGj4upgxCTsHdkW?|nr%iVV@ti4u#Z0`Yn zyv~0+Yjt+cp|ckxxq5u>Ar7pVO&#F+f#0Lws`@(^KYPSVD#-R8;{V_|l;302D@b_= zr~-FVeveU){%nW%zmxNmPTS@gkN3&V1Z3r>6U@EarG92^qMw<7=%*8?_c%Y%&*Uco zDEtfVq5ga6$F?5AKmK0E&yGCAf421y{$6t_KUue!{9XdGS3AUkA&NTSB_P{+2!H4M z7(aX7N-D^<9>Twi^Lq)%ezimRSKm+lC*z;#KNqk>-Tr{f41?@+(iJf>NB6U4Lj}7*$ddNL-<=Rp!^PiItX7rC^%&=TRqPNGiO?|6u@6WN5FM4hmYeAtCu zG-XE|W&$Fbw0hYiEUMTMhsjUWGZPT`#DRW`sRKkmlb;AE{H-5l{Osu};b$*)2>*7@ z&&Ryt0`_8u@GpCe`tLR6vTx@K|Mibke$r`0AGYf-6L>}7oF&Www(BtYJt9zzdV=zM z3CLdT5CO}dr2Jk2vR#Mp@2C9ixI^?|FLnt3`lp!x?6||^_Y#o(Vuv{J`BLft5is>B7Q4Z8_y91E9%I1Qh;3Pg8y}0Gj+B0xJIs#?OvBgr99Y z%miKn2A`o0cnQdUu|otr$oahlWWU%U{2Twu{AW*Ei9T%GA^h{7rTk<7H2FOQRO6nb z{A3C?`Mm^WuX#uXr$5geU{6|!1MI{@_|JKP@_Px$PCSIaQv>Dq5|F*-A^blOe!6Z( zZn|yLcC~t?%Mw#^^Ug~*ZIYh{AKkP`elDK#s$Z(L=q2}R;pr!`+dy_CAnO*LKuvg= zH9C8`%H;QmI@Nm><@cC1=(`=_e~Z$kgbRC_k5f3lL64=Cjtup zzW=YVa}Tb%xZ-#~L{y?70SS4r(He472={$&EFjkUHh?X)Y7wHgMJ*UWrL{$fwzbpB zBenwzwrChTwbLp=9Vb)eq5jcv1QA=?X)PG4ZM76I+LyIrx_dU4fB5}AhZ$z>WOqOJ z?Dx0l_uF%K&u^IzkKVus0Ye3FVKJa$H+7Ig58+ejA^d*kYXVY|hw!)VLHjiUDak|l zcfTCNfBqHz!Bom&2II?Z``(xtlC%crm2wbI%3<(HIXph39K>_w(Gx%4&?fiAbjwMK zvt=m<(R{fbL^_BjbP!GGdtW8nK{BC(WJ2HkYoaU8iWwaa@0KuFJNLT&-^2{((456{ zd{!@ESG|UOme287zl5FjTjXm3Qq18Mu=T$qK5eTK0V(DX{$b{W#|FM8AZ2uT!iL{t z|1|w*wL|*%3i4@JmGqB74&gua2eO|MIs#wO&n|u)`P$=_5<0~GX@4X>Ep>?f6mo{`_TYx08+>y9h`Uo`I>-qUWf3HBA+%`i9Qr^2!F>LWIt`N3VcOCySg9w%KZ;F zSOo(V7q&eI$p8vDgij%d2-x{2G%{L-=d|ihNB#I-ac(mU13{_&POd&-z7A`h7!NaVTbLD_EATrG`~&vHeJA(cJ4{ z;kRaIUcx^9ce*IFyy2VU>vM&_;xO_RpT*bb1_M~XgzY|p2516OLWgv4!BOJV)+(`| z5;}z6`Y!S{0V$zF_{W&9-1IP^L->0J$bMSt5Pc}}2o>0G6ZYVHXn-al9oQiq?0p~k znt+thA^es9AU-X1h&~j02*3TG$k!gb6nY51?qA4P{1+2CLI)KWw#k2!0Tg-&pF$7m z;2`rg0qMXF;qUzq+OG*n2X+X5^9RJIr4G@DLJ#3D`Y-Yo|Ha&nV1VMnw(CPQKogL1 zJEViN|3`e11F6^v*)+F-$N_^A%I6UN&Jkoky}~N+6#?y< zlaUY8mcUm8wDU$1pEgzrpCXS?K^uWfPC)~-5l9DjcmwSDqmZu&NC$Ta|BO?KPYWKR z4@DlrKfrvLwgkQ+pndE#v|sUGOzH>*Xe02s)5!peJcLh?hX}ZCH1ah8F_qj8u=(Z4 z*94@4JH-AeXAqxOJVYOgJcR!d^A-QagFAu&+6b(uzz%8x(!m|l!G7T5?^Uif?v3>2 zws%a-1VCD|dbl@I=qoFU&JPd#(Mss;RYX@Dm($7p?1n-P_x%amF_x}8?XL38G2{^b z)N#mX`5a#vdiG=HYXVZpA@;v~7THfr9ik5p|fNOd$=}6ao3tp>epnyXRpnya86VFDzCLm>U2>&SaH32D;L-;$+A^T~aL-e75L-?yd zfqcb%afekfKpTNQ=b{0cfOKMqbg;9D__V`H?5BW3_%kLUUlTB=j6hr7jC|z=h*=$C z|9<8xH$cql5CJLR5CaAh)Ir)}75IvP`0lDe&@`mP4(Y<$PhuA|4Jolh_}5P+J}q@f z2Pv^b_>-p~UvXhf><9)ZUTkN!q5&Y_me!bwpDS>S{8M8lPrj5Ueo_v;EA)P(gK9#D zQ781RNwOUtyg~=ba$tAy<@wjZgu^69c-_XaJ}e_#mI~7i5qR`UO4-_<{>o zTeER|SBj||W26GjoIU>-^XaZ9d=k*}_vFxi@>t=MfKovd@L-+{pnX*$AfDV0O`?QO)Tl@8GdV-K%S-Fe6-|Ml0G4hswhXd^KBDKtP6kk0E6 z0SA#!d#uEMj6J-7d#928^wQkGS4N=SJRSLT1N0Y&UYaZVESiCQ#eXroLpq4DhZnHx zd@_LcSOvZ&;Ov>m*94^O4iT{70_1A~V(j7dIf8sz=@5M=yF={X{%NwGRyqP-6Oghy z#DIMlq5+zKwAdm1hd)Dn+G8ah#Mr}MpxZ7&zH$S^qXNbL=@%nkdjwN@hvT={@=Ic- zn7)+G>yUDu!Qgov(w^NH-<^BUr7^R9>DIud)GbzxU)$#|`p(PfqR=9TGtR9duxtst z=5pk-YL2grIy>(Q}=XH#c3b3=vSFn%GjV9#H7 z74d14l?aHThv(1#Eb=u0DWyX$(3H<1pB}qjAAD)9xBnyNlmB`?h8|Ku8-W#{rw-C4 zE4e@zdiW0ZGhY*s&g+m1wDoGVUlR~R4{!h7Um!lNd3gOX^zi&EuR*@zznI=37YIWS zZ$QVjXn-alE_-6FF(+tL!^9>Mpxp?bpSiYEbe%H`;&8Kd$YCQ4t7k$!H*PMS-syw6v#J-5af5SoL4p#r$D@H@YX zd=N13VFU_)#vz5)QW-!5iML;`w8S!bwL--VVgbIoa+nKkc0h)l6 z-XQ{>c?a?}0V%yh_-`PeRy;%>iadn>_?=`wz0WG}6#?yv<;YiVfSBG94B!!n`|BM5 zV-HszJ@@wwZO7MR=Kg}^CkKWcLZ5mU(OEV;r%mV|1KrK5;cXDExvQW(clUgQt~xDq z1U{?h4A6$%!Ed4gte@j6ertPI5TEu}Ne3zR@D=RJyOFQl_3+FN;kU0uzV_Uu7v~DU zZWZ#`Y2DOc8-WyihylqiGJsM$d~;0g5dI+ZH32ELL->2|LHjiUDfSTl=6i`xOCF*R zrFIB^(YKJV_%Eh*1OpTowq4&w13N_U1KacU3Z*%B3^8R5FuE7u@GUGHsuGt#(;; z>!L-=7q_+*Gud<@oi1i`nL;*SEEMdkYt6Nl5r3b)&Mb@i`v-3tV+ZbcHZ9p$S8j)Q zoBF6~d)}@#_L_}#NqcX%86Q>Sv2Jrm)Zce)s%x}!A24r472eQMcUj*Le_*zZtUR%+ zcF!jFAnn{_M#UA@3=Q&BbmLT1yE7j&Pe++j@u0c$(JOysMvP4r+LGCPCexNlrShpl zu8>a`?DNa3n{0pUgmSyC$BeZ{MPrusn9k^u3m!3(YKKOB z1h`zM#2w$gkomOsXrrCn>H*bM4TLF|NYY zX!FGSLywsD_~O1Nequg6IlA1dQ(6Xy_-6a+trLoU`Cpi6!^b(7N*D9FbT*mJ7c$9w zzAcw2v%3arn(9jW$JVe%9yh1N6DHZITdBOsF4<~E#kX&&FKzOSH?nkyVMGnP_gCgT zdr7akI%?$i_L_N7f3M$W7DoMj!!~ovm|UT)kjoa6g<>k}Zjyzpt$4!R6?tQtGSA&3 zy6!jQ{q5}(`}z~6HnN^`C8<|!XFh4BM1AwBC(XjhrY$?&z0`e$G#z2v-mj^!7d;j8 zJvSVyEA;*RDN{YH@`PTbtt&0|jegopKPjS*OP?``nv$<2PiSqW{P@i$rhMoDn~HAV zY_IsGIW79To9){8vf~+4ap2NwTugbQrZmc<4NFJcl&}Y$F{f6a(ATs)PYd>jo9e6W zS(6du3A zF^x;_Y>c(IGy-DU+xx%(x1$bWuO zKCiEAY#QGE()#lnn@*m*dt6zgy{dOyRprHHWo5(N|I)uXyVrl;)!5cvUDhEr*1y0rdS*662wAcTNeCeij4_4~9^nzf@R;y0VpK#x#K;@uFd`r-!t$5} z6*V%D;uJ9`AS!xM9)pTFC>v1`qavb*8W9zh!}!4CJe04xdv<3dk?($gz@)pntE;N3 ztE;=Kd(WI&>SEOVW>ykp=os!WE;-oj9|1DQZU$fFD5urHLMeq@0rAaiwC))yK2*Ni3ZM3PW=^n$pQN39-?l%vp zgU#y8+Gh=FBTN+reUlW!zFqluX`h%JA|!p;8euW>%y@6QhnQWwNj=H+#lbFuDc7*C zPc0kA(rVcaKDk=(DRn|t##I8ux4{;L+@%?NJwA^|gp;?cd3}r}w5(65zuG5jh+{EQ zM$2g%v7CVAJW~ULU~NMDMrbB2ljLJW#Zp3(7@@{P_2;NrN2%nrG+#(2Vd~%tPmAzN642oaBlEZ@)KDp3?@QZx1KMHPK<8qA7|28zNz&D9sJ7lrrC?ybis2yfrgbmQ+nLy8Af1eEbx=El~Ki}tJL z&^9wf;YD+M8!Y<|b7Xu`g8j@bO^@xzvT3}m{q(lA@tr;5nw6&A)-T$7%p+~nQ`W3> z^(9{L1*NdQylloN6p31#IXIy#Tt|4p+?eoMioI!~N@UYZP?E8zW3f)1z!@{(^V7l= z_|Z0OtMfhVp~_aCm`OiXiJhCZ7r?qg7e_xAn{|nPQ8;AoPh29}Z=2=*5wy-af2yaq zxy!$hCVC}xrr0Z!{3-UNiE%{rQ5wkNC_DkntWKKc(am#74~p8QW_9vQVxXg0-u_pWMOb8>o8_|}}^R5oXF(&;C;a}oWNcV?-XJXOn6cITo@~B9n}wI2YO4=qnjH+4(XVegnveVp&&Os(ejjnE4{A@#9n7clJBfid z=7Ic7F>sUFlwa1#R!uZu*s%htEq1Jc9g7Ny_U@a2eL3dAV^2tl=FH1f)4nWyV2=lx z?kakih{B{ zy?SY9Qr+$AdSPN~Io?M|b<8lL_=q5NlXC`4oU>2l)kw8z7Ziy2X(||)skJo?ui%?2 zoi*qD65|^+N$9q0lQ1z>W~EITi;e8kIn$1FDw`&e_&8&12_-Z?OI=d~g}Ym4n7g~Q zZcWykq)z14F>u;E(xprkR+t%unX&p4JlFmS0{dEZfQtr`I6vdpzH?%nSM;^Ngxh~f zH}5ME5$G;t`;b+2%UaF1$AZ#}b_+h}V&EV5d2*>*f*m`?tjl zHZ)K<21e4qxsA{tvT$xOgJd=RVyFI{(&>|b#Of5QT|~?J5T!{`viibx+bW7$lUUE% zq{VH}$}jF?PAg8&l&Y~eW3byK+RMC$g{@gMpTy%Nva#CSQar1`-iG22D}WNF1ckbl z+I62nEs*R?R7?L$=ZRD{XS{wU=>s}>y*`kCW6G%(fcA%+Xb$MrZ#b#WdK~}NlIn>G z*in=lqCd;H3X<(i`fLufCo+yuDNO@A(lD@`hguuOA$g;@zgLYY+-Fwy?jvf;x2@~_ zhex!p+_tXoSdW+N;1~__T*;+vja@Wl2KAR&?sDDi+pi-Us_Xj=5^cq-?Kg0^mP+;C zM^HKM2%Re?Lcm8t=O)g`Ayi3X^r-%7I(H7I&ab%<#xcUv$ypiQJz1IA9;iNhQ8LuM z5$E+Y=E&>3adI(l+%PAWUXPRItEEZk6MR%UDAq2Gw2|GvNEG^-qx)Zt)^^+0{(oqq zowIFgAl4(2uG@AkZtcN3Z!B3#q2)_!VnppV^LVhQxNfDHw!G9+W?sL%uSeeo_`j$< z0ZpH@E;d`;bB!2y*sQ$gePp@Yz2`2|`)1`nFQW1GK;1=jz+U#HM4E~jwV@JDt*&uu z^=&ua_W_%^y5HYN42&_W?*C1+hnX`U7$^pGv+jXaNYJ1MFK$bUc*Rh6UePe`dT`<* z@>o{p^EkV|Cs<$6*`L&Ab;fk=7vc1VtUOHT{}@g`o>hS93{Q+x{t2uvW@Wbxr#E7K zF)Q~f(SdKm`eIi8-f(&|)~BpVSsBkuRw{4wNkk%9J17CVQT#Q2<>15H=2x#u6hkx3 zxXtNa^pNUN6BXI)wz+>)>aNXMv`FpdqD5u<(TTw!w>Ty%lYXhgh0PwOiWPh#s{mQ# zf7fT_zlReJWfPsA4{58R5M|r>dtX*I!ZJ6YwpBZMWGijnl;w%Vh{LDKuhXxo%KLnB z0LcmnS>{zw_KVfuWN@YaO>^y&nPTWIbN7=)*y}$$ncBMkovebr0)xx-2Oz$q;_pqK zk81aAx815REpN5l?x<~3w{%36%i6Z$DH&(WU^)3&m=rTw^MEDkHH z_Hxf_IimiJHR)E*)$d>q>?##s_GB!d(_gga^pC+oho#~M#k`awhJLj6Pm38bP82?; zIINOT%+3-~YYV@4q_JY46;y~)0WBU7rB8B1`)L@LE0v1INm!RF{pyjyyhK`_5c-Ys zX$Fno>DRa1AdsIY6(RV>Jn3>u!PYz}kLbT<$p&=nDqY@Ejb4{ZGicF`mr6Zb+p~)) zMxrZOTe1nn7fM&RRHr(r|ndTE0jjHRDMn&$9l9->hH;bw5~0pwH9=h z{)j0u%6$agk-}DVYJ7@KUWtV`c^H?w`Pvqij}`(I^gd`9Ecp}2n5^6lICeckF|{0o ztb{{7q;MPq>d3Ul{j+Uefy)YI}cg>9-5P zPxg_%y8yhVL^>#jN}-`dN}_YIN11>D4!2>Vce&HbL={)1UtUPLx(FLMioau3V6I6);OlM#^tP;{- z>4g;Ra@yUDUt#C})ZJ$WOE3Lj+BvFApZs6SHn&W)n) z=;hK9(I|(?a>*|mm&5#W>5mKHuf5{J?b{=yuP;#FYPeErjmxdS7MOaKbc!hk+8!>j zWB-$4^tzf4MD-dey&$y2>QP8%1A~5XHVB%emiiq6G{(}w)!~1_x!@Yk%wO59l_RC} zg!9{i-6N&-l*hj^2FtFMg2SD`&UmzIqm_c$SC+3mM)R|>JwjGz>@>;?Ilnz?9fD=GbDlaS>VxTefAeDS@W-#YETxAJ3z*BcYsWUj2on{&(FUJlE*Xm0)~#4%EZ7B zs2(pBiFS9`H(nYp2Krm^H%c*{>2nyKpfTGd)s9T;?-@bV-5`1nhm-5s>Wj(D{bL8X*=A?4X$DHV8h>)(~q@)r55o*@0v5}&mbIiC#^kx$_VNS=gzYDb}b z67ng018XNq*DY#+O<{ctWJa+mtZM-t#isCZ3-C%;48mFphgzy;Fl(}ujm(*o(K+%E zczudgd_FG|A#SSl0=jmuPL&p6ss7WXZs(V}5tdEk9B-e79BU83*=f>^!tXe(k`{WXjnCL1 zvAH&LgM>C+irDyUOn1g~c&=@{RZ8++>?m;8n%S5NlRXJCW=naZAwc(m62Tg#)$Dgn}N(zTLHoeh0Gh2EN$wjB_l~x@T9jz`wEC=RDS(k*HEHX(z zbda>9Op~qTxj1MklDc_P=D-l{S`F|(12a4e+*VIFN66s|U3g>=PPW?Jj?);G5&9i` zOJ;+JGI9NpOiX9H{)km_C(dg#umTE?Rp^XD%#RXkE~fKbq55!n%qg^eE(H+^yE2v; zg?6F~k5D)X*4@qJzW;76_mg*Xxfd>U0nx+oZ=>K# zTY!IW?F&k?x#p~7bXnt8NKapA_(0*kQpW*dP2&AzQ%w_wx_pQGG1QaEjl;`axKRSt z_oAkfeyFK2z~EY`3y;WcDr11dwHDx$;Fo*3Tr=+D^bfvI!i{q}6dZ;Qt#ro5%m=vS zs~?d1Mi}5@i#H&+4Yb67_J<317!XN6D10!=9!!Ob=;UOp>Opj6C^_+~c}g<^-w9HxWHjQ(-ovrYbr)*{U|BQPPFH$N06l!bR%V-6m6O zX02N*4f1pfj{@GCb*#6qbjdSHY95v{C(zDZ90Lrj4ROJL>P!wF=EB3=8C;qEy8a|s z_At)5NZu~zdlK8FMmPQuK6pny5+3~6|BOtwC(Q?|JNT`&kDNcadHGf@T@kwZ;O1~| z3-IYMZGH2>y=y%VZlM>Q%X-7!$E5b6U4#>w*8^YG;(1A+BOT=hVjztUa6Gb$v2biB zdA#9qd!ptE?8b2FTgZq`es5_{NDs$Q>zutobc`+TKSo*ST(r)4QPx>{66Hn(*Xt=J zFl*dX(k#y+#E|cp>jE^-*&aDE2WD)Las4TW=RoXP!d(olPYV*5#)fGvn{Y~6fR{$W z-TJMF+x0N=8L2ot$&$ga`Wa~gokq_*BW3oX(`dMT`{EYxPjd0wm$-0aP|dS+Sm-c+ zEAOCZpqY0iEsAgk(pxe01E9*KAAMC;@Ggu#0 z!8-Jk^qNcuPrfsF3YaV7x_=os6f#{;#j^KGS4*+3^?|Wzld$;$v7IL$C3;I#z9w?!UzYvw>i9<3y<_Rw~~KdpN|C&?{XWQ zep`AVEL182cI(!~)LC&N}J`v?|GVdE)= zvt&mZNYn_9<_hR_kZaI_gNRnY2Wk&W{wVLuvJXlR{@L5&EF5vkiin6CWDY;v0(?5G zeXqGeKJlLP9NiCI`@Ymiw10*}@8c{SI1Abb=zVGbhSeY7E@t2xs6Ir^@^P>aNh8F- z=MeuPE&op_{}Aa9d<4}WN@M-@dp>54V!vP`b>I&x$-y=ScU)3`iL!YIEA0K&>1tLIQZO! zhxM6U1!o(%a%f+KbrP3RY%cl0EpLp11qc_(bx`|7lr@cWjtHD6Ln#z6L$T+J#l&6Zsr2c7l;D~>Bj zy0MR@MrM*Mz*#jLMIGKv%s|m+x}t~eUvf#DL44uGBbV%xZu3#|Ov!QSo9MpI{|1+B z%fAl=JW77Kpl!ma%=in|$L z)1<>4YIWm}To&0sIa)nHb=V0tBexRa6PRorxVG1YN7$XhMiFCId%XpCMHD=$ezI+XX@*LHNj9>W1erJ?! zuB+cVz*23IZ) zu7W5RHV@PJ(bMi;87i1rS<-?4`QYI2WiC7{Kynou9DlAKLr??yKA0S9J>~^QHOMwAe>sUN-tqsSS!6Gov$kR0HIx$A7!m@0zp3}GEu-G zUauw=(V(r#jwQpX%U%^r@}lN;*ci*G0ksvD!=07(1wgu++T+iWcT7XZ7 zvlnslot+h{yfqn5qeWnA8-n|mUE!BD1S9x5LRvf-D+-su{CIMsXD%FxC-q{$54CMc zkQUEPz~aJhP?bP%&L^-nffR{kAv7i+KjeO@i9RKCKeY29oIC^-KH^UaJ-}l*eq~<_ ziG7fz)v{^`_(?jnEreiOk;y0KJ(39aVB&{@L1YdgjpjZ3 z;MKt-3HA&kRU-K(#eT0yj=}E1NFc!@ES-Kog`+yn|D5KhSWC)Cek)3T-BsjDPxa2L z3GOIiGXENygay}-pBB|Wla-0ei$bza(>_FnWubLA+Ijj}9$JT^ou{AUp>;UgdHNrb z(azI#Sf7T@#n9+LE^s}GhSxdepD+HE_F>r;4BQud@UM|%SZ3LW+l-K~bTbJza?mGN z2vY;HlTLgWMqf*MieKUK?OKvq+T#NnFP!wcmtJo`zbRfY*X$4`rtegFBRL<^dlL?P zgoV*#6XSQra@bcNLesS*Wzm}Vd~%ahX6bMa+wm^1vvin670n?3#pR*X&Y+>ZjQ*}q zt_tHG;^ZCj$&F6l>$+1n+pW8FFfW($@hyVQdAi039j12=oCXK-0;GZ7G2nTF2JpN! zm=|eKbIKv{;c~B+@;u{xI68_P!$3o@uOsQP#u7Ffm9j)QaUBW|^D{>7=FiQmR%<&!}jLx#KM+rzjqynJ8`FTZ6>H2xH5!15xw57Nexd9g;? z(#@eX48cuhj$-`ukp2~uz8yThFMp0T0EH7{(no?Sp z#bERDUo#k`j*x+z%Ftkw*m(TN@O=_hw>@3bIuc>^Oyl&qVugty6c3fRl9a1M53-;O zg&< zrx-Xuzj-iwE*UCnA=o{a9858Or)Q_d*XB?zW+AnBA%KciUk4lKQN@44+CPs>@rc5D zt8hN~LlRMK3hzeVj6&q0`My5u5ag}-zJ6Djb2qBldFpc|Y`GgJaFWN>DwNOFDs&k% z-A#(lFF(TSzL3G}GuG zl}R)>vkI*Vj#kv>vIr;ch_lw2WIVwr2kY!w@`J~_h7H*u*#N&hjM#)*Amb5|qg2zO zX5VF%KSGXS*NuR}M@e3uh9R8~;l6A<4*psUzNdwR;h2X^Md#T=VcDakK-8{wDD0+|z=&o&%LHk<`g^ zS>PT6+x*0k(l3WNUz~>#(bX8gynK07zC#Jhf;V+}6l^v$Qc7mBi!2<>kD_@~b0Gd@ zlIocQ`S`h{>bz}GF3?2u;-j`fLsd}qGD+$^kKT}ROzYyJF{U|aaPy(iL8Dz3fy;;{Z8u5jtRM0j81PPz{R-CYe6x~K z9=e_5(C@Uy?IuYct4Zyx&Bqn9$d%jr>V!~yJ#`7df+g+pENPF z_ZfFtg?mU}vHjiWotHRhVVO;8#4=)~?Io*X#L3I7x_#sniJiQfdKSK*UISa+LRHk) z*1S#pqMiuJZ{vh-{2k9pklqC_`fai&h5Q}K=0*>VU-r}1c{sE&>OgP zV}E1p&3>9^%KC1odWV$8=Db-<`Bd~&*!2#sYC>vctHM5qJ$65981d*gHQWSL4zk8Acu+`Y|bpwI7VsY4-_wd-i=${t2C= zPD9lv#Gfv#K#7&3g-%1)IMJaj7^$-n>%`hi7^j5%0db#`OpyOc+WCX2P{oWF5B{JE zA(Ku}_)qK#qa)6WY1E0pu1|9+XW-nIhVyqCb|KGGaI>uHpX4XMHUsycaTF}}f%r&k>M^7^5O-mUZFG$OOmRSo;8=?|VgoT@ zifM1HMHk4vA?&=Oq7I?<^-Pbg%zFRUfiC%Km7 zI$Dw!r6u{OB?YJ@8J={;2-T8?ljO6!z_ra-(5RMZBb%|n@`P)wBmbf-Xy>eUKT{Tj zZ>{;iAPeb#X2FTTbXb6<)5Je2OtJ>iB)ja{d_6$x5LER4kp*kqucUykvaOZ>CItjH zRylK_OxSmp%n;GZEc~7BN?vMB`Wp@3 zB;D6+p`UJR4#~qs-0#Wo$el&f1%`U$^c2#|q*qkfoFaTd8L=qAL3Hc_9@(El9kmGj zvnY5Es6)6&3SqxT?kSSqJ4HFhqqm}pY~nu$kyo=*_p3M(Gc-}=kFR(94hJ9dY zjGP{e3kOPyVzh>;7}@m1gCxmAJguNyl2a4g@QT{=Q5E}I3nY0qo_-}mlPu$9k`#zj z=riOhy->JD6`bfL-zk=jfl0lw4?}aIy0?rQ`txvf zCqX=O1i0_SHM0s1V7U}yDvy6>tc|9uaR^C}iUncFT@B9SkOL|BbhG3)Es=f7w_E#(gyg({G0cgo*e)iQib`CPx$#A-*qd z|8~gjD;GqIsIsp-P}HA=jeX_JK4gc>pTM0VikIluJ9utj&XmCTi(~ZiRd;$#3GMD7 zR$7T%KqYOJYqH4ptSSb`1vDdoUk?>^-9Wi@92K=aLPj6x4#>U|dr6-U@fDPo>9bl>DG0W|ki~)vOM>_--BhWEAYKKjHiS zHXrsUQ#BGL*Ao?TUa6~cCTYSDdzBjBT@0BcAG*YL`#SKA+mJB?Dz1_<3&JZrcU?q} z6@Btz0*w@3pjV_0L4B;nIwCrr`>v9IMU#_d?Y>4%VOJB6jFKM~sglnbgQ|<)+A;D7 zD)^=`@&k%!Otk_x$>U>E^f8PeMr?o|9C9UEV4ayH>z*tp*EJTj`I;Nuv)4bxF$ zyrZL)AWh{uJ#;F{i0puwQ{}uxq;sSXxbiG_k^f1*S>rYv-|P-fP)~P7W#1jCCmTb2 zbdAFC@smwPOK2|6I&sXs%G(f!6J={3&VsGcjgP~b6W=3XtL3|`+-W!hXcw)Vfn9`Q zO-Ex z>Gvqz12Zqm5Q^E(p1z))a~YilvlaQC=aFi<$aMaG49iQ--|MWQ0r?Hd^LL0hILcf@ zzL`9N&#?R(PD*NT>per>6BpjK2|WdCSE0XyQ_AsGZ1`EKDKCob>L9#&H6NZ~_?gx6 zlhN=kH5`7jhS!e=86UGjgj?70jE1%HwPLI4|Iq!QyK!S)#2{ojQQ;YPLHQ$S_k=rO z{v&chUj1&UW45GUr1OcPKs7U|*R#CIs1PJn0}YShXff`^RS>^}g88^8eHo`jiQ^Es z0`c;%So9kVy~^xSEyX8zquNN|ZD{-z4?^28WS-~j*6=))=h;`$x;~h^PHry-->?Gf zZIG`PjW+?$qq=P##O`RcD869m8<_tDiV2l$-4p1O z1%80|jdHrEzYT>OQLfszP&=V@Z!RqDD`=e1y1kS5vSwoIe*ACYb4cEVy{LTx)e~D^ z<%sqW?A|1g7wv%zL(|qarbZttlfi?g)k6K>_HdR?(d5`dk$wC4~nZ5 z6IT@#msSeduga@Lp$F`GRlYMtyUe^V6?Jm2)V!R1DU{o^lXGCJO~+9d9I??A)>2{Q zUhFF^8J6uu0tCOcWv@I|614_Ps+U`fqV^AHw;xv|_A^kvADIelg1Y_k6j6B0N`6zG z<>@1=pl_t$NgMC^uRK(-;xJrY5`g%D|0nI zD;7v@R<4q^mqSUA_KuwDNrqnU z$eD}mu~`}0k<>|^tZZzu>GPi)<@~orbtM@34-0AH%9a?VSTa;HOHvw@7t8Z(9`{G< z69Z!bnUeQ)%Z1KS+<4?AS_&<+93O3Jd`C`6hyw8Z7>GM4<6%dfgSfkk#Axdv<~ypq zF?`43pp4;37jc-zw+c9{HO~{exH$A*VeLV=^Q_Q+o${Buu+VQ#d3P=*_}&F$#?Fl@ z_Xp1l@Hv^a75d%5*Ey=(SqEPZG@fjg4HfUo>%~AnFfKPI2EcU#I{f6d^sHv__x~@3O)XPM31Jm?tN5r zL9|Z1k5f~oc7iIFqnKXyy4NO2{4$OlcPv92*mwwsyZt2`ID})>{tVJSl!q@8KB4X7 zTWJ49g~VQUl%6Z|k*o|<^rp}M!*QH{8s{tzF!YaU!mm+;;t3#A(3e@>WU4Wt=JOSW zCk5=8QI*1~w+k9~NF~tgFiKDeS-TG7s27FD;lvRXrTs9B`&dp{B>bI?rKZOY;qH{j zN0#9j2w*%m8;8Kfv5d0zKJMxvd>^;m9KOa87Y>d&SmwqCM@$$a$XK~EiYhP9)9#4M zy9j)&pfEowv$dsuLYG2;s+~t=dag6x%J@{qSw$$dazCewQTsB;Z^T)Jnz%+fFLi|E zFVMOMQlRn+%nu|(;0rmWkL_o6s;Q$hqu{j7={g(L9PXbm5&t(TuQeR{0_INp<)HyA(v1JDxshho=Re3riB{$Qj#RYB zgIti9u5|SiJt;<|!Ax)94!xsKJqE+LbR{qLv`#Cb#LA#Lol-sowx=sa*u7@clZh;f zO0K^$s{6{>t6hDZSGzcIBV6KeXs|qeNaWS7X2kUz0hJw<_2R=TYciB$u^Mh*^QY_J zWQNkytEFe8p&Qlk4cd3R;%=u&l3AM$=U# ziXV>kRaQC)8qjBD^iz6z(uK?M1zFJ-OJ5oDqBi4mkn~N|rZd#z9cIlbRb)b!JPQUP zY7Orm4MG;_l4!7USQL)IiNToGK7(vsp_`O2QdjWdjKff?Q&C`CmX4$d4WO3MatB~= znR3`~@9~kn)Q9Yf%77A~jRjtT!Xe6x6jIQQ>=5W1zEcGvEPc}}L?p9)h|(qTdJMBj zi+Rh7p!P24%n+s9MdQ&kO^TH6HB{+)(F82*i)00cDn0$eredlDUVREW!L1{(0~Ds! zau}I`sJsza@-T!29^tUi-%w(aM-5@pFlCVER%^>J`wbeh`T~b5ry%Pdj%@8eLa+4fdUamTPvOX3O)zwf(z^|-6uOynq%q z$ZiGudPKg)X{>%;%{WTiSq?7y)Y8T&L!_?%#Eli~ z-EfdMnp!TXBfOcz?2E@bAG5R?`~-GYDy4LuI8({z2RijCWk(_7CZ#BrBr`!O`lr@7 zOryhxyE+q;w?z9lYurR-1nwrFdo>v|gg34EQ*V;z)CSL#Kr8l)M@LQz`*%VwZq zu$SP*tD-A59m&E%EB9t40ZrBoP%=}2$W`#~tfMm(JnRo#0fn=0G}xCz`78w&>t)uK zSxRd(Z9S}Ax3G3pSTLI!oESJXTX{hg&R8pMQx2jl`ZkQ7ryLXQ-B5Bn9auYI-R+dZ zr>$x8l@x4qEiAhOCq;XWwe=3=eveYej0?sW-lgDXXkdhuu~1op<$A)#MaZLuH!K!W z4lcFI1Js@iA~Y?=p^3IEe+f3J{Rn55;Mf*US`|x`Zl3n9_+kW=OFopwqI+2{5F6Gl z!-h!~>|3VvO?-w4mtYYL4RQW{)@o-ceO6^J6B*W$>cvUZl{uxLg5iy)yz9(Z6LfF z;Ubv^Tk*SyOk>Aok+Sx^ZX2Og`ck&j#yxJn(ZkKRmq+Dyck{KNn;%MY^KEuXiSrO@ zZ(i;;u+*(!^o**onC5flLU>3|U(gH_B?O{iDNt=8W1$q-%D&04-%<+38og*^7^SMQ zMwgQTxP74bavV)qJ4ZIU6E0cjxu}ew4Hhg22KlxG3P)?!6IFDp{ zR6os*uI@vbN3n8ybRDpFDgHiWx{uKFqewshEvi1koX14D9^LH1jADp?5k+Bi!<+0% zO1e?pye((x%Jc!tOnMQO9ydH{UsRGjN8sejRyo$EFDf~BG)AD;1Fdr4l9!cEDf$C= zfGGgu(B^m8Co`>m04BYxT-r9yk#ieI&hfb0raVU7#h~O16Oq z^qlbGD8kFFj8~KwJfgDGI6ufymflgV@Fym(k z6esy`q*MGlIR2Kh$aBb=^tLie8cu1J!Zh>EfgY^i@ZsEwaDV>p_DP5focEQ;@;S{@ zKx$CBcn(|L8S!*Y11?gXg?2g0!%p8=d^jT{6c3H> zD|mL824~(^x-!WT{jTPdv*4lJ;p*@XJ~@BQzIes%PPX(=<&U8917#tdgmaKPMPCIc zK2R{u>jW%2#J%a0$j!rtm07vK2P_ZU$J=a=!sug4=T5rG=?P&tGrl3u@$rzG z9W;o-fX9w0Nn+>{*mX?F@^pox$CSK;$(v{`H0{r@+RMo{Nd8j6!$Aj|u>mT+RB&tO zMTgs0po*p^@8D^D7gRHNxb=6ex-XU4s3+SY`zz{7;0p?0DFZv#zv-~Eo{>(FZDLeg z_{E3OP5Q-Wngm+K<$l2-6DGq?E4OvE7aHdUinGXB`f2ka##|DPS%+w#qXu-#Q5Ko z&3Jey!LI+JPLxU3k^kZh;lWLbv&z8qP<>2}M_!sU0Jr#9|7W{Ih2DgU-*KSeEwE|7 zqYH&NcK?n7MI6U5jlNbt=ygu{BSnviLhy?#kkI}$73zor)GdbF{#O+4*G%dqv3!k1 zop3>f_U$-;zZKIb-1~ZOrc1mW8_15p&bdw6TxU^>(EAb~TU0xXx(CWd6}KEv4@ET< z*a8CSRw_!}-)h%zHaO(`;t`v@9m)|WQ- zDY%;djuE|TaZWDk7wL+tI+efuX*>@zV~`~BB2>qy_||e7Wd)BbvKULtjcnKzqjtHZ zFKd>e4eX9IOU^6a8R8`sU8Of5AHR|D5_%mfBo)U?cszul3e$Z;Z$v_>G}_aF8V(%qc{L(@f^m$-K^G@d2^q007Mj=p3>Ul-$3>2_xM-G7zCh#bK>QzwX_kKs(5xe{GfDf-v6oGHd0rAFpC8 z#HUaZuRcz{Yul>$J3DPL^r5D$ng9)LRhe~9TaFIFxUBgG?6#b>BW=}%DWPvr>>Pa_ zqNlGrhsmf)P;smNE9*pp`kf~|^e+8j6BZ-F)JAyPc@+DLIDIC69o(j%sNvd5O0xzYHTgs(t*Y_s|Vo z&gq~RXqcF3e7FZTc2qNCb6#aED!~EJ&{6H_553CE#XLjn@Um-Og|rN{f7gM{H(x3R zYYp9&ClcS5FOyiaYQ4?+L#^KnD>KxdrN(P4Ezf(MHKhgz(o3;Er4Y}?HDWFwf=vJD zG?n9&t=}6iThj>*@TS*`chViHvi7_QIRv?#)V_=QcOxOZA>nkfAPeU5v_vN zA9JeJx-AQ_ra{Z%HWE_61!??=L)^t?!Xg_up2O^muI1w_tzKRB1l>wUHd-}jW5*Mb z3fO6=k^^|TfY`j8vGLF4pnIlT)KzCYa_&Bt<`A-JQ=~lAEJ_HKi&_SdseTk|EO9z> zAk5Fg`71QjT9>8nl-YK1o{GDm^R4PUb*v}WzBRJt`pcy%215J|^7GYGv|!q0>T{xf zjdkEMG)gohxlqNJii@q)h3Ym>`&n!e#YV0W@hs7!x&7l-cS17H0J=7_TocvzugxJ875&GBm zLiz(wU^KLfyZMh=g}v1eJROisx|GLRKc3mPA+9YXw?RfLX6Rmu&9rcZd0MIZwzraMD=so#gp&Sh z`y`5kkasubW17`MDQ?V>f1_?%s_g8x>yzE`j&>!d6nw5~D;oOUKEz?k_ zJne_yGC*w)_UJ-|ahmRS<#GkdnJNh^)(x1i2 z^@xlR!_Z*aK(#=W*TMFIYG-P_=@^qwvoCHoKMf}bqN<`X%^k#z>Ci#6o!zj)NpBgX z4)F|xra`K|z3~bk5nMX}b`#~J8R>m6d^Rn^>Fmt%tIo6oZ)4}&(-EeeD^!Fg+a9Q3BYq^k&`W!Q7|+*~b2l=(T*X!2b=KN)^_ochAi-OsS0G%t5|T%#K~X4%+7U0RI`))PZLYeuSL#j^b{ZX}%o-?CPWR8!QRp$}%q~U`WN5-LQ)E}_a8`Q_~;nAP);K;)oRE(eTpoq&=F;4sNhaOBKqnm;I zT1^z89m`x2-Y7n&hp?dRz?`@_+L&UT!6=Ti4$dEGK#TMDFBrh`oAdXtw={M9tvHKU z_%~Mg4+oI1vBDYW?{Bcezt?2M^}aYr&@T&jI{6OWMbYO)#n0^&gE7=1D^HB~VC#+Q z3!?FZRavPfcv3=tU2x@1I1EGof}=O7>%-;fNTL_JqY{4VU8h&I*u4`fVIuTBa5_dGY23e$^pubiX~OwfP##l;I|+<+L1 z%H{shS!kT3eue`G?8$1GgU1i)Q`DJsQMYo6y3nsX&)sNrl1$=)&}GP&N*8_#44sPR zMgI-9OvMqdpMw)q)fze!1Jl&J6#eXZ{x@xy3Uc4H@W|~1k4{&|IK#ISw4b5Q#aRxj zXW)3l;Ue9vc2(?u(-rsvD7jgkQo!FmU@LQ`hyvdzBNX%bflJVEv&wE6F;yU!!Wm4{ z`&G#^)rCF(jLW_(tb^!5J8}3-H+jU_Y1~@DIDG5COm)474PI1GMuZ(784YakI&M5C zuuT-KAJopml_Xxy**#0eb$)M%zXcb`bo4HEaB08N^4&ea~t7Ia1e!=UDr1Q9tpd|5+-+r;)-kxftwQRXi@q zXPY&g5Dw?k84ADLik3E1%5+7+>-pKU)iUbYl+n>EABQ=!nP&rQXRCQd#Uv$8DTHSmv{4yKI44%{#-iAFJ!TT>5eVaOblzhC!*c{rnT>mR| z)EOOe{b>y7pfejDLfUR12A0F{l%H7{RsMy3aVk0uXKqtVi%4B_TG6{?v~GHq)A}p> zBCXG{v>N;eOq-+j$#Z_@_6ZpmDls?tJf3q|o!jy|&YP(J9pT|5zAu691UX(aSH;Kn zaMNP|8cC0b>sTO*g@?-cpijwMTou$?&EmDGxPrl5uo7WZJp1QHi{}(H&BYZ>q^Yl= zWFGH^%6V#$oBuJabMozZDqh|SciTsB#>r2+UG3bQrQ!>)^bO3s9Zdt$v-S39dcK82 zw@1_SJ!H)1^bDSlrUlE-oF85OJ6Js*Cr->i&@8{n`enXak2{dZVfUR>cKF&7`+f!4 zcVQYUjJ_)x(KisdizC|AEdK;F-W5&IamZi5394AY37Wqk8qXI{yFg{{+;F}A0e*4H zC*RG>Yj;PNZ-Qxeqo8pUTc_h7^b>5nTP;lq{YGC-VqO-mWU?~R%R)Hn|8Y2bH%_H^ z{D?O#9;Wv(#w|k26;kj52AamG^nyhyyAZ7g)Os|TRzpDT$wF$>B{&IT#^@#L17ZSR z+oG6*p&a_f{nrBP%rbQZiY^O=2Gx0s3=QYNSVkVvufV^Z&9u-!{9EqUqX8FN8=Sc? zbTw`Pg*V&o!0jW)s|ekN+eBdxV=7K}&fms#ww1)pKe-mCxmaf^xeou9ee>{FnXP`y z)%Gc}ka|nwV~<0_dupO}>jsr1$-+|@s{H_r+l6*hc#=b&-K9R8B-(k_xCYgqyhy_$ zpRZw-LM~ehmCR<}Lai2iBPggFY*&TlYqOX&!;yN-Q>kq5>bje+@q@x} zc|1gP@K2B6=_u6(TUIzG|>;)ku@swq8<9+a@9IeYO9QO4xh=5=w+!|SpWEY_E@(F4wg>*5|z1i#G> zr#Ow7lzyi!+eYGb^O@;eMyxj_yKfN55eTQ>dC;&&kQ!{(&OK>i0 z<&^8~mLrqdscHm=Q0Bt);ZXQJZf{M2^6%A@KKjt+MQzP3N~Si43H@Cdl3R=QMg4Nv zjo(H3FiQ5)oW&Tz&cqc(4rj?>ncsJ$q98_3Ha>#R&KehIzT1Y;pNXo9;VY&2yu8t$ z=@`%F%h4o;kW8lqaPzr}6HJIjIFM8UtbUUMu!8gE`l7DG4%8 z0xEsh}lc4YiCJc7Dp20Pr+X@wu z<0kUDt)gJvt-ufJJkO%geN1-@w8sVbv$B+9gFL`~ceV%pCHvJ2IQBdXS+R^Ee` zW@9w`RBDiElTu5GvW6?>;7`OydqtValA$}ygxUFpTw2GF>o z5#?~Es9_@wRTPd!neN?i_&HZ7Xg6ySz9?*K>Ef6TLVohi+u(MX9>DYZzp?tv{X=`p z%b%fnPMc_N!+5lRH_MOUuur=*p#4on;?bfIrvZKj$9fzMVMT>Er6=LWlsDGoRz?Ge zjj>I5PTUVJ3=Lpyg_jz@-H3u3z-C3A-$>(%g%|&up*azSW*Ed@;=ii@|0Hnk4hOVNY042KJ$sJ8k;BZJ@L(h_)?)#qZk2jWM1lX_446T5p{ z6lmv~iNbmRo_9_WRF3pAlbXFD79Znb&L5i8ZfH_tozC14jSFf=qK;0(A8te)Gx}Rc zMtVg&z<(W%Uh7>Y3NJy`C@#`(@{Wj&%%pgbbe(rbtX|@UjIPi;+;ww)BTZij(rE7sG-Q0&XfM8NwgOg;@xG`u{7TKu0w^Er#UFT>3%l^k z-{KRC!wBiUVh16VT<>);R$lKNxJZ8pT~%g6i>Wa2L=|08+@Zl0BCm8B-CA^c-^0iK z7@UR(<2KP3qLW^Y^)bTu$8dTL*2f4Xydpp!2Idl`C#wu@61|4j!w`=9>A{Q-I*s#A z&ct(q@N-ubh&NGaRBu);o+0t{7T7Y*o1UUSMUmqstoz&*C+cZv9EV+~KZ9@y8|Tkm zaoARNtV{9WuiiV2*W&Lxdhr$H=lRx5I6yYM?8b6z**&j@In!#{X1aU@82yib zY?K{nb! z#jW0yMMzMD7`u^{aTrK*8PGnD%1?FkZN6#32t`5A*hFe0SbM@z)}GNyaF}by^8=sI zd@c-qudkSH2cbk9;*YpM1D~3rk_y9wkD_7tTZVM>Vcb>(e#nLEd!Yj1J&jXlL@)v~ zpr)!s1mH5Ry&F~cHCQ*Bnub%bYqmE%FX#~NJoi9%a^$kT4wGz8+hOLln%le>=F#5m zT>gL%m#4nhWmDTnn{(ux4&_*{r;+T|6PSJV;d=v)?AklBdzIGn8F*C4l`IJ#g}^B% zn9SiCi~sN$NnyAj8W6rHnBDNmG0o$>E@N;^KDG|cCh*+H;li1 z6i?eYtXCL@7ml5-f$4L+ZF?I2NJhZ^2QBOf219$oeW*RhkQf(-32YB_bFiNy3_io* zL&ESRXhit%pu>ps8|7Rf)9F?tC*0ml>lO3-M79M@Mna#0HrJbU2@Nbk zGwBJNz0YtL3wN+saWe{43IyiTzDr?EF?1TAY$8q3BLXCYHx*3=J{pX5MI#YT;Rnib<*19y%JJXfaQYkbkvNvGxw4mWyscY?#B*9WT-X{#$3bX7xWBByfj#BIj7~L% z*Y6K@a?nQ0`4r?ER3>N&&^B?hpP*GaIoNC^)-5$o#pEm&m*(unpW>t_V_5kt>lf*b{Fi@)4RbtN9k@tYTH!|Q7vR)*_ITb?HfQS}m_`avp}c&GgDQLt06 z8*%xAryLkxWpKT111AwSg-&ix3^J#e?dm(SXv<71%h%ZI!pVmJ2BK;@2G-s|TXX!pxhKtY2Cz zRuAz09m6X_(6AQ0Og&@`{<}9%q8>)oquy@B!wt~2=ShPZpgN{Be9Z9{J75GIDr+EW z9&(%kmM`pgDbas|_$R#S1vsB^JZuu8(!-4rK990|?e%7L#yvsDw2hCXpbHm7draHY zn0M|odWP+AGSodm?R1g@XAZv4h@NN|JY0VlZNq02yY=HYdi`S~_4!1D6PYt9`5l_s zBompa7%hPpC@$Vx`aafMEMIs&ijRE|*oYG$PQuh5U~v1{sCs;I=DabRapwSxBfOa6V&j7376^MTn=gA<<7c%p>j5`azDXI{HCKNXJz<)2IC{j3PW}swoQJ8>N>B# zz5WYT2vgq7zIgZeG>^UrTCdi5mwRH3=N&oxY*oDA{ao_ka|0IAM9x7u`~CsbEN_3W z;uKS@I?MYshTP-R4KI4?Kr=%sR-j1&re04Mi&vpoNVt*>~~6G$U{MGWH+zGSb7Ef3)pxmUcc@v=gsT>PsomILio z?~?RTDb)(*5;N%pTDcMom0FFjdcW~>z$ezC%V^*KKi1wq&Z?=4A3yiZoO@@^Irq%e z)Kt?nO*2huBvVaIGPtEXC1E5hDQ~4V^{L7{n)rTd4_PiWhgQ9xS|EQ!W>Wpzuuzl;9eh8v zJDvSb>ep&y5?6x*gcBXq;8!z4gBl^P5Y=Dk4114}N6%v92s7)+cnh;a-Sa#4OTuL# zN!W(G8Yhr(ComU?c6Cq%HmkJ#l>PzB!+z?FZ<+RuFc4W$R11YGmuM`{n5}pk5*O9+ z^wUL7KVmu(3+;sIXu$`mJ5${cC44S@QJU7ABHK~}5Qcf%Qrk8e=&%4)*@O6tt*pyw z{kGIsIL>MMhpCVAo>%tv)Gj`LJ!Q}iNZ3L=#2$LN;G{Z9HPsXwY}_zJd53f(LIWS8*e#JDR+4AvI0uGjt!{2vM688L8w zcp^oBzA`*fdZV!C6A}D6Ee4~7CyUlqX}8qy!wjNI&-u))_G?pwpH!ABjF)q-kmbTR z3X4mW3t6#ze;6m>*kDB;QS;AJo0K5|KWgk45jinnEr#rdII?KUDe@;d6F*PAK}{1~ ztxfevpY9yklRDh5hBi{aZ&KHBM8}D5*kiMV#vedWMIUv{Z&Sws;4GSQNCI@OX8;_i zsb_#}r}QT{3%E~P{*ro^uWa*sRKcv0>z(fQHz5%->2FB)p2i(3SQO!b=)sHiPl=aK zyAP*|0J+c+h(qXOXUY*MlPqmkjRs3gRv=9vSzxBK^l0jFAwY|drQ!@xHKqIt$qGF} z#lNPC$gbq$ELitaujBBAX|tWJ$5ZbXk9Q3FBlQ_>dCJMu4gB47k^#HYv6HEN)oABM zrTV#QwBy@{~y%*>bV zk~XEJ=Y`q;qghMY`1W?6{}Y>NT&%&7f1-(=uHin`cr(kJKpNIF zA{{JhSkG|lH5>FWLvJ14CRS4tz3}P?PW!`k@$`@| zvP;IX5-Iyg4x`8hZi~E)HoV=*ZKms(F+Zcu&GoxgWe2Tqj`14ZOiMF)JiqSj&eY$= zF?>9W&`K{;BM&(Bt@KX5KsryL{FqT|y>-{^LbycV$Pi}PC*d9O^ibaz3;kilv7%V> zk38liX6?eE3B7fzT|(nYaV--BGmommyYSkY-lE+uRt>VWcL$SXttSlOos^QT7h)!L zinDdY*W_d7O^tu*CxS;QcvP&sjs6~=ammern$o^?M&#&t4nq5d>f7ls01k;sNw!FC z1aSp^?WcHpXoqN#V6MMjN~R(`kP`N1D$moi25LveR)sQ<~gM$K?{u z1P5hV8K)%k4+?>mb={DFGc%#Ceoz%A&$aBm2R;lFkIs7I$u|DCv`6|AIN@?-WI8M zzjqGz)8B?Wtv5x>FgU|Fa=?oK3{D9wjVn0=o<)bt^w+cObI@riH99)4{iUh!mZXSI zLI+Y^fBo)(i0s3oK3*CkRvP}cFXpY%23Vvg%fG|ryuy=z+n2Jp#Dlq%Rt(VdEcY_8 zgDF}T9_(x%pl{Yx?L1m~u|86DLv-R|eW2?0r2&`d2xB;(mR^G2b{QSuuXX|d?m)xK zbv%Z7A#E+!duN3QaSMd_@%wR!Ey%r8hhO9XEx1(A>Y#nc1B-)OND(5uTkw7ni>v#G z!`~|RcW3LR`YX_xBLt5npzJs%*{|*A^cvnR5qaL;yUg25(aYF=-iKotEQ(ii(`)=| zM+z3Cgs-7yL-gKyxI+96XxGxPA$nov=FyFUe$hP$`W@pe9-_OxO4+lw$l4;(0-ws1 z*z2U`#fm^u8DHA)8&^zGRd|vZK{7vXE^GEpJW@TDNv|=(qa1gh7_m&brrnH}CG|_& zicEJJhIvW`OG;j!Q~-IB5*|x~uFxMZ6VG|8B}|;@E)ZYMy*Dl~K#rJGnXcWBh%ZI{ z9j+DcIiT$9E5|O4o;EWljFT?(G4JD6+l-T#sn34MB0ZH<7ijLH;ls~lF zDfb#Z?ERQQ6R*)P@_yV&(O8aKNoEDaDLji4JJ4MfdVAHLL*>`%U1(c{UJN^yQm%!C zXV2wCJi0WW_FSuX%X04)JdmnRK8o%!jyjLhuNI8*Yg2{BuTN&v;Jvtp!NIy!qjVf4 zI_b0=ts_b|@(GO}1IsM*4J{m_U#z3sxW!d=Egc-Ai@WUljb+0V&qj@vzju$-@$3;U z!yBh}fTg<8DZNgIlLuyT`FLJpE_N1-hmKGqMAg?r?L{J#GC>!|*-H7V-0n=Cp#K)| z;Z=j1VdL75Imd3+@9fc^f!fNw4^u%lq*AlRb z+`VE{nxDD1DqfA;ee}xwD_%zKW_jrk3-}D#cCoJZGM3V65SCT-NF1T^uuvM3?q#%R zs@@^9>YpU~I=UnwZv|yf(_5#;^a_QhVRETjjtji>4g+I7y-*BL*$!J2_vFbVVNpVU z!T^qye~7kB({tjILsXA?;=dO=>9^|72P)Uru#H$Jy4OhPUPnZRiu7n|Li+j|HW?+n za1AwdWdgk1k&}J2M8ZZi(S}9b7jd0hqd9#m^$NV+vYJ*z^!^aOgAuH295FeHN|bLz zLCM$klsi+;8p)1FOrDasuM_g061rIu_mxPOL_95F<#R|$VNEF!>18i9(yvIviS3QF zc&1!O=FZY5z%2aIS+GDyaEpJR)9Zd6!7bW8$9zCXa0~vZBmEO!x9}SxxMdA<(Yt?$ z39iyUuVDjNqEn#C;$!nr|3|bABxwFI;v5=C)yLE z*}JV=mOmss&@mn>XUAzk**y>IIh76cMWuH_biDsZSy!ZI93G3=I1N2GJp?yeFO~ue0}%9HNbnKq49%AIcKtz?@hE>mSiG z%luv=Lc;CNkvfeV5p6CAmQn!eijA^n3F%+Zpk;dNPA3x=-eR52#WZ(g!$Q6Uzu`&p zQ}r@EvnP&XK@bFgqe3mFC!j1LNCd_lXH!4=76*$Qlc2?>?T_+cS_kpb&4 zj#m+QJ+^#DMUU#41O4B5xTOk}<@RR8@kuo*)4yv>XCx_s&hMxi__AQyvQP_pBT8bv z6MaE;bjTA^knW=4^>M6E-Ct! zQOR^Eqq2q2I@!;#s~zr5j`C}0ZB*_DC6pCHBFSi)K*p~$`5C>n?*uKtr}EcW{IYC} z8HeN=_^1MAV~ItIni%S3Z+H}oncHK|w+Xx#Gj}|_0Y@}0c3OCoGqp_Uqu+(8AqhAh zBR~uP&*RFO_^d8YsW~gwz-ncu!`|ogoto$@z%A9_4w)7jl~CVK;c$?2R3yND=#{@F4$H#j z@txtXibSP%tby?YNn}L402+ga)UZU#3Wmq?7?~G1B=VFiInNtbJ8C!Z5dJV;RFO_J z$%hZ|ShL>Zf7fo#uLN{&vMW}Y z!Xi(3g7ds~zez=|o;g&5ir~JD_50(Ze1i($w#M=l84M`}^n@oTkH+c~gHet}XQ`{} zVhF8zQ^&41#?r1W`gN-BB%WT@TQu1i+aB>chsM975ALSDDLNw}Mp}ZEBu5&F^ic0u zg?{Z#I{1#BHQc|=%M;d<*TC(9aEVJ;N*@2kNc7-~1+In>Ctwv}IeD-NQw zl>453GrrEk_jE*f!OV_s)4OXo{LktI;^)I%Y;1d9mryGv15S%fNobX{n?<^EOG5ga zRIy9X=>l6(;<+&)PdIjDx_6vZipQI@dKc@V?`aFlvPC1xhOXzbBIHZ9{;S%LF^pl* z$n0@4JHaX|68R0qg{l$}UtV#lK>qMpd7+*f8AOugk%DAd=76j#A~ciNX$M8830Ngj zI~}CDk6DdM54Xf6mLpy{Y2r%Sui!eo^h0rc@^EP^od>6cACf@Rk21}BqD<0xNT%V5 zG7<45`MOt_SW>z!69{Db7qs9Lp8WT+I+aouDQ}b?MLu?^Xg9tcv~S}QAGwg>8by3D z&VW`=*`K2C*i6E{fE)$=6NvtfhJ31De6jsDF2qRU2IADlJGkaV9etlBEM1(?dyB6< zk$Eou#svcsZVOK7DH+M^6`LtsXCBN(s{d5K`TsS}HM{@c`G%Cj zb^!$Krj#)6OuThB=W~6+xi;QwhA)@XG%ZK?b;aK%SS;i_g*$9;NVRkLdM!}YdgpPs8~X|$2k+$KmXQ^UA@b)TL` z6ZRv|&ZGtVb-Z-hl6LRcNAWwsp>OownQm()KELn*e~fVPNZ&X5gmK#W!aS=GisM%9 zbnYOmzxu_~LvjyDruT`bM-!FGh3qe_!9NnX8Yz|waAheAWf{%Dx3@MhL(2tht_K^v zAwhuqCKb#~ir1k`OrWVR)uDVhY&0@00WFMuegiut0b#g^TavwFgM#^XJFhLLQ}(ym zv%q5*NUy1KyNL9;?wK^`TV93@%HTOjYK24ttUpD*gJGunIr^l$(3!J0&1i-Zk(`k{vl({nnu%SzWF?(KM>w#o z4HehJ%NZ%8ih6WDe3jMpun(1HR40Ge{shk?Zn-Z03H`3La;E>J->j*j=bVE_bv}1A zjyj*vm#NXwwDp8OJahA9xT2H&lyZg3RQc`esPuO|Yl4PT4t%JcV`xN=w@ct|Ncb{k z+1!NmUh(v3!aBkpm%*kt%s`1tt|J6zt3XrqcdR1qky0uUXC>=v6~}Aiwd02LkX%#< zTD9(E{=rgmPE4X?*=Af;aM`b&)i_VdNXRRu3Y1s1b7=;?Sz7OSJxbzg6;FK&xU*@i zfGbUaOLX>KS9=mumwjbIwpbx}O&v}}$nR}mm5?tNp^I1>B>MSqZ?R~K^4~bQ_6Ulg zd|`MngsUSr3%>u3SfCd+2o!{?BL=ScU8A{!DSA@R8|cUBbTP9hE_iziL6+&ii8|yI zQzBub@x`we8ypuc>TG23tK`i6fOhesaw9MP^O8j~j6BsIwrIIARJX@Vpz!szKBF+x zKk=`g!_5;Zl0`gGJ$uI;s!N zYygq~VcSVI3`9NhR)A?d$KT|jf!jtFQE||~xVn<22hs58(AX_~D}n}Y85~TzgGRdm zn1gF;Zlz?)xFAFP2v57Q{{CGt=nBi|W`%2U3)goJ(^M6{hn8DLR_5l#6ylCjD-O0B|amwlT5_aY+!CLPByIqFgy& zvu|K^DK4Q!bv3w)jUsJ~_xRR~@*D$^YZ01=FPFz|mnhF+Ankn(^WqIWrwUh9L-{p1 z#uC+?NrT!#WY^9TeH%dF;pDd5R;`+rw*z9W+S%C7u#oT|ZOu2bav_z zsKQ<9OfEFa)ExJb#z3LcIBNG1+TPhH)Whp#tK9XJa)yCNXI_-Q!y9P88OFKY!cpuv zgIf*fSSu9nM9AjLa=?|nA_v@N@x^;GuhRN6P`SOawu^zoXK#o{bVL#N6~0b^*SA~+ zI_Nd=^=q$-DpPFntw{;LLgihIfhxxEQsB6F-KP95uPLG$|K?Zn#Zzs3g!kG8QbZm3 z;zHSj_3&mh3~?i#$9Uo05vNy?pDKi zfw;sNu7G?DaUpz+ zn|d3k`3}>;-bUMN;roI%5GbN$EV2$zK*ODgr-#A`>Hm$Vdog|z{YD_=U|@cU1oW}M;odDcha%eQN3p3>{_h(zX+JI z%t1I>hlH5pO=(Zan3Y+UCh}3unl>v`i}Q zYiv;Q;B9?hR_J&%^L%3+_j0d(`2ENN+R_gSKk_Bj_k%PjpHW4B;~Cl?Hl{OBMVSPu zF9Q%BgA+iJ4GeT#bu($i07lx14h{g}Zgc*fMGszJOwrt|n)#dPngK=&${T1bWn|HT z#xrWN3a}p>8gw1%r&N;eq1(E?+7obD6J!?)ja+#4_nM zXaw9OAp4_RY!v#-x=PK!_s~_x@1f%>Q2qYVa->$BDMoinRZ;ClM&F^Ei&@DaEXsT7 zat%;7C?J1v0_wBksIdaw0hG43TA=dp>@89I&z7kDrOx7uFdLzv&iHcUXP>UMm3`oL zpfQ7uADII~E`xw5*cZ6WxUbQuAA*smeD4e!Vj$qv?n3RaU{&2iR1v@%3}dc<)f6tF zc~=0z=3?<8q2xsGxb7^&Rfui*5ug9Wb#k~@gHF!SCVRRrToQYcQ0TD+?(8gaiia6~ zVbqjf39}%&h*n=|{K1s39&TJ8s5{IHjJqiNDg$8>w>u-QlF-hW5ypMKJoge$zz5?V zCcJDVR9%pT(@VdMnvFCH^TL;Vj2Tv=mE-*ahLhJVdT>Li0&oM}QV*`5@RbWV@5)9V zaoVDRUj9W0O7!rAR52KA@r1|eUjD_-_K`+YpWc8_yN2qo!6?AtmQ@voINY+m!k8o) z-ft9lQ7TOzWeim#Nlx7;qc0A(9HM4pAnKw0&WbU{C|_atT3&p6<~17?$t8j&_ga|O zD$Hx~8|L*mDjH|N9RFY8ucOI;&vJ1i306W1>#B(KSu%dVJD!%0Gn$_!Dzk5t4GiBb z&bLSg&6Esa;P5T9dmJ0%*Go8iQtfp{<|ucpTxlT!Mc@zB#)}}Y;e@KlQ|^o9X)!bt zWtfEMx9O+Izk#M-2Wt}S?KNJqcg%Rh&qISIP5^r&RkVD9F<1@FbPi825SkO3Nc|>4 zO+_l!-C(5o!V$6V*uxb>GDQVa*egk-g~UFk*Y-*=ABl8tKWLF?dxVBeGH$CBTnksm z5qhu6dq5dH6UoAI`=$XtmL3YkTlhcsBG$5fk{E9#7S2che;~N70RhVY6f2MJ=N&LP zWI}TBDF|k9!2_0jeq0VGv7&@X7GRwGNlZj*mHIeRh)Mm8MiwsLZV;1r|H|i1fQV&p zEOnl2WRZ{m};oWkZotx zZCE;X3D-JYqDp&6aI=nuIdl#;rAF(6aB3x;!>MTv>r~|~>UakQ=6L__lHWEiL#z{F5AYU-ST9a(2%&-t={PH70ek zIWIG;a6hl*cxStnC>L;}v~{-8*7u5YaJKOsSh$~d*+$#3ud$>FgHa5C(8KYnv`unR z0AC4uU#u{>&6>87opPcI{KkUj9gdQhG)L`(@+&2&_A@l13f(8It>*M{mGPP$e!rv^ z$O4<+r+IS?af7<}UG^TWpNqb-VHD3baJl6XGUpk~)bLhXJ&$MmtyDJ;eT&1+2j&^) z`+ld+^Cj4z`9|NS+Ruy@Pkx9m93sEa^7+PwZaDMVXgvp$h-tUoItf4Y13^xTf1CK7 zf{Wc3+>KQ*M5p6Da7-*`d5qja<@Xq~3f=8qAADA$6{!?u8IGPAZ@Bxp%nyG>C+;zJ zW`z&@W$7Q$vPjX$_c+ynf)Uw@xXk^3-0ZCZSvQP?#6wV<&|s~70zYCq9-q=PlJ z_sb^d-f#3T!V@5T(JQZ1+1QJCEwfeGvi;(V7a@|o6WB!e8~@+~*i1vf_K{g_e4-}h z(d6e+dpWre7*)x=UARy=Oc~uOTep;3=d~&*beu?+;v!;o1-7tBdlnhEp=*|4XJB&+ z>Q#$g!+R4WY7GR7x~*vrp?lqIS}(pW=%DzvadH#4xahz`7xWpKq zxu|W6*-3n%^6?CQ3|mS`4r0ro7p9)(R6lHd;>$a7j>n6TkbpHpi^(aO3;4r*oCS{< zLlFhvm-a3*YAdzXa;+P|&W`|ICtXq64crY_}ul-i>tPUS1v2Qz{ut~3g>+~IK?-T_bvH<;D{uBSURj>ii|mHAhQI(Q2}*6~n6 z{a4mL!BTRS)BXu#IK29oQRFED?_I^|S}q2em?#?PV%;yatjJS@mxsBKQ3YD-o-#Tx zt?Y!C`MnbA8%*h|4Qz41+uV>JEsl%0*9K8e#^8B%UO^*P3qmP^@~V3&EfwEk&id8H zH$EROTYSct(9IrqYHbr9<2{J;is+@3&G?PpPuV<{N}n}w+u6TFJpnlOBhMO_2GAI| zoUWtY-rHvKZSx)A$#SS)70HMdNWbGS{izU@Sur z_6=0D5vvsp^rDxIyc`YYxzC5^%Xs1y&i=1wxrd!6fMl-!Bu#$VSfXo54kN8{HEQ+> z)?RLa_Pl~ceJtHiDX*duH^o`~Dm#STU)H^5yobuLGI-s{gX#Jc9exAk*g8$$ghjD! z&=eO=AKRpfo8eb^;}>W9W@8p^ZworZwxDPXw{20;+eT*mcN(6ugeH#8q=Ro8o6$h$ zg?Hc_EOeWQmIrJc&YGEAgF zhl<`eMl#2$-{*y9F>QGt=6AFUW!IrXrGVDgVeucyt^EM@PBfcJKQMmOwQ8^0rc}I* zC#nn@zYPi$X!?B!K8FrczwPi0MfN+(w;K}>AOAj?JBW4=ZulL5 zVDe|67T>L(!M_#7d(fX71eZ)fiHyZS{F}N^tG(#JhjQor^eCP<$ z@Z@kv6;qhRahSGzZ4~-LKV@jSxDDaDKsN39%1EY`dksr>f0PW>T2s+p@J-96^1a3r zs`4cr+Y6&w*+ujAL7pQYQ2jn^)uvC)i< z#<4O9=fS)g^p>0dzu^qG$Hp@I&d+uh^?-J; z2hf@W@a;f$BHv_=TXZ;#$CGY z39)-REkDGoiO$aYL&9`EK`VYjHQH~qvYV z{Q|=+@?Wa{1(=khwCWd(YUL+7#_6FSsr_Nj{~p4CZ}b4oILwZwFX`Z6qi0U&^RH88 zd;?eMBrq@ug2O{aCBd)AZftNHJ=-ZCe{Ie95-YMB{|XcOC<9mG96D^Yrss|rE!F6U zwDky_jnO(faRhrY%KI7G%qBI!%|le;jlLTb$l{|$m(0-H8TLgOPBSeroJ8HM(T=i) zgs>iEx?jU)Ia@uU)wKH$qa}?v=DE&~!KDc?N%<9e5Z@`k%2nAe?{~lBtlQ?(#N*ua z5jt_)XcH(BCO6Kr{|1+navM$m4TVED(_a2Y{z2s@@Qse4jr>(cQpew+pF+cF%ogi}lBQL~dq&u;da9IPS65x+4YeOrcCS`pld1g+SOdy4z3T z(O1}4x&pfr--l24*3$M2DpyS~E``#Q%u-sfn((fjbnv6fr$RUvC!3@E(LF4jwHgEB zRsan(u-ef~JYC$)VbZI#5+~hnT7rb!fFxl?z`To@eIj6Df_R#WQp^X{&N;Aux;i+b+D7sij9U(j?fK<{AbBh|fg?~(;0jBx08XZBUL35NE8A{88=2SVP zv`SpEU}ACT{Zvx_e$+LHBb{_+(HHgRpq zd99ah2F{EwZeqT!x~VjxshQP#UuuRQJ_^>PYfkb4?5)wTU$_i3oSxxF(_?wjH%F&8 zLO;d9)w>~+;#J2MZ8jxXrrG`tXb2BqXomxtRnwecVe?~JCbH&#f0Gb>C5j+hm z=BKYRw8v8A9Mq7;TE7|aVOlP2ZsIzlk7;^yuxwE&t!U2mY@-9sO$-QV{7mFW-=c|` zs4w~^Eyy&X%%c1~*C}gZF81+V2zy$ZZ~!W^=s=bUq4G=%JdioQwb|FQdkOXg+)_L= z^&1tH`g>7*Ym-eDr##!7Ci-kk8&hmk73G*>`)W%L2#KDD2Ok9>O>E1ZQ{pUaYhv3U zaWI|RnVZ#66FS@u8BvR}^UysJlR|l>FdsMNnb?q5=tLek82OFL^G)oOoJ(eV6VHsi z?~!y44Z!bA?GH#UuTkC?)^)fm#!UEWs%~!z|9Eu)xS@RL>?$yEXc_E|bOak%C_A!H zK0-yE%!}2?Vv2Nvutuua6`JRYR)tPC&s8JSDRMeX{Zv|gx;ZJ!Jx@4Wa>YC#gF#vP z{cebgJDYgBWG1cZ47|X}=uUXl5Z%TOdB1&)$J0Jeud__K z(Gcp5UJT8nigV3w&br=aKUKxW11Cz&oqQg7`#I1PAi6Vh)yP1GTB3&g(TQ_0s+;$t zmgku{K8;GwGp|!4J#nPmoS?g{yjuEFvk;nrK!H%mEW;A@Vw%^-+*WB{;0Rq3#=gPw zB-yQ@H$}H{x~7%Me0zX!QHgF3xtyOAen9zWDjb9YE_?~YA^vNyfS-#+rSG~78h2%}aFokPW!2(fUEUE*ogluLmOYXI&Lnsg~T1jS#tlm~qinOHa&H7KU+ zvfBrnAy9XiHeSYE9Moq%z#qr+FRVwgnPBQPXF<7mYQNE=HZ ze?wQ%kgItV45P@^tlx*yD*Vn1T~;FMTd9nm^<+1U9$_bl2*bKx*xbLA4qt5!R3n2Z zG?K^k1vHVrN`G2Bl2vA3XU|ATuNuvz6BTBbUug@2$Edy5%*+h6!6=K{9s-||O#`ll z?oe=_*R|%rO7|MMati&y(gnjfnb*hA4W0q-j)W?2f+$8!tP<13DoZ+MMZ5Q1=kT{G zJfTK|Z6zetdpS|&S9tlO6Y{sjB-zl$j*$S^+L}1ZoRFztUE*Wafb|Ach#)%Zql2T& zX<4D;Nu6H9)fjXBoPUgFjKGv@~LZccF0 zC!-=Y(#9#e$^6-u6Z!+w^)odH%@xjYxJ@#u;Gl|f-$qVQ=oWKBY_Synhm$yM08P%lY#IJ&iZL4mY5*o;H~E8ptFXy-UhOG zz}^nEt;}|I-EN*C@%yolW6l7HYNWjOF7v3W^r2&Sp)t`?Dy=lbOaw;U%`~qP91Qhv zUZ~^&7RkZ+UT{mvVk$DsTnw&gr>~RWIw8hEz`ezZ%rs|;I#B#ZN|`M?qI5Q-U4e73 zQ0acpTgvF^9g>nbLQ|{%ZS^$uw`aG%(iBW?Jf<6SH}0gFm{|hM3!jXqXLv zs(PAdo1FxanmdKo+vZ(mwv2<9o`8ih&S>sbDPs0*LPN{^c|zXXL*C)<$K>m&7<&@U zs4~y+T7MI*sR9FWVytwo`5&*g8FYBA*^Yl;ZFVPR&%rX< znSMCG3*Imgf0r$z<<(}39*>B9eV87Y7naI>{nzk(jrcvgghBmfOZkgyNFNfvQ>HDY zgVpBwKHRSQfZ4j&!@^z65PtuX26u6d8uGB%w!~7kIEKZ0TzU2bW@(f8GWV$X!qI*= z)jePi%&Uq#Z@bFuCo~U>hW8oD<#XeLw#)CO(g)2FUoA~}(9HKeK#LzV+g8?O_@hdT z*(z2FZ&W%3iZVKVoh}(bsbo0ryq}wHo4WcGD)HmG;S2EY^2jdmZzSS$-K3@3zX|nKG;vGQwx3&nTx`+Jy zDKag5A3LGF3U85VJCGKu@Fouq#CvdtG8?a1iLS$TWsOKR9sa}Lz@;^=o z7P5s{?L-!t+kC3#Izz}D4n?t&)-1-@i7u_FnBRkLddTd`+Z*dxtCYP>s~>{(jK=`$ z9)fioOMeIF>P5O!w1j8p@VgEOg3Dy5hyht6W*>Q2bq5I4+`bNftF#efS5)T99i_(k z!zpE{`8h_Eb6}}?yBLOJmYI`yh;3gcGhTSqtV-sD(iN~_B716A!cM@?g)1>#;=6Yx zhHdm+>ih(T91sn8f)#z}MVj(2fq;grGJjM|{4G|v@SI=*a{C8?24 z&g3Z8Msak9Y4Pi3!TH={e*3NrOfllJdg;*JA=Dt}Y1$nQf2-^}1v9G!GhY??%w&J~ zt=c!t!m_dlyK6g?*&Vz$;3IxKl`f>alE>lfTzFA@K3|K=c&N>u#uu^i$d@oXD#b_- zltpOr8)l2tneyl6nNp1$p}=jyMZl^K{kM$BDjaPJ$e6prW_T!A!i-3UgR1Urvn|BF{%u$l=&$HI;5fc} z-Z6#8dgE5eKxh>0-HK%y(ktGT`H^>J{)qQDe*n#S&%DE@t$QDnukPkJ`dqz6Bo{};@8G9f-^Oz2Q=Tk*g<6?@3C)pB43z2)V6|T?RJ>MGFXX&lf)DXwrQG6 z+rMPe);p1}%v+LD9~JBjVC(tBJ}k79H=V`%d1yqRr>)5VxLS z-e1eXg?$1=Y-hp$f(XNZ)4t!$0kKLEz}TEF_`{s+rQnXCKX715(sUOMIw=-K3xiLp z(Sk**gS`=Axb{GBo1d%N7zm1G`o@&tcl>)*YOtosOzz&As_-1q&2wE$@OrTIUy|>k z>3VP+w_uMRluMXoGx!XndBF^_vF3z=!NE<`GHBhLV7JWh?|2SQWj%+3ZGV*P#MfW; zEA7q+j#LqbT|La|>fF#acmz8;6XD-fS|stvOj?9ddWv^#!Nx$@c4tAmAQTVkJeU`} znZFhJ!6#I07p1fhB6#2nr(^pdtQ8w>jDldMj>v!RfPj6RCKm*Aa_m-=&gw(noiFk< z_o(b78-uAJI9#1P-gB+PUN&;Rx+OeTY7qMXinA3-Tgb2qz>4IoC7UmYM|Gz z#Qdh|or7>Wy-kNZ2R{pNwHjV%+;v7!7(^|*1YyYbcNTXE{^3*mL!^p=OMp7+6!!>@ z6OysCXK)n%v94F}^CWfi>$K<5E)fPgBDmn6Z zsI@bs54gaPQ_klWFrWGb;rRXB$qolGxhZcs)60UlGYB0X5Zuq8yDvb8hQ)EG8oLHbyozt21mrn2=@{B z9bAy!P`^AopP#GaO)st^CNnB^z7k!5sFgLtgD?z^(2OgCeY?c+VU*x_l4yf+Dc6y| zJoV2wut;PaZoR}2{)tM52eFmYAeVnoMWf#*Y0hxK+Xp2)PC0MK?@YS|)iJL^@}RPy zQyW0#SAmrS5}ML8-cEh2<9a<#VxJP3zX;Wl?p2%O#CYCz9E?7OdB0+pUNX(>BL|c z-`{|Jrz-uNEt7(S{bCeN4PqS~iPqjKM|J4dAoeO8T6}A;ry6&#c7}DSQW%6qZVx?%)wJnNnszJ%`3RFU$z47?hVg>+cK>#{2>=ZY2;zN}W(; zP)EY)G$?{1k<+L;65OdOSf+g`1pFJ%U;JJ=8+_CDQgpWD>p}hvzNXI!W(|&sVX_S16Cx(AH#mhT z`{OXmD%pR388WFf19;=&ZPD^Z^}x-6AtOckvA>Z4`0g8E6rn-#m;a?6lT16Yo)jv= z?|6IC;y6N!|Ay9J97Yl0!KbJvKua6dgG+21{nnkmcFzbHEeuDm@Pk~=!>=LMGq z)KIar>3*KFqV1f6)xjrys{cK#4AC+EI@Vi9g;m*p zaS+Rxf78Up7(3ue%ZGUCyPsMv2_lALK1J@*+f(%t6hh_;OTaMRW?2%ffoVPC;owj) z8*X39NJdijBf(j^_LW?O*?Vc#BbXFXuKhA;RV-d6#<#O;nVg#`v>a4LJJH1D!Ew61 zPZkUxpxw)Zn^DkN@mTOdQA4kP26^@6Z2c$Z>`MQ(Kd(u|nqws|&)u(tIto;M&(;qn zTYqd#B5Wr6pv?FGz$<9vCpXU5ew6u}e`FT|yNVm0RF;M=s| zXD(RdpC-O=lKg^5u3(4W+Tjd;MSP)jix1|_`4>q8ZY=WF{3&ntg)*=C5lVjoR)O2p z8H6ts+In6>ccmBq6}(anJuBAH7pw|S&2+Wy(89bo%KM@XwuQ5ORnYSB3SsZRp(oJ| z3!a30gNb!dLV$VS?AYqy5}zLG-%x~>J`qwMYF8-rL=Bho+mG6YO1r<7MRnn zc_nzUrmt-!sHxI&oRm$$zW#VZTW84I!A#sxa=J6|y(@Kbflq^l=fb$+oz}^sR$(#l-Z_rd9uk=ST1V*?Ml7^|QHljtuGOy< zQu*#6ZWrnl$Dv5)2OA~4Ul`dP?B4a7#(}IAI9kMO1uV9Oc&-y)_}4~?-zjC+(B9p_ z^ZwUjn=2ZMIYT}R%GKlK&x1d62aovzat5(7_XI!0(i`zV(6iB_&eE@gFZq078n!R^ zFJD>h{$T4?{lylfXrt$}mTg$=6z>mS#lY3y1pn2eEOysYg;2z|#Mxm>6e2w&j|w)R zn0O#~V^ZY>f=#lVyb?{Y(H;;_msg^RWvTWj-;%^D&+&0N%^oO)EPP3gR-G(wx(>yy zG=CVOsSRDr7alsp4+bwtx-@}`(C-PBVsj{-#<=~8eZ*0jt9?EeOFNQM6gBb zWwO(?p|l4-eXE^gCy;yA6>*Z}qxOPSEgS=fjCc%Dj>XZ3SJUK^K|UI`sH4Rv!`2S5 zpouYbW~dfAQ=>JiHC&CJq=;b^I9-#hHZY43&XjDeQ&;hiV7p5cj?~05HTxg3aCoxl7g1Od z7rY3@@|7TwfYtm$NyT+6HgPH6&>?-{njOP^(S?3Ct$Av6n1c?v?*Gykk`Yn}1f%|kzK9-< zQQXiMLj1kwrT*L(A}=Ct0rBMU6nznqhk->|?u(&bU&wJKPwxo&PSqEl3X&CH7dzl5 zD^5uu_Bu*Wx0;{X7*RrBguaUb$NTC=8j>#iBBhD!i{d8MK+zYG42+A=5qcrR!shuQ z$82W7y#XRu-d#4;+dSCh^9n z%Q#-y8H~3@#Cs*Aac|w|bZiB^lO|a;%^TIXIYY9n$Nrj{oP7#dDr#dbYAX@k-YAHI zuOyPy&2aX%u{vn1?96=hy7IfzE1$I?7Eu)i)+4P2SojV;H01=F!2Nu0ylBe~*5G6j z>R4#~r>!E#>g+-UHQNI@-UtzxQI$k`bOs(Mu{y*8;oZAv;^|fwUHfmzKIpW79ibJc zTa#2Aq;A&Ps_iECK5JqJfpEkLa9CG7RI(pm|Ij7;g?az5_?_ZkiYO_Rw;!TGXIRHo z_g?9Py{(INtxsTk4Aw)#1sMMWHnYgupXDz5%ULI;R>Q?JW>;$ZqDd&Vr_9Qv zpZi+4kZdz87-$vJx#wFQ8PA@9RtLK8e3`T6d~1U0ZlUac7It}D_;@iPphR}qdXVc` z6SiPrB~Syr4b%(-0D+J;PQd`H`Tw1o2?Jx)4E6{q4WFhWUd(Nr8*ush{)DzDI`#ZG|t+$^S9aE(_g8y^1jn3Xn ztowXf_6O2~EOg@@p+mTU-`<87Hmo0kj%EzDK3Aj1X~bn#nHoaa-euM_HTt8IJ;eGP zj+Hv+#O2m;-^KQa-XS*xrYRhRBIj*c{dU>y;g7_0Ec2x%{u}bB-!Q2D@Gb`%8MtW4 z|B16{goOibRr{SSBUu_ET`0E#5)>^E3*av+tQYmEpUG6OjHh1_7nb_=*2NsD?R+FS2NxT8Dm|{XA}{vFRtF}(9S0gdy2}#pHjcE z*11{sw;~^lKGtiE@|TXarv0DFcOLhDEbq)2XT9SOAC>gD#{|RoaEB-@W8JH14f($& zb?)vcx97gbUJPFTLfB*1*iFR~v;5)b_w8*=D@Ke4}-vPoo1jTHW!8ZT4h* z0#rWPdcLb6Io6;-%Nx{Dil>iLr9R#)zBmM?Q}IpKNuNT+H^Vr~prto6RarQ-ZNW3w z+T%|f+HuiK6ePUrluDg8F0Z{4-E!pk$elTQ_% z9&{IM{yaFmt*?@D?8}}v7x|L@y;Z4cc9t?aIkj8TiUl!u5WNtwMydN=qLwq6z^|xu zruAfw_En=YYHDGlGRd=02F{D|v!G%N@Jthb*XB{(EXHv+9iD|oy7{zxwzW+SuX3i$ zVV#bQHMTXhcaQfuL_n`85$i|)bZ_<^}tJ*m-Uls(^K7bESR zj|~55lzz8$6u+I6dw6<9#*hV8p16&bZskr}Yc0HOK(6%H&=syv_{Npa+c&HQ-1rU z3=CBst};*gLU3Bqbhiy~C3`UWfKQTt zhYJDk{jGHeJkEs+ZubDZPyVg-1Uyc*bGq9bK^a0;@;mb-bw1SzNKSr0{r(M|34JpC z->_QnO@5LmjC-l*NlR>wtbP)f3et0*vfAkp9(Kx%jMU{+x!O9DZhy)e!wQKlOSB(@66H*j~V#S@u3vJPTX4>|LsUmJPWsPWBoLetsO(D*X=%ELq?T`;S$~ zTNlop=d4e}7_E2#MIzr&^$XU6ILS9!d8#D8{k1p{+XrVNLWo93%LMZxILWsbSfZa$ zbe+|nB5SQ~d7&McGXoi^t>DdXhk$9HiD+_7xR6Al(1)~rEqfRc&$kZNJ|D$fXFZn{ zdNKc*>rY}q33yauLx&0YD9%eb)`TQgnJJeqonGSQ%XDFqzW9=LtqAm8t;A>X5F1XC2^M8`DYDz9y$yC@M;sC23!t2Mj2M+TIMfaij2HcNm(Cb$3 zp+^omNUy1~5A!!;uKnK{tpYn}T>~^(Oj)N1MJVvO-(n4$%u1B&h~d=S0}b^sZph}3 zwEK081^aRu_J*~s5D~syX5PvLqqF=C19$`$nJR2%6*e=j(-HJuKtncJ-|-Gt$i?~) z-(fCn@P!L9_{n9S#VW*bnuz0WIHk(_NG=u^T5~ctV>kgmvRRf}yxF?_FXcj)$I5kn zGght>J@%$`LDoZmswCQ90t0FCmQxTB>JvjYaZ3WSFSncuS@#&Ses6&@O!-@&6yIHM zB^18s?Nbz1+QbU4dE2@eg=*iCWm~?JQ1;$;tR8y!LWfydrCm*1-@)ov8%e#kViJVL zS-jQiqS@Ev=kB1kU6Y&Bo~>8~BERFiR!`Nw1~HCSxAu#`g-8OcLqEX!QuA{cd3w>V z$j>9IPf9jzd)F$ioOf@{`~ZUd@b7L!d+B)MEtTU+TVf@&YQgB&Q<6ml7~emTE2OCo zrh+9TQ2RT{gP~u+uo1be^dy7V44#x+D^^+^FZJb<{hpP}dKrF{v9$UMx39Ch%IfT?G@{Px(7~qJ1ukrOTS5ZFYf8H8zeAbzX}Xsq3sW z+RB!QYh_PWI~}gGuJ*9sM8iJdM$C8Ce_&nUJB^F_wQ1~js`2M46cP-&Q@(txy&@PB z2v4JqA6j{Nd>;zn17){D$HBqXRiy~SN1HiEdMLA9$il=Atqxu6Z;sxJimJzrEj;g3Q-Xg76>EUobRZ@_>>iSV;qGg zA-B_z?N(uy%~ulO00ZF4MFS3t^8PS3inm*x#1BoIA(w}JaHkDB+R7D1QlpmLA@2y; zEL)dScB@EFdEyS|*mi3$mH_WKgLYz;skGWA?6PVz{i_?Tl%GJes>;?;%E#7Vwdyq*!CwSAuKCzH7jBW6RR0OjraT9o zP0pv*M=IPQ)w?lmD&28Q1x7DiCn=v{)uUhm_nGxz2YYV@EZCalTu_H0S1ueQE%FuI z4$Bl{jmEdWQvFn|eWk-GRqiHnYmMx-H0Dh_ohM*!n|E`Zz!2WTyb0emgd9+r1!6x1Z%%Op_?F(z7s{BTwJrf8mR9}HME^Py>=ZG?7##)(akRJU#RLsu#sTywKF4bC6{W&Qqbnt7d;Ox}33vi6feROIjZ+x&xj(e2uo6xxTL1^ncF(8pNLui6K77XI4V zy^o!MO0`qJpZyrhf9TjZ=zITu3LSu1RJE5z9Do(3+(5bC@?PU&DKFnz7Y>YGjpJ7* zN2jdy*CazNYv`Hb1yIk3MhJ=J;0RXN{De-1A6N8MVU)=9;iG3ICy(BgoDkRg9i|#( zE-mIS9(mpS9lXGyzxrkVG>RoKbCZ}t-|4!C4086}y@^Huwm?$_;9 zMyrA3{1xtf`A_V)FTcGD2igvL^qf#lM|;*}@;J4p|y*Gk_#kh*7GG(SHar0&+ZPrnB*oW%*P>yl%bqWTLqs zSf)H1o209Mg3zMr2Y#};{1tAcfOBD16#Z-s|4V-Kkr+h)%(s}qHPv2OYc zuyRifxb7EN2BVua$V#7Ps`ju}Zp-e#{!dYdSQm3)LR826#WF#S*K2m5Ft~f&mSX z(~et3Ij{tUAbZxJpfB25(C5OI+H@QqV6C~6{2O{ejTF#`-ysp<7M=vPXe>eS)NK5n z-C=Dh_YZi+7cHngiSl+^3Z1kDHr3j3*JGLAUWmY4>?bWf36n}G!T{^Nwr^SyT=T71 zN%y2DeQD|H=F@1SFKv|Q1vL$UhdPZ>)9zAns}2e{IZ0e1^1V}@oQ6Ph^wkXuOGoU~3fH6^W&>h=~t zoG(+-K7i*WM7v7UvZ+o_^YeXcyYw{ddYn%ajWj6SFfBCFz}@r7H0AGNGwo*ny~_Jt z=l$*%l=%~bX;qwm*!!Jr$=@q1nZMOSoAEwGdRp3Zs@B5Ul$K`s{Mv(Xbv#JB($g?) z7>M@&#e`)C_+*=08j`8k`#SZBGar0YZ@x&?=l4 z^3!nCRzU8XN)u0OXu^@HRDD`nYdWnUZU5h97t@+E(o$&puV%;E|E6m6SckMte+zuQ z$k7U>)pks~RQ}z((ciSDV_I1z=2n(? zQRlKMjLK_4MPuyIIE#@66*|gkc}Chc>_yf%2fL*Gh(FG!-9@r{le?zj%rJMDjhKn9 zY0c%29%E@@*EAf|W&0w09o2VD>p-t}O*>7d*w=H)STB15jp&v(PW3}Lx+MxncNUI% z>`W_DH*2BGqt(Vvn@je1TPl_;tC;72#pYh5E@|!JH!bgM~D+=j&a8MJwNyL`m}r5obThehuigh zeg1#mpZDi|UH5g}_uU>59p}5PhqLppy4H<30y}ymzT7Q3!p~dj>)p;H7~1U8=4nUz z`C!OZtKE_mGQw{(yXYMA_s!X8cbUJ~(KFqD%;1EQjxt_zH18>Grcw2VImh{w?;Dk*2j^Qv^L z*>l|FbpN}<=ge^BpStxp|6%*iuIHmr zX9PcM=?hM8)|R2ne!$H-4tsE{K8`hgWly)`IGR|ur<;~R6FZKjiK)Xzx&0X?wDDtX z^C-1C!<{ydQdecTP4g%<=Mb2E?kwl;4N&v*OJ@=tU>Jl-D{EVh~lTVa|0nR^85e7VHj{F@r& zbxYjrO#d;Xy~YZ;vJKlKJjvYF+{G&pzSM2a^k47w##iVwPw+o7eBE15oygodHm7Cz z`3VB5uL=LD$jv+%7c}CkLx~e7`!C#YU5>e3#Jjn{YcJjDY55|Gk1Gc&j#}wPoZ>&! z3}VeyiwH%r!BE5~ck&AGt@!Lyy!o%WiqiF`_`N`3B5L%ho-x?1E8X-{{TB?5rtMTa znso%;Q#l9lD;!zb{&9coDRl?0rzeSM+5UIDIS}jePYa246{mTI;4+&(&vLr|P_J0{ zg>KI2X6bX>uG9VFyu?K-Z#~0*=5E0$dC`?Gvbjf|;UB+?XCJ<9>bP(Joo6$RXZY87 zm1wpk$3K0r*|r?7*_1Q=<4y`z8#QR1FZSfm$n9dDweenI2lG=(pMLEv*}6;28A_U{D+?vY+=v{<~z5) zPna^&H`N5V@O4-I;jO7{%w7ajj?tC{-=>P1Ki7V{VBs|-_YEe>*tfcME9-*Chk|cn-}=^9lql&Zp_*K?@fB-LO<_cXE&!W z^k1^W5#hHqn_;asVU15&2D@tuei~8fcLe{WvKJ4$j~ANqJBHukZa&99XZJ5(o64}( z?D&tjg2$cS?{Txv^^e~@yv9pkeUF#^%G&1gbN%1$8gX9Hxhof+ynTKHTSv;TZhqF23Kt)UiWPOk1?#{Gw%r?mzDLj|=bQhY=2QM?65s zhq(tm;9tF+F5JE9{Ub)0rvGA_b|=^SXN@#T=aY0W$Hrze`&IS+<*`}IFP^h}*^-kA z7B5^hd-?KZ%Zny&nRoZpSa;dG{>hVyNi_e4@hX86PhPQT`HI9p40Ytg{{1IqKAq@G zrQmp8NAdcT!sDkbUKU)BTI!gxWB(6z+=PexyN(>7#?h3X!fR(i`x@@ z3*2{_{Ksyi#DCuyInwn{9_fsV;?b~K!H2jlvj@kZZochF|EW9uq2Au^anJcjhJU#} z(O2Luc+P+HHcI^doPYQ5sy7pP(?9BY|D+L7ZzcK$U+yu_`{$0xCu#8I-f5CrNg8~) zKbR!v?L^<;%bop#|Hu*9?Ev?Mv&iLLTx^#%}c`@dQOeC&Euz1+{JBy&?Iz)IGp9$plq;dp0G{0#`{*y!U%ZG10xEl09A?@*l zAZD(?iCo!|8YqEYSzfic1V!ha^Csmzy5tjHNKzdyNFUpvgpBJ1^e82 zulmQ1wOJD|voYiL8+z5hXL!K}iM}HDmskCVj2!^YI{n5m`p+twGoO3+xBi{O<^}zH4;6k)xSJHOHMe-mUce znuopaKVyesVa;d0>Ax~;SgrfnJN`ZYu)Fql2|hcyZ-43EX++m&iN5n`;-m;dzq{&T zf1+FSuHOj{rn`^5>z^z9?Op$*CHI&H|>4DGwSIt6Me-L z-^}YkUP0|He&3%M?%|!_L|bZqHV)JGN^v|0ZEWim{o#H8Axpadk?7mcCUG=-&y3$T z(Sx2EqW5O2B!uXF(W6521hk1=w*E0_Gk>qkn?CR#GS_C!RBVd34BJ5Y; zgt6Zy`dDS({v1uc1de-goW(JcwfpA5a~aC=U5_HsKuVGE{yZ_M-YC;m%Ewu0+JU+&^h{VPVM z{xi{+8TxX+BY8qQNgIZ|wq-rHZJ`q%V6f=}T!wJmpY=D!vHAk^o*{Y#+PI|6UpYh{ zKScAmAy|G$=ZRAmE?9o+j_IJP@l0DKS!eH{c8~eoKV|FfYHU3=kn&@q?`&#)#>+$(t9gPP z+zeKaL7SBi)n))z@2PxioOR@xHx^cZ437`d-@uc7zQACCue^jo-8)2^0a9Tw-!y1k z&33Q>-akaYHAMe}jt$A*hXL>7o3y0?zJL<+b=#ncNG6?>?sd-`-`Z zS(}4-S$!J3zk5Nue~NqESN^>N(LX2p(n9i$^O#6&%NyI9wY0hl9opWhXtS0!f9;U^ z4-KjRAN0g6<>P(hv36*OpQEEFu$}4cn^LfN$>O3#dBOLBzKslj38in~Wtz3R5B{@O z_F2K(OOt{&kSfrJL_eUOg&rY-{uTmDWOe zGn~U{#9Yy$hx5K?(Kr6_+weByz zFl zuw+Pqq9M9?h%OnT%{#Zy0hxDhp}J~_t`2JV<{$i1CfiB=PMSHRE?u^Ca?qJ#moCd& zv|@0KJ!2m9BNwk8F8R?vccN`Fg({{=tB(xT?uS46 zNAFzD4~wS1!6k$H+mBp)OlyAUU;f93{lT~Pb-(zD+Z3_f7+>N3@{@nkZgt?6mpkR( z{wcflkhbOJo=4h<7(P8d_;T<2w?A=2Hc5jo_cN1JMbhBQ9rLq4akoyAw!GZaf2Og> zosxWmujX5R_KzMGs3Fbliu-kJv!n*K1cIrs*j^NN&m(X)BARa z@XGJV(Ugzk=;t_rqiOE|j>edWa5OPzhL_)*_zS`64+cw^?%ypb7(=e1tchDz&n8Hj zivg=mJPy@k8T6Ro)|+9An5}2xht*B!&?;%{50k&0h`qOK-q$8Z`;&t2YwxABxpcRB z9J4dmt=p~r{K3wivl^*=0i`Y`B%0DzUrB8f=O@KZ@})VR3Cl*9js7Ps22c414s&LY z&8CV8{_(t~|F0_Z3zjWAKN#1Xkx9XO7j+oRRJFPhyXa8kH1`@a7V05-+PwJpJG2nrFkELq~Mc#7c@6*LHd_non76dBb|LF+RQ`9G#k(Ad1&KMUeBu{ zov8tv)yJ+fJ3LgIOBk!aCg0p{2-U_oR-ei}nkgZ=0d0bw&2L7V#jttmk4ZcNAcGz|pnnp%$=uVTV}}P8}A*lo4saKV(@*?ztf%F z$Cgoe36*Z)70YY8`_#npv0-Dkj^*1eZNki!pj%G0^Jv@#U8`--wb}+OT#- zyA1~2U|IKs-JLZPZ8J7#T5W@-S9HWQCvmUh@k#&J8$fjwEp(ro=1d6K)r*_3b+8K- zVZJt!S#2Yk)i#n@Z6jIQxUD0X)i!cTH=hyZOdNLlw74YSuJkrb#~yA0vB`Y%(Z-LL}YbG1}5+4U8dYbUnX2z zee)2#Mw%kN+N+J@Zuw{HJV}{&lC6FgJw8OYq0K`>oBw(QPX$90Iw=r3h1HXujd$y4@hh~S?ag!M zDf>8w?NW?BfMWOV-@J4mXa2CgHXM)?e9QmmLkXT^Vh=QKIz7fYBs_@CD`T7&w{^|J z#@=JZ)swxA9YN3;AH0SP4<@;v?dyy_)aK@qdobg%`eC$*R#rEl&B?^8deB&+ZRHft z35j36de}tD>Of*J)>v&~bvt<`@}876^Te$9{Y^0Sb&|&QjPHGpCb-%1CNr7=n}7DW zQT1&Z4JqKehZfBF$Byy7A=*4^9T$?n7HytU+wzS=@|)1+evr+7a)@q58xKl|T~WAT zd0@pNP8Gh}6TK~U4@YBxyhTgN;CzFoyw9drqm32ptnAUA9#$@0ylg4;`iImzd-2i* z%P*d6vwdMnNx|!SEbTRDJ6O1&uxRD-Me&7;^QJSxf@MY1_c!-C5~yI#k9Da z=1C@#+-)!+hMlsn`{IZGNqco3{C_^FZKkMqQk!R&vE-1gPiny;^lVRRR@;-B)$1q| z%PXjxZ;Nvt-F5gyGu&g7oPENpXYdxNjn0*c?tYiINEm>Fl;q`OHno7n27VAHbI<^i;E z9jl|zq2(u{|8ykgYH3u>%&o7Mg4+H1U}yd|&Z&%@2fs%r@!)suAkfN+WKx`Il$^IonG;f?25tP?>vUDJlQ_dxp3Z5| z+{&!x2H%LZI-=$wAx-jdPRfRkLh#&&s(jCqPl)eJ<2VtbT<$W<{-j2Oh_3!|biEC#84u*$c{Gg1h8!XV$@W>0V@ih$ErI zx0a(h6Etx&{`Q=7yN++9yPqHK{C?uO$9Q+sF5qbD6>&7Td#>YX&MYoRGe=vmLHTdc zj&Ze@(dKSfw~jv@(|que&H=+lmvfWRAx@0pwJm=ee8O0DocC77K4G-lK4G-lK4G-l zK4G-lK4G-_|Kkbc^t=ofnc3JUj8@wxj8@wxj8>mRVA;#N_a8OSJBN?sX!hPV=N^2L z8+!>K{kZ-pXV>ry%AV)md6YADQU|y@)q+VJ&tOr^`fb0N)Qg>++#_c=J11_W?qbTC zXZz+Ifz@Mm^4WeH8D~0?;idDFeEIH~XL3dB;mFjXAztH;qji8UZxK-Hml7u z3*#%>?1!2o-8nOz-NSvE!G2~s+kEC)Mef-&@)<7^7_GL?T&=dxTtl_FgJQLP=4#!+ zY&v5Ut3QUvhv;u$E{6hx1-|kU26gWcZ3bwrpF$fnJHhG=@ctqCts(j+bZkhz_ssQ# zEe+UbuC_t@%+)&GZ7i#~y=3+Oc<{RKJ_S6*TfV^ijID3liQcv|=f@H5P01qrYR^!MmMj&2~mj+)R}VDL#ppF}Brt@L^WFx6O9uY~$P+qJ2={WG!hRB!Q?Qqrt|)#Y%U z)$ZhDoEOH{XD9j0LY>Xa7=F7A|K(U`d|)G`S5oS30-D*{R`WaZ!Dwdnk!W*0Z1quS z({ZRa1G74PNO|*dqCG?MO|WM3>^E596$W6O+cxl8sCFkF=S&C>X1Vi@V^ux8;5cXW zC|lt(Dh!U$z2`V?w%V+Xp>5H}&qMUTL#vW+-rJdNV(agKHdg?lIy66gNO|*)gZ#i? zg^@!FL=9=s=+FlD9HPyKwL4z$`{WLQ0UNWLyQ0)rLODPW9XD;Pa9 zMBA$pn;*O?3CX{b^5)vk=C2;2uR$9l+Wc$LQ+=myNw|%K86gE~(dHV*R=8(~t{9@t zTl>NC?roXQq(J3aNx|n1wuu&sn81@=>fLOz>E>O(Nw<1kXj7!Wjy7@H=9{|$q51=K z=-fU;k2ZVKR`{5N(A72Z!|V&2|0#NK?4` zCy-=LQC1&~4jscO=+NzL-nkDtg!^WeGj@3ULihVDXV3k57J6@{`Z?kTzQW~;&RJZ* z#hAGzn&&+R=wBFoLbgu~+N`xLYoCyjKjmy^{4N>f8^1)KezvpkF2!gwHS{AVJ9{2c zJEXq3OWQ^oF61*eXw7uYzxAY0vib?wSk7wu4#8{Uf^286@Z58G zH|+k9ut_M>nPCdTZ8*Hfv_f+BG9TxMn@%o1W3ZHH*ym)(m~@ zY0f_TB%{p<)7Ibgx_3L5{L4>s_S_|(e6RiB8VAY;wKq1i#`UC`H8yr{5G99&Hj&Zlm(V7vTm33}KlTk$1K4SG(Lv-&DZ3Z7&-n3`JjjeC)L(}`y%lFQ@9xrqi)a($?0c}qDXmbMDB@1m%An4!;qZsYA=Uo(359%!^ zj26<^`@xF>Gi>v(oisDnbsWt_0qvQKg1!6D#v11261Lo{x1%|_s}e>YI^?`;+&z32 zxl7#d7CLhSL8S5$S{}TzSm8BdJGNzxqs%zUT5UbcYV%gzTx5l6V+gA^k#FLEhz)27?24%=1_bti!gkiFFqy`5xo7%~paTX7JYjs4mJarYU=CKd9Z?@|`1wY(B5vDrcwhdW)flsuy{u zo?Pr_&ZZScyC*Mp){F`wN#;$axfb)Xep~EJJ=tbmL6*5Hvbqj!7RKsUw0S#a^$X}D zL$tZ7nq#$l&3Vq;!KU}bl;)z{RvnKv-edLgXtQ0cUVskmdO3Qq>*k5)J7b6K)qlzV zJ$6T2O6+cavB0@**zQ#&e8hdLm;0Bc&hp)(FH7>pZ}oCNCw)Q z8deWpYS;vOsbRIf)UeuKYFKSAHLSLm8dlpAg4H&BT0MBFVH0fpwA#i`t8M(;=E4o` z<=I80TkmD7?WKm*_EN)Yd#MrBZt#n8HtWxx*KE1{7+$!Fp55syoU6xP|On@4?fDlkDfr_4R}Lg%o_Ha%u1 z?;(WMHDO*rwYnP}=bljP?CC~d==PEN?GqNO?Gu)m)$TVJIY*4Q>GsKr)%M8><$g6!R&2U`vO;?B z$%;+CgT8q$@#jX18dY|+w{y;Ji@Kk!tbxFQu?y$?80~ZC6 z{$}tpZfmu1<%AG@JZ$cB+x%SEyvMeB8EnomR-XY6w&&h-8JGVF7612BNIGTDb0=T! zJhz>hj0|6PeQ>e?XO{4ufHQSgFqOV<YTF80j+Xk!t-wAQ^4+mRn8?titw2Jz{IRdFW9|IhsH2gn-i_MN50KL zP*V^1d#Rq^{NWYOvwd6zh{(klM^{R{cg`r=6R6` zfmUBJM6W`deP;8`GnqrJcCWw5nJ~gv>%CD87IB}uiF^IFw0S3GF2b!gPhHI}w))p0 zt()f~W;8RV&loo&W%`Viaa+pHCNH$DlhC0fTYxq@inaqm7g#c+KpA>&NayCZn|YID z2Xi~x>;$XtN1G+Kx@}0lxzA`qj?MpeFn?Fiw*967?}39Ya~PMhCM;RKFFLf3fi+A8OaaIf@;Tb#sEw$w@Z=->?9 z6K-+#SY)$)B`ef8Q*isiqI8smo)FUEnds03Jb#Gp2(9nFb_@4zya9c83wE@oDG4*&7c3RE<|(_})3?I?;X zuE7RLH(w48%}*vjRG$)B-o4Eo9KbtUaOZ00kip${1r-L@hz`sb%0fF#i`ZJ9i8l5; zf-4U@$O_U%kT!1mmb6<`&X&0qZNiN76yM!jC-@#1QlUOH-~GDUnJfDpdYh9tvHk(? zw!s@5i3he>-#gSYmnOk(nyS;e;^m1;mYH8Yc>j?k-#K(YRw&eY)Y;EFX~`9*Mv%9sV|zs^fP*F2HwQlt5Bot9%U9IcU_2ZvqbRX88^ zz3R=Z0PMNVOJ4$K^8E)hnWeloYtZJ3u~%gZ;RG$m1#tJHiN1iTu$))n^foqFXEM?MvGzJYA^j_Fj>BG30$vO@AAsL1Lw&Z--XNNbnn5ra%yuyRxaQA z8{8Yv%-% z3uoVz=zTl2AJL}{zJr_8(D(3ww#q+E1(|&S&XL)FfPHJd8UF~DKH~Ae;67P*Bb=f^ z`~+vqC;pB9`Eu3JCNieUV}F5rWR+jxBJGa|^F`XyJG56ZyRAxswU!9p>GECLXBH$d&Y-hMY zWp;tXWFhm>u3k+n5)S05!U#m9X0{tVpi%qbG74mBH8M2KEx4XkRTADrJ6j?C} zE|(vSf>V`lZWLBF1t%Hs?S+U`kco!Nw0?WT6{>9RwQba%9t~G2JqF&S-C^!FIx_FR zaJkwU3-`+pV&MVtIJoj&#sBe$DsM!-35L}{9K2BuI1zR<(EZ>FbubC8R{3~%vj${t z2v*8k2f&-u&Vi=9`bseIw@^+r87>m@S6zH*GFKwJQKL3@?W(ko4}sHFCK)bQY&aB- zm#-WKXQ<3nxK`Wya5xqR495Q>5Pb?DN5Y#m(iFHtjZTL*X%I)5@^YdXu&>s0*i^Vu z)c(^|}0rp=eB1-Fe0^F_bcOqP+3MawUGP}7^njrI@49A&$ z%w$jDe>Ey|DjX$e%!UiK6;Fd(Wr@?_=zt2HfvDAtb6~!~8Eo`S*jerIU*JZC+q2-! zT8>;eUvXjq9451$4HwIw7Q&lk#XQ3|cx?t2A!=nJbIW%?>v}F+t=Z?p5o&ZXoG-JV z2X9pQ^Wj>}z5p&znI&+YoNlQpuccWA7gj3%7a~eD(hJ~Xh1=zDkxaM3q>GE-P3m|h zoU7n-AzY#|7r{wdree5Bmb)0{q-inNqk->$(aq)gZ2b!?cuF!bP%58NAsnfrlObWK;+9r^>CG<*n@Dq_ICpusU=to zx60Iy!1eO*M`2&1H-SdDK-=;$c)cw2I9#Wl@`Q1sEIC~h9D9vd`AIlhj`s7f0E|YnmHms#-h0B%xoJp56z5v(B676u?I^w^%4qu0;)HU5J@BkSm{Z%;nRgXL1 z*f%_W4X#%C*WujPz4SL=pVHUEed0Ia2vh--XLH zgZJPH&1?hQAWQtsl+oRwfsX>1Mr|W8}7cLCcd+YrrB0-M!4>(SK@D&^@ zKj?!?<<(!CGD`mj-l&0o3+HGu{cydk`yCvi9rQiiAcqb76VWK~1H4IV|D&m(_4^mx zq4bS#q-OsU?5y=B@Nc+5o&5}N(ttL>Rhs=TaFQnZt0~{4`2Qb7wYJ=5c!T`lH#lCi z{2iXAc<^77E(;k?tyTxa-~^?cyRMrx2=l#{6xHQ+i!bZ}Z_wexS^p$e*pZA%Im=G4 zqqU5H8?}}@!^xU~xxpW$GP}aQhrCA3mu8aH<_I`iWp;xzwDx|u(OApGe+N;ejz_}2 zo4tm1haH)E55o#R=1VqF;!$v+9MgQ+rcu#wFStnQ(QugBG#|q#R{B10ph*=*BWh&E z7`RqE1`bn1GvD6Hm2;V|W>#y^v2dnlHXe@Aj3>a+8fY9`p>1rw<$i4%XAqWt9DA^5?S;L zI89D^B^(*h=&nYDJ>)rBIozamy#}t)HoF#%(=4xp)74M~T&b;fGhC=y-U-LZa^}l& z?HaWC+4J^Cy{EH*LPV*y-vw}yDw~fd)ycdo;COX>A)KbQya=w<;4XzrHOmsXMH9FT zu2Y!+T&01ohSy)M_+O4F(;%*aBV>td;dFIY0Z-Es+yJL2PTUB$%F%9u>ow?`;mS9> z3zIdbyy{lLF^Ubh?7;d@d&Mhc9u{@Taa=e<=B1$rP`6aVV4d_0&N=|n_>~wf# z9)LTv#`SQv0?~tTy2?BR*K0W*h6C$Wp#jmL8LWl76|EkDv(&M9d{(A4ehhBa8b1!# zYoJfSJ*wLTx2cTz-QHYH>?ye1YbW4qMx+^2F!2_+Pv(6Z-Y9+su71^<<+HG(h}H_1 ztK;Y3Yz@@>ft3vT%?ogYe4-8RQTZ3)>eq???2O=pz#gsT%VadFP&*u_eY_4%Qamu9 zqm0#(y=uzKavg@%nfX&J@oMLFI8_e&2J9&4tv6euMGo>N9Hor6;ArvNaI!k?H0fH) zcVJ(mw~zk@H);a!!?kO8!wK5=AHy*k z&?j)L_*1x3KGXxpDg84zM-FH{wHl=*GoM(E)0@}c9fiA1CO2z+x+vPZ4!R3k# zeQ=u0_%)oP_5KEq)7JVH&Q*FpTp@@34o=c!zK5HF%f$ZsCn8-AH~@EP&3=IE<*`4) zWg6VS;0%>Fe~u?oOYjq1sk%SI8)TJDaJ&X*zN4HgtNaRA2egm>gJ_ZC{06tmCw_-( zROY{Mxd!12<20&LTz4|zK-up=T)89TwrGEoHF zrpo3o230F=?*g}Kpu3tf3cZnVg96J4xK9Jx4X)G@_~9t|mIFuMsQ5n;5hDlL9WH#; z+m`0nyxL@mC^%nRZWLT0pV$*lmrv{k*Jz;8aJwe3H(aUm`@prb=;$!kKVBXiLq@+w zJqGU5`t1w%X=|B3$5f?;V&PhKHV%%}pvS|}@`(v>hXxS`52*c#aJOmS#Q*&e)oOGS zT&G6k;m)hQb=n`Uk{J(x2eiKrH03oL^W)3);>mD=CN>4`&~8eE+qGoor_%%NGVejA zg1q!#xJ5HQ1n!X~lHp9H9}2J6+43+rNp;Q7AZ^qvr@_8p%BR9j*LxP43Ad=s(QurWU>2O95S|8iX!f(=q?>j9 zKL?SeM(4tvnwj~CXNN3gKHj-rW;8#ZQ7C6T4$f1+F+cj0uWdOGZqrVg4`*KE4fJ@! ziXWK)M2bvw0^FeWI}vWt%*=;NQe=rNxL3<@GMucLodR!=ubc|!Ye3oXdO6@}aIKc$ zbU3j;SCMoe9@yIsRhOWr?%kSZ&u_I9~B%0oLi$STX= z&Y)G;e}#xtEx`q*f*M*5Z_waYz{&FPBDhXwTnSIp5?p9lWiEmn6%C8w>?gdnzZlLD zUjlarG=obKX&OWcoT~M{3@+5DFNagqnem$XqT7X0B_RXy%Da}+E>C2YV;;JU5(xhN2%jAaJ0Azu2&Gd1#Z%M-wIdi1m?nB z_WHjX(V;=y25;6NZihE$?eBoIVu5qDV9N0#4WZ^}_8k-Is8R8vO^{pc#AxCu;(Iri^C%HJl?K`UdXOHvSf# zrh)dG_@5=u{Em!9HTpf=W3~soNEcYASs`TICZVmdsaFhJW z7tR*dAcn!c0nKtaB2}i_0q)R_2!l)HfZ=eHEVLsWC!a7ss?sN)Fu$kVquK8aw`%Qo zf!oBp!qa4}KqMkXCLIB%YK?b;^JED>+^-HCI9KaB5-!!?_;oyAiw3ucVa+%S?$abk z!TsVr;rNGi{l6C?O|v&Y3DYfS*&8m>66^z~Xw;+Ojat_jxK$mGfqPVUU${(z8*9pF zK(TPGmU3J;>tC)yeDTMZuNj*^o4H;~5C^xZgNbmRD(?q(s>~#KlLizI_h{|+hwD}T z0Jv9!I}qMr&IKm^Cm_0XVldwUYLgS0PYUH4yf=x6P&@668>a!)fw^Bj9Xp(Iepo%_aq&rhPvhPSw&J1-Hx5 zX26*mXeykx*6V8~+~~Cv@EwgP)*73i`{~lC)8KRs!u&nj%`)#CI8B|Ip99KJnRK{A zmN*6;kfR+7XR6F`aF#d&PG76|KM#?js5Bo=6(0|GXf~N9T|4CjI7!wz5nit{C&5{o zaTc7efu0NxXa}7Fx5*h71Q6>r>a*b{nRg*vsddVOeb;%WTLf=ZL+8NVvevn9mCEPC zooaJ2T&e(d9-O8Lm`|1W5+{Q3zW|Y~Q7?fD6rq;FVd{7pT&)fY;Sw#`1#r3=T@Gi6 zSHK&!1VtuYmRJer$e%6@C;sP3Ttr5?Vn8w6DU)6d_i7hh0=LLQ=9iYbwQEY?9`R*x zN2O=2%i$bN%vd@@?U%ys!6jh-twN;8ldpg?HPS2LGMTOn&QkhSaDn2)YPd#Lsdb2$ zn#?_Ls|I>6oT-lg3ioL;b#P%o4c%ul6u0k(BOdo=@Bo~u!PUbZa-0X@b_Jz};PsmE z!*G^5Yk5dRI%R6Fm(8%@6^{(peTkg2=iB8~JzxJLu}2rgFo-{B21dpF!G&;J`*q^!g9pT4 z!zn8B4P2~c`WBA#9GuVpA$(7I-u@ljtIocM`_Ubl(N#%cn^R-3)ZOYsD|FbD1KiC9^X+Xcgxw6Es@Otfz-{5R@_B&jnnf(_oRb;H) z10T{d-2-owRqlmzZ9E7dI@M?$+^5;!2d8NU_rtyNg9qR|d38P9uksJV`AUDtl+mCc zhSSwf16-goYvD}{C>Z}AK}22WEy1I3p$av^Wtz=naF0$lkHe*!@e^>nwrCUFA$}4r zSKX)JJk7Wn9?-J3>_PnBEVDmtG86-zfh$z`S$Kmi)C&8myn#LkZ_)|odALs&dI8?3 z4%$o^@r!V+LiJ1V=3qMe?`6b#h1GW0=XxEigR`|?Ux7PS=2duuxC1WHwtNi^Q{C6$ z9Qnr^hSkn`xK4w36D|#?@>_`YGTqy7mpbT#Bjk+lz`1JlUASHiy$5fUtopWSI=6Xz&+~hQ@Bta z^uS>%^BEke$$Snwk1PIvf!L%O^uqmG%P-+*Ip#m$at-1uxL2L^!9^PA*M{Z1-@u#Y zAK$_Q+9~~Tx3=YXd$9gR8tM0Bgvq)730Eqf55N&h{{gO2`j2p@mh4}qjApqJE|7(O zf~!@26TCs?e}QAn#7zAE6_Kko`wu*z*>8rsRN*%`Le5pn_YQ_^5-yfWZ-VnQ(3{~tEx{T%Q+`ur z%E(D?fs19`Tj5Aq(S=LA^nkA#Q6m%G26t(%-wyYygFD~?#qAonTUNOf&bq~Oz`NiQ z4fJk!v;3(RE|!1X18+IblEJ?ag#0p6@ZtPLO{wXToAz1Mq%9)+{jK_lEFk9`cT&@Ol!&Q}Ld zz>dt@1ea;hPr@7JPfx+V`@Qy?;ViC{g7LovQK?3sh6`otXAH}epM$%#G|$61n(+&8 zuK40HERzOw8C<4w#0{{cNt*8=M#)0M_9gy@$t=Uk7|?p}UT?vd78lpIA0#V8(bty_~AM=>X}&7_F$Rv7dH03OgZ7t4wVz@?hNfpA2F;(r37KxUr|hsmT<;9^-Q5sp;HNpOUG;vkbQ zJ{T@kJBPqAvP3f6Bj-I7uF%8|+n4pPUG14-s;Qt^PJ=heT!)*=3OGl=1De^9aMa^o z-4wV$%P}3!)|-%{;0QVR48xjODjaFjP5hsU*sRWuhRbB4S#Ym9PJ67ad03;TOtDyt=Y_jOSES5;ZpJOuOt?_H<}Yx++B^#`(`0ht&UM6p^ZB0zh_=@}J{yixqYL3E4I&TjzuueuA~;&< z=fLIKuIIv)x^T^hE0n$%9#Gx$;4)d|`~ad#6$;>Zb-V(In0EMOEw0w`lku{3{ParmHHcfDxJoZVrK^;5=m#T6zT%&bu zfy-r~r{Or6{TaAI>CeKx2fabG!bKX~b0+?8lBu63qf!-KfO9qbHaJX`UxZt=mM_88 zT8@|DNcl}WoFt2`gNx<)ufTa~^Hn&;Sj)u!4n(X>^cq~HLA(xE%hYecQHtT~;Rp@r zO;cX$`WBq84&H_vWw}ncK7yWOEiP`;Q^KT0It#O zyWluY;6pfC1N{iDR&e_}+@#&n4cB<-0pG`nS{3>Pj+GOAY6@xgJ#e*V`59cO*?bO{ zXaZlrr5b22T%+<|!twH_f57G1#$Um8_YnWhL&iQtf}+*eaGVD54IHD{d<)lWp#5-} zobfw2Np-)6eK&Y*{u8d&QVzgH8uSlvyqxq$6Alw3{sq^l!bZ4O=KTpSR^@-2bd~uT zF4rJ7!DX8LFQ$xk$FGKEiT}VcTGq{Q5`ili|9?Xy$V9)x@tXaA;V{j{`~`tnSz;I* zq4eQ!vSz=7VMW6*xI%*qhnwV#JHknt@J?g7{;$(WBglx==yryusnK2FI$2^@I8K9z zgzJ?)!jxCXyTO&}*bmprha7mLoOdJ~7wjv*udyJKHKIM>7L7Ctb`%Xq!F4iYG+d<) z_J*s)`Kae5wIf% zJQ8kGnH0EEv!4!6Q^!ZaDe{jQri`qZIyQi}%jss4(WKEG4X3KYEVxRIrom}SpAARK zD(P^FIy(k#(>dZ;xI&gV4sKEV8E};uL;xR{hltW_PJk0Mpp)QKHF`2!t}EA5;Uq1= zX>hd$cLv<9j?aYCRQD{nR8cY)j#sE&00-i9W>&aHE#>e7N0PvVgAuv0jZXfjhL8OHBoJybP|;Hdp^04&movCv{J#N_B&WO4R8Ys2aEkokCOBD6cQf26v#)_G zG|MVDTAkej$IG{Fg&P!zT)18#zuLtA6q)@tG7?nbcDO|*x&v-hL~qg`_s z9H-^D8;(_aEj&$wz6WlXweE$(g3A%$1~wvEGp>W<@AuZ}J~%;qKb)k&JplJ;5cP1K zO#L9-p$;B`qqRF8h8r~F1~^%kUJF;+>;Fd(O`7GSaLJ9{AR6I#&FnEaQ|tExT&glH zaD`&S({Ppi;~6+c6MNRMmZlZ1*A@*tk4V=I;g{hS4Wa{%kjK6Tx5>F)hm&QAH{c{$ zXgwUO4m#m_S>+wLTH&?}u9B~O2shl4=>7iBM~E5~`a7JgMtk5mt>tHMs+{plxK2Bw z4_+^`e+@@!(BHr*TKjL|TD9K~$I2@IGVwoE4!DVocFpn^I7aLDE8MZ#TaN$030jWL zaHl%nZyX(TcyHehfa72H_&}2`J{V3?-T82`;Q(&GmN3?3o6~NQ9#!KLOnR+RlpoW&g zX=_GY+S+yb}B zT2I628qhOvhWJ@HMV+<6adNunOuDT5d;pOu@q)?FEZa=FD!&LP%O_rfb2QMG;q`LN zcDP*wS_e02_OHNo^88ofXj!)d?x1`y{=bH(&^o;i$7`f-z!`F)^>BaDyhW6Wl9{M!-30C$KZ3Qft2poTi3$gc|m#s4V8CRG>(x2VxQ;W|~=3r?0vqv2LL(cW-^ zmSZ1ynoK7 zI5<=7OoVIH@qX}TO>B}Wqd~;OwPu-2{NEqZt+;&voGy<&5bjb332=rkr6neYa+a{}BZOP>h0i%$w5dNsN%IQ>yC$eaxKX}_KVXKR+H!u48?Y`8&u8l0mE zoDQdJY0iK%)MgIcBR@M6E@aTb`2QC~giL)FoGs7Kg>!YXSpc`oq-VofGUGy1UdxvU zcgtZH!I|p#9Jo;fJr~Z<;PMlQ|9zVMVlp~pmh<2)neKczPlG5hm9+#*;2aHfsbN`Y z8QdaAE`;N>JC?(B+8rz4{9v2xzm+12 zUrTl+oTb^9!A0_qtKfFkT@6PDWcI5ONphTWxJ8{^1LtaH*TVIh!F6!FW>x|B$n4j{ z4Jva3oTH_=5w6zxq7qKkgabF3LfSSrn+$pN8n{=DR>9et%`I@6D&GnxYtSy-ucfSp z8#RdA;3o0yaJuT=0Vmn}|22sA3eWTJgtO&bcfkWP>D_Rj22=~@sLVZZf-G?_yk0)^ zS2$C?QU^P-^nGxa((gC%f4$c40Wzj(HuZ47I(rcA(3(92C+lSMFx;wTYJfY{@mf<} zlX(OlkX0Uqr>SluoNKIZ;{Ria44LI|I7%aZ0`Ap*ZG!v6Pr@5zm8akV4YV0 zDeCNLxLdpF88}bN{VW_vlIdCz{p#R3I7_?WdALQp;03rx4Yk2->g+{0SB~})yio&s z8Sa#I+f5lQ**ZASD%h*2BfxW^cmL zvf^9tMlHeHaJ~lG3AfwNf4+kl(CpuZb2Om$;PqPj4RD^e;@=Ew5bwkJO8)>((+=u_ zbJfm=@Fp$UM{t%V_IDFlHmc)pI9-)Lh8uP5_6eM=3ZKF`vP2KutL69%&XajRhdZ=1 zU%(k^^ILem9J3!z!P$fH|2sskP9ERG1)9x|aE*e-zu@(1)chf(PFZCb+@k$G9B!4b z>;Pw~<1jc&91f>ym+d&2_`gYOvlAI@svH65%S(5L^E9|!-~z4Ru7*`6(v(-35paq8 zU^h5Nmh;1fs_PgIPLlmM649=XcQ+YobPqUJrjCLO)WImYPiEf}-k^QI7u+gKM8ie0 z;@)tF+TRD>wAu@Fqv7=dWyB!*)#w;FSG!V&P5ln{lSRW;q@nP&*Ug zRK|p9vRg_D93{N}mN6DLu`U*Pv&cG7oyQ zoC7B-#>_S8Dw7TuSLyoy7(|Tr>#=b48{X}c<4mDfJ;4HR(+jxzlpz1-bk~^D3#-!47V$=oC3$G!m02EEkQP1pxK;eSTjBy zE|L$O0oQ4uIq+sV`kMlb zRKNw|>){B^{suTrJK{#T%nf)WszelP&2EBI)bY)5sm!$o4wI>?;0BrZ7PwD?z7=lO z>|MA(JEa;fQTw;SU5XjE2N3yM`#az;nSJ~Nj9N3E02j&8;^0W7PlWr`@qTc+;>0Al zKszNKc2s_UxI{bR0JyV4@&7 z`OR5yl*;77MT$2I;7V8V|7=9D)@dQ!exo};18|4duO7~p=^liOw09qZbCmutT%y@Gz|oI+ zZLWoLRpt>mSv#l^cI2dw8ApiFEFXv0tK%o&0gbc?F40;(3D;|8Pnq)Cip_AII%|PT zRsLysquO}}&eD=S3zx86gV+D9hz@PJ=ip+^@_D#dj`;#yE~jgQE5t9t4f2VX;1bn+ z8TPI5EYS{^DmJWxV`QOMO#Cm?dcR6WpE~P+%a#5b9Hxd|hqJZzop5xM*TFk*sXBfi zj#URAz@4&C7u+DreF&EYEyVu&2@xYF`ZpY*&Q5w5XVHKP;TUyx0o*5tS`Jrepex`F z>Z}OPmZ?|5z1l$+!ljBC7r|Zj`EN0zPlYZvg%k}hfg3gIOW}T%DKV@;Tm}zlpqInl z8bkmtQ)i`cliFDYM{1IRD-e~M!If~VEKvq;lH*(j_o&g;aH+igYPd-IyWFtC?KSX5 z4d`09SY@t*^W~%!aM^>3|JNf1G@BdX9GUJ$xJ9F`gmaaC6I`iya5G$>M%TcOW>#g& z$VqR3t2D`54XdvEFzer`Emv(aRN*$bRUO|B$H^*pz?}U40p}XKBrQZ#g z$uVo;YIS@MTw<(Z;{UyfVwvu*@Oo{f(x;_VQmcu>|Z6dYnf(C6 z8t8#=kJ?Fqd&QFjh$xM23S6PBl?X>GJqeBx9|RZ55(mT8a@a%QaxG0V+@~v?L*WXg z9|m{HZ>GYP^c9T%(-0+cz{BBEndk_(NS)1ui^WI7-D+qSTr1~FgEwj4&xU=Ec-EZ* z*JzpM!f{&e^#2n7!&K-PGTOA|j)ngpU+)7~`IJBYUo?bJgxC;5h-nBRgb+dq?e6Su zm?4A^Vuu?-2q9YtA%qY@2qA_j#7BWLOTS`GVF)K%RKlnIN!Bp@RXrG9BwpaN5Io_^YK{h zNQ5PNRt~ot(xc!i^L;ej_;BRSG4QO#RRPz#_Lp$7&ipFqSWmH}6=EHFzXH6>`4!>m z#P5Gt31O+8CBX%HFb{6>3atz`8;Mom9K)Cl$F7WwTNQ55pw-}6_go#WH^nJ%qdM_5 z5SFR5CfuZ#Yr)NODxB+KX>fy$Xl=OK2(1G*I-d?V8R~U|zV);oTxefeAI`qP{-1%+ zVc0i-Tf7Au!p&~<3wY4_$b@I+^2c}Z!kvb9cDviT)zF>c*aMLRyTI{e7Z-#D zZn`U+?mN`o;39LjJG|7e7s5$yvgYdHiD%df#X8uU7xZ*<>)v)yMniTclaDDwWzu)qgz!ON`n zx8a!oTzUlV)VO!x4kPg{+~r+=FR=Y!4DPiKK7yNlCHxpJo-1nZ-zNy&E*^(d&GDyj zn>XUKpyQqX93Iij2{>K-FW^{nHQXLo=^KP0EBsqH*GNpk z!_I#P7Z}Dr!Yz99J)CV6r{N|W+MnPY=YN1>{u|Rj!-b|hK7&x={r(Z|G^Brlb6xyb zxXr_s!i5^~H@MyTzr#h&{{zl*?JPW^1OE*AM)Y6s^u6}~e>3` zn_dX#nVLA4SR= z=~Hm2SN9os-1POsc~*FR3VRy4ivnxV#c(Ej&h`IG5IU{)1~}h?FNM3b`Z74f3cnm4 zGwh9Urxkt$JfH(t!reM{72M}dX@a{v>*^Hhe?qIT;X$vtxi&2J;AS|dKxh5{7s{=0+uZHo{E*rffVu2~ zr`_~Ecu)uKhr3M818{)_-VOI^X#7EhCM|sk&bM$LhRb@R@b2Zo~K<+#`>|!hs;L;o7k#H|UnUUy%GhKWi+;df=b3fcGKL8geu2ax4ybr?pI`dG_ zx34@54_nAR@IsAvB#zMR^?MW^(#yx-SyRvp_v^vqaI&v#PrxbilW>REtPk$f(5K)^ z4|^J3BtHWeVCY=`??))q>Sy6By?+iK)}ZI%0gV`d`#sc7{}y~=|sts8<%eMx-{E>7HaIM>B*z{82V4v)xh!ey>~3(nNIx8d=Y zD3v4d#2j<~-a$z5n!O8;=<$2-fL@M` zR6{?3`{VZW@gR83K7|Jj^=ELZ#(fS~8=<1pIM|Tx4X3NKPhgGP7cQ|#i{Vin*bh#z z2gLVBC^uXOz{@PU61e}GC|n1^sV+DO9@4mj;c2gHDLiR-4}tqk>!EO&-X8`J8qqR% zAo1^i4@Vd?EJwf#4e60V$*7dW{cd^`TxhF48qPAu$G{7XN(DTlaleEIjP$SIO85Wu zX`%n?%|afGYs7EhK^OcMPS^Y2!JS^SO1RwD^Q)DR>)=#4)3v9;#qNJPyh!hB;P|wM zoqE(rCfprjvD-3&#uR(3Gd#(UyY21o%zk99(FH}DXE;d^8;H4e$sKQr9 zXmg`g;2{r7hAYhLs&KctUkxsCqt)RF>m~(WsQwyoq0X!cXPJ(*;C9bSjU!aLAPufI z)N6-%tzHK%GmPnQiMd=C9*V*kTMwQwmFvTUrX~Z2w-VCnMna$yTb+X|Oz2D+H>VH@dw&X#% zUTy{FXiyHk(8Amr9`U+v1IPTe3fsb28k!4d%iF?OMfHZ{A!b&2nP**z>UH-&JH z2k!xo7@--J zEq&b&9?FZIKqm^nM|%s#Ik`1$>$Lf6wC}PY#`li#?|$<5&8RC3uC?vY+W%giU!IZB ze)8(A({@~O!@39a_*Fr9v4{EdK7VE}njiZ!F~QU}3H8<&^3rx+H+!!I;Rm6kO&Ry1 z9@ARiIU;p_eC`~k4r6Nlm10-^=UwA@lnee>Nd} z^Ec1qKTm|O|Ki`H4@$g4XNu(++CQ*g0*DHM;g* z5Gzj@)cVMdX}?<|eV+xf!+)OIC_n9YY4yub@#xR3o93q-y7q}@o_==CG|x(ZR{v8_ zFWYyy9eDJ&)*tiJj%a;&r?fTF`gvB7P-mPCTkX@j*3M}gq~#X>pX-ua@7Ou*;0=yD zuXb_P@zuwkbrvlal|vKDTW{St?bm6s{g#{J(VEe!IpYwkczj@D1!LOW^TE$bd-@UZjD7q_c=na(r`kg$H269nd{5W0qv5Hme0OpTLahgcOg3oH zFX35V1bzjN`tIadxK3}53+&qC;WCX|1ULEiYB9V-o$xX+?R)eS!$lf%(<->rbesfd zXz9st(iKs7Pl02vMxIrJ6TZ})3YR6`jl#<``gC|wofX#auGNN0Sv z@d6J5nAf1U;c`Pg64*C?@4$;J#&_XHi|#$R(xM&>^VZh;@MK)iK0rt^ zbYpOfq5cS7YJ@(98#L|{xXTob!;>2NDLipql!DLTHuw1)Zt~y>c+5!0zd#sQ_!4e+ z!B=p%Ih%wh-Slg?(far%=xD^ZaF6;^aD&nM4lXe4e}t=y(D!gf;?v1#geedB6Wr@Y zKfp6yl|P3ChJ6NJXxM**V-H3i{{^h~ecE5)DWkg-F4Ty>!4=lT-@^-Or5nxipumd# zCp=+P{sq^1JN^wPo2F%Owch*(UgSRi4La7-Pw=#kh5rJb;`|D5=3^Mm`LPudvTVI8 z!DIf_i2r04TV&zz9~@%Y>Z}Y`dDtp&k)9>P3-xSOxLTdn;3OloIy|XkeB>94SGr&g zgcLnn6Q0rPwcuh8NQIlM>NI$%?RIT=p{ZF1E;NeiaHDmwE?ngNdT?{}x0rZreS{R7 z3?IM58qD7YaFdHSgqM1!e*rf;p9#-;J2rw-4e!Qqqx)H6LE8)jPl~-s2tN5_R(7Mtj3faE`UIGhC|9E^vp}dsjG%0-WpryCF>3Kz4_h zX=x$cxjQh3Ha4}sfFP57HZvndOIYnYyMfcsa5kZxWN zhsV8sN5CyEI1+9%?B#H-;XMk@4)+*mkLG{c)j0-Ew-_tn8n5Cn;eI3WD>x&r(ytLZ z^mrj0^Jg=D1E*dV9q?PY$9DTWc$w*_gsbcm$HGa5{W!SJdO9ASHHwP@UlZ*aUyRUU zh)#fK%ZQTxHl#hL@^;3f!Uh)o`^sr^1~U-DyGJ)SM32H2c#DH3&%nKkl{TMq;3evu3+I`pI=I)!od?fq#QCBBrW@Yh^PtSD zvIK6|`wQUMy-~O>gfpy_aCItPiQdW7!vp5^BDh{7E{2m#fQE7meg%pJTe`yf( z<}!HDjV_1lT+j$7TlrVOnbysffi>tVxKA&eg1$Zf8hDWrx)z?Wz?EfL!SFs6*wpmHjm|$C<}JqO;Z7ql2oJnW|6dV4tt z3=hKmt8m7v5f8yxZ$$hW+@}8PaOLaK{2Or0`C)iUeiKgi7Q6+g*h}6H{lC-ZGs1%r zL-Y>ZrKRt}je77N+@xotaJP|oKj`TF2XLwfd>HhdAA>tB@Q>ikx#)8LK1Qf81)snJ z=5-vNv7kPMtF4dE;AAWLbGXY*C*Tyl`~vQF{!6%7qrZYnd^a@-*TlP`e1DCQYoUDu zXIlr~!dceA6kKmre;0I||0BFqL%)X?>dZ9UWpw`pCwqf_fV(Z&_@5Da6n=zf&HZ1( z0`vD*c*yysaEjjl4NiS9a^UZ9w}<@$p4FgPxJB>(3FqnLzk+^m;-}LP+Preh;8E+~ zKX8s-{ueH=AN&;NjZmo6HV;?<&UJo8c$r451Q)tC2~N574&G#=X$VTl%n&ngQHZw}mG zwQn8f4e2&;t~IeOoaJHRbI&4kyd9iwn-XLxYXHm(x5)ASt(r+DuVf^#(JU^s&ah1Z{0DMGrN9s<|t z{h{!Xn;sSxs8a^_dm|2qoAl-gxX?5m3HMoB<#3VnN5hM(p<`C0|ECzbU-F>G6#N>l zQfVQaVG1hY0S`VF?l70f!&yddF+8Zw32?H-TLo9U=Sgt?Ty(jACnMxpP^Z9|dRYzU z8m`mfe09!%2TaYGaI@Zr&#^O2(*JA8uxp+UN4uxeL8Rf+^J3+Zqd-o;Ni>d|BVO@8gT`jY$UFP zOFXOzE-(exz=igSYvFzi?K-$iqpydX--zCr+z|9#+X83W8*W^Q{1?0uDgA*5Ll#ae zTxxjR;9kRZ6FeZ_4Ci>jEpV4tt{pCN&s*W%8=|z{24|U$+k;LpDD?jhgpAiCBkq7> zF1`z{e=VBtgv&JOZn(vwy9Z7kigfOUhs<#oTwx=+4=z#Xez?nYJOIasUC@ottp^Xn z<94fu;BpUs7;Z4fkHG!r_))k^Lmz`DT-yr|sPi~nsbf#TjnO{*>qLa&5DFacgNF_8 zQ}CGlG~D)T%9Iiy41@b1G?t{1B z4Eb$1--AcOyt#Y_o-{)5!#z6i0bHiehj6c5bqwy4KZ0{`Y_9)*j8Nyj{{&98DUHLq z-uqACObz-B&XPZeN35XJPR_-h{2%iq9*7S6YD zqrG7YE;fwc!3)jzAK`4T*7tCw^V4vX1^XvBPiKCBd*{-`{rfXQi3Koq*rc5ILGj=1oxZoBsj~iHxEv^Ke}=8l@YRiunL@Sh?3y}7q1Gp z*|%4N`!#g+pkwPzfxB%iYrs<)v?kna3f6+tt*ulz<68TF8bYQ8vNl}vYIH5vfd`C4 zI$Y(ITNiG!Cf0*XtcmsEb`8yd2X$ZrxLN%T;SMAEizM=&W5s6jU|Op;g2&9?#_*I^ zYZJJ|jk4el58D*Z(&)|LW!A*z@Q_Ai!!z!`1w0=15B+~jgf=(b3hs2%9C+mNC{J6% zErxL$c*gs^ZP3@7T)0c#4$jrF?cpJB(|mZ)l;y$kLBqQsEU-#LaF&HgxmCT54gatw!A;#qf~c?+52y@8>`JBb2-80q}^Pm4pRG=sVsXzRlvg*;4k40Q}8P|qsRXLYlK{z#=@|`5d8*jHyytX^G4!# zaF*A#63(%I91D-Q_PD^_h~wcgc@f;BlZ%t+|08aC0uRa!%Zc!)8&$z0hW#XXO7BmG z$J99m&ho8yHJqzKr^4A9dKz49R8EIS=Ay#=t3fC-1!sf>ZgeI*s&Qw*`Br!>+-Vrk zh6_x=If2zV7w)ke*1;8zMY%r@UMQark0*XQ?e_@98nFZ}GT#@#HClZkT@LuwEI9D$_;4<~^fV0%OGxYy*AKb-*VU6g7`@Md5!`Uvl2hOvt-V2u+(k{4C zBkqGM-1B}o_Go0#1MrCZcf;f1x`zJ$AVRfG;~{vF8$Aqn8^#{E&oDj$7g}hK!u`%a z23NVZ7w$1-kHcje`UG5L4Lu3RC%i&^2%~nrr{HqC)zk2Rk$48qGo<}+i@AI@%-cVn zgNr@jc{s<&4ZvgGrWfGOsJ7y<7ZCo*9G+PPka7aG!6;4$Z4h4W3v5L~VI zufe(Q^Ey0Wgx(1A8Z-=7Tw(uz6Cuw9Z^1o={cX6;Yc>M+dZ*uk^Nqy2aE%AQ7v|k( z6fTh8hx0u61GvkZ^BTA#p^rfeLZzA`GVPvLx1@EKfS zR6d9MG;v!s8ayU*LSh``0jU zeJq7%jL_fUMMm`RaNV54+`oSy^m84&slNh&9tqu2S+&Y2vI31qS z$#vmrc|ADie&7GEk5H`l8SuEpvH@Ic3O0lbwfYzEQuCS#_j~Y0@PunOh8r|)lc1wP zS#XD`+;krKZ&YbB9#rY^=J2p7$c6_zU<TCtiYETY5VeYqvyVTzXp47N) z;nDC~5c+>E!k8}%+ra}C(f06!6+R!HbkhZJsaJFdcu@Tv;VBQuhetJTr!eo@o#7@O z-UW^)JsMrJ0)$)(YFD_}I@k@a@QUsZck4|dT;RRm11>T(d%}Yj+Fo#(h8Dra4@PJ0 z4fjO*@Y_ic>df)J@R(K?!zCKAAH2-)?hhAx*a2{6|Bp(J3=}lRf_of^U=NYXd;9+%+gv<4~94^t&qu?2D(9!UK#dvHS zVOXn=gL@6{@o=+wS_H?gibA&-Ug}0Cz~e^iM7Tx$DtN>_PlD@hP$$F1I&ca+NuQYO z|J4W;T74>9ZHGDyPV(T>;WiJbftQ%FGvE?8JrgdK&w`hlg4!@|B+iBxT2JT9qyJYb zoXdj}dq5pLVo1+}C%pyd!+l2R_wcy4Cj6_43Hbtes5y$(h44Zh3z05$|9W_EE(P4b zix3K}hAEszI_jz{AlFCy>OAnb-_ax&VBHpP3eAkSdSlo%RQ_cF1C;#gp*C>LvV@n@rQ$w z2lT*0Zu&@2a{f_xTB{#}8;wdYJmSHR!xcv833$}>JsH?y>xTynq3USMgoA$*8;sPup%s;TidTxXgV%fR~1IL;wE}q0~^1!L?fY z5j>$mAH#Lde*%vh_HlU9%KsFu@}>DRINt{KIlNG#C*W}%`vQ(H(}OP&$_)EgVS%}v zgeP3^H9X~E-@pYP@GU&;3(pihBYy`Ms`E#<&NO`wr$hzL&;KFB9*?U1Pw=FN{QysU z*q`BQJ)41-8qy!(G9&jFxLp1#T;#z^;aT z7d-6k_zzs+VgH4f=-E$jy`8aR9csul-2pE(DtE$_iGC1A7;)21cuMc@hKu#!9(d9^ zxEEezRd>PD>fZ-fIe&l9(dY-@68GtbtJQfBp2eWK{{Ij{`c+X19)@dF>VX^d<`H