diff --git a/avm-transpiler/src/transpile.rs b/avm-transpiler/src/transpile.rs index b1dadccad57..8eda50b6082 100644 --- a/avm-transpiler/src/transpile.rs +++ b/avm-transpiler/src/transpile.rs @@ -37,6 +37,9 @@ pub fn brillig_to_avm(brillig: &Brillig) -> Vec { BinaryFieldOp::Mul => AvmOpcode::MUL, BinaryFieldOp::Div => AvmOpcode::FDIV, BinaryFieldOp::Equals => AvmOpcode::EQ, + BinaryFieldOp::LessThan => AvmOpcode::LT, + BinaryFieldOp::LessThanEquals => AvmOpcode::LTE, + BinaryFieldOp::IntegerDiv => AvmOpcode::DIV, }; avm_instrs.push(AvmInstruction { opcode: avm_opcode, diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp index 2c6bea75698..f72a3b2e724 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp @@ -31,13 +31,31 @@ struct BinaryFieldOp { static Div bincodeDeserialize(std::vector); }; + struct IntegerDiv { + friend bool operator==(const IntegerDiv&, const IntegerDiv&); + std::vector bincodeSerialize() const; + static IntegerDiv bincodeDeserialize(std::vector); + }; + struct Equals { friend bool operator==(const Equals&, const Equals&); std::vector bincodeSerialize() const; static Equals bincodeDeserialize(std::vector); }; - std::variant value; + struct LessThan { + friend bool operator==(const LessThan&, const LessThan&); + std::vector bincodeSerialize() const; + static LessThan bincodeDeserialize(std::vector); + }; + + struct LessThanEquals { + friend bool operator==(const LessThanEquals&, const LessThanEquals&); + std::vector bincodeSerialize() const; + static LessThanEquals bincodeDeserialize(std::vector); + }; + + std::variant value; friend bool operator==(const BinaryFieldOp&, const BinaryFieldOp&); std::vector bincodeSerialize() const; @@ -1418,6 +1436,47 @@ Circuit::BinaryFieldOp::Div serde::Deserializable:: namespace Circuit { +inline bool operator==(const BinaryFieldOp::IntegerDiv& lhs, const BinaryFieldOp::IntegerDiv& rhs) +{ + return true; +} + +inline std::vector BinaryFieldOp::IntegerDiv::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryFieldOp::IntegerDiv BinaryFieldOp::IntegerDiv::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryFieldOp::IntegerDiv& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryFieldOp::IntegerDiv serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BinaryFieldOp::IntegerDiv obj; + return obj; +} + +namespace Circuit { + inline bool operator==(const BinaryFieldOp::Equals& lhs, const BinaryFieldOp::Equals& rhs) { return true; @@ -1459,6 +1518,88 @@ Circuit::BinaryFieldOp::Equals serde::Deserializable BinaryFieldOp::LessThan::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryFieldOp::LessThan BinaryFieldOp::LessThan::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryFieldOp::LessThan& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryFieldOp::LessThan serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BinaryFieldOp::LessThan obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryFieldOp::LessThanEquals& lhs, const BinaryFieldOp::LessThanEquals& rhs) +{ + return true; +} + +inline std::vector BinaryFieldOp::LessThanEquals::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryFieldOp::LessThanEquals BinaryFieldOp::LessThanEquals::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize( + const Circuit::BinaryFieldOp::LessThanEquals& obj, Serializer& serializer) +{} + +template <> +template +Circuit::BinaryFieldOp::LessThanEquals serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BinaryFieldOp::LessThanEquals obj; + return obj; +} + +namespace Circuit { + inline bool operator==(const BinaryIntOp& lhs, const BinaryIntOp& rhs) { if (!(lhs.value == rhs.value)) { diff --git a/noir/noir-repo/acvm-repo/acir/codegen/acir.cpp b/noir/noir-repo/acvm-repo/acir/codegen/acir.cpp index 0fc84d47a0f..6fdb62c5674 100644 --- a/noir/noir-repo/acvm-repo/acir/codegen/acir.cpp +++ b/noir/noir-repo/acvm-repo/acir/codegen/acir.cpp @@ -31,13 +31,31 @@ namespace Circuit { static Div bincodeDeserialize(std::vector); }; + struct IntegerDiv { + friend bool operator==(const IntegerDiv&, const IntegerDiv&); + std::vector bincodeSerialize() const; + static IntegerDiv bincodeDeserialize(std::vector); + }; + struct Equals { friend bool operator==(const Equals&, const Equals&); std::vector bincodeSerialize() const; static Equals bincodeDeserialize(std::vector); }; - std::variant value; + struct LessThan { + friend bool operator==(const LessThan&, const LessThan&); + std::vector bincodeSerialize() const; + static LessThan bincodeDeserialize(std::vector); + }; + + struct LessThanEquals { + friend bool operator==(const LessThanEquals&, const LessThanEquals&); + std::vector bincodeSerialize() const; + static LessThanEquals bincodeDeserialize(std::vector); + }; + + std::variant value; friend bool operator==(const BinaryFieldOp&, const BinaryFieldOp&); std::vector bincodeSerialize() const; @@ -1317,6 +1335,41 @@ Circuit::BinaryFieldOp::Div serde::Deserializable:: return obj; } +namespace Circuit { + + inline bool operator==(const BinaryFieldOp::IntegerDiv &lhs, const BinaryFieldOp::IntegerDiv &rhs) { + return true; + } + + inline std::vector BinaryFieldOp::IntegerDiv::bincodeSerialize() const { + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); + } + + inline BinaryFieldOp::IntegerDiv BinaryFieldOp::IntegerDiv::bincodeDeserialize(std::vector input) { + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw serde::deserialization_error("Some input bytes were not read"); + } + return value; + } + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryFieldOp::IntegerDiv &obj, Serializer &serializer) { +} + +template <> +template +Circuit::BinaryFieldOp::IntegerDiv serde::Deserializable::deserialize(Deserializer &deserializer) { + Circuit::BinaryFieldOp::IntegerDiv obj; + return obj; +} + namespace Circuit { inline bool operator==(const BinaryFieldOp::Equals &lhs, const BinaryFieldOp::Equals &rhs) { @@ -1352,6 +1405,76 @@ Circuit::BinaryFieldOp::Equals serde::Deserializable BinaryFieldOp::LessThan::bincodeSerialize() const { + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); + } + + inline BinaryFieldOp::LessThan BinaryFieldOp::LessThan::bincodeDeserialize(std::vector input) { + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw serde::deserialization_error("Some input bytes were not read"); + } + return value; + } + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryFieldOp::LessThan &obj, Serializer &serializer) { +} + +template <> +template +Circuit::BinaryFieldOp::LessThan serde::Deserializable::deserialize(Deserializer &deserializer) { + Circuit::BinaryFieldOp::LessThan obj; + return obj; +} + +namespace Circuit { + + inline bool operator==(const BinaryFieldOp::LessThanEquals &lhs, const BinaryFieldOp::LessThanEquals &rhs) { + return true; + } + + inline std::vector BinaryFieldOp::LessThanEquals::bincodeSerialize() const { + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); + } + + inline BinaryFieldOp::LessThanEquals BinaryFieldOp::LessThanEquals::bincodeDeserialize(std::vector input) { + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw serde::deserialization_error("Some input bytes were not read"); + } + return value; + } + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryFieldOp::LessThanEquals &obj, Serializer &serializer) { +} + +template <> +template +Circuit::BinaryFieldOp::LessThanEquals serde::Deserializable::deserialize(Deserializer &deserializer) { + Circuit::BinaryFieldOp::LessThanEquals obj; + return obj; +} + namespace Circuit { inline bool operator==(const BinaryIntOp &lhs, const BinaryIntOp &rhs) { diff --git a/noir/noir-repo/acvm-repo/brillig/src/opcodes.rs b/noir/noir-repo/acvm-repo/brillig/src/opcodes.rs index 51df1f90941..ad45c23ac35 100644 --- a/noir/noir-repo/acvm-repo/brillig/src/opcodes.rs +++ b/noir/noir-repo/acvm-repo/brillig/src/opcodes.rs @@ -180,9 +180,16 @@ pub enum BinaryFieldOp { Add, Sub, Mul, + /// Field division Div, + /// Integer division + IntegerDiv, /// (==) equal Equals, + /// (<) Field less than + LessThan, + /// (<=) field less or equal + LessThanEquals, } /// Binary fixed-length integer expressions diff --git a/noir/noir-repo/acvm-repo/brillig_vm/src/arithmetic.rs b/noir/noir-repo/acvm-repo/brillig_vm/src/arithmetic.rs index 9d7b6fe8f02..3b8e8b6589b 100644 --- a/noir/noir-repo/acvm-repo/brillig_vm/src/arithmetic.rs +++ b/noir/noir-repo/acvm-repo/brillig_vm/src/arithmetic.rs @@ -15,7 +15,16 @@ pub(crate) fn evaluate_binary_field_op( BinaryFieldOp::Sub => a - b, BinaryFieldOp::Mul => a * b, BinaryFieldOp::Div => a / b, + BinaryFieldOp::IntegerDiv => { + let a_big = BigUint::from_bytes_be(&a.to_be_bytes()); + let b_big = BigUint::from_bytes_be(&b.to_be_bytes()); + + let result = a_big / b_big; + FieldElement::from_be_bytes_reduce(&result.to_bytes_be()) + } BinaryFieldOp::Equals => (a == b).into(), + BinaryFieldOp::LessThan => (a < b).into(), + BinaryFieldOp::LessThanEquals => (a <= b).into(), } } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs index 911f4c1924e..7e07d6d15ed 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs @@ -16,7 +16,7 @@ use crate::ssa::ir::{ types::{NumericType, Type}, value::{Value, ValueId}, }; -use acvm::acir::brillig::{BinaryFieldOp, BinaryIntOp, MemoryAddress, ValueOrArray}; +use acvm::acir::brillig::{MemoryAddress, ValueOrArray}; use acvm::brillig_vm::brillig::HeapVector; use acvm::FieldElement; use fxhash::{FxHashMap as HashMap, FxHashSet as HashSet}; @@ -385,7 +385,7 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.mov_instruction(len_index, *size); self.brillig_context.usize_op_in_place( len_index, - BinaryIntOp::UnsignedDiv, + BrilligBinaryOp::UnsignedDiv, element_size, ); } else { @@ -641,14 +641,13 @@ impl<'block> BrilligBlock<'block> { ); // Check if lte max - let brillig_binary_op = BrilligBinaryOp::Integer(BinaryIntOp::LessThanEquals); let condition = SingleAddrVariable::new(self.brillig_context.allocate_register(), 1); self.brillig_context.binary_instruction( left, right, condition, - brillig_binary_op, + BrilligBinaryOp::LessThanEquals, ); self.brillig_context.constrain_instruction(condition, assert_message.clone()); @@ -663,7 +662,7 @@ impl<'block> BrilligBlock<'block> { | BrilligVariable::BrilligVector(BrilligVector { rc, .. }) => rc, _ => unreachable!("ICE: increment rc on non-array"), }; - self.brillig_context.usize_op_in_place(rc_register, BinaryIntOp::Add, 1); + self.brillig_context.usize_op_in_place(rc_register, BrilligBinaryOp::Add, 1); } _ => todo!("ICE: Instruction not supported {instruction:?}"), }; @@ -761,7 +760,7 @@ impl<'block> BrilligBlock<'block> { index_register.address, size_as_register.address, condition.address, - BinaryIntOp::LessThan, + BrilligBinaryOp::LessThan, ); self.brillig_context @@ -838,7 +837,7 @@ impl<'block> BrilligBlock<'block> { reference_count, one.address, condition, - BinaryIntOp::Equals, + BrilligBinaryOp::Equals, ); self.brillig_context.branch_instruction(condition, |ctx, cond| { if cond { @@ -964,7 +963,12 @@ impl<'block> BrilligBlock<'block> { self.convert_ssa_value(*arg, dfg) }); - self.update_slice_length(target_len.address, arguments[0], dfg, BinaryIntOp::Add); + self.update_slice_length( + target_len.address, + arguments[0], + dfg, + BrilligBinaryOp::Add, + ); self.slice_push_back_operation(target_vector, source_vector, &item_values); } @@ -990,7 +994,12 @@ impl<'block> BrilligBlock<'block> { self.convert_ssa_value(*arg, dfg) }); - self.update_slice_length(target_len.address, arguments[0], dfg, BinaryIntOp::Add); + self.update_slice_length( + target_len.address, + arguments[0], + dfg, + BrilligBinaryOp::Add, + ); self.slice_push_front_operation(target_vector, source_vector, &item_values); } @@ -1023,7 +1032,12 @@ impl<'block> BrilligBlock<'block> { ) }); - self.update_slice_length(target_len.address, arguments[0], dfg, BinaryIntOp::Sub); + self.update_slice_length( + target_len.address, + arguments[0], + dfg, + BrilligBinaryOp::Sub, + ); self.slice_pop_back_operation(target_vector, source_vector, &pop_variables); } @@ -1055,7 +1069,12 @@ impl<'block> BrilligBlock<'block> { ); let target_vector = target_variable.extract_vector(); - self.update_slice_length(target_len.address, arguments[0], dfg, BinaryIntOp::Sub); + self.update_slice_length( + target_len.address, + arguments[0], + dfg, + BrilligBinaryOp::Sub, + ); self.slice_pop_front_operation(target_vector, source_vector, &pop_variables); } @@ -1090,14 +1109,19 @@ impl<'block> BrilligBlock<'block> { converted_index.address, user_index.address, converted_index.address, - BinaryIntOp::Mul, + BrilligBinaryOp::Mul, ); let items = vecmap(&arguments[3..element_size + 3], |arg| { self.convert_ssa_value(*arg, dfg) }); - self.update_slice_length(target_len.address, arguments[0], dfg, BinaryIntOp::Add); + self.update_slice_length( + target_len.address, + arguments[0], + dfg, + BrilligBinaryOp::Add, + ); self.slice_insert_operation(target_vector, source_vector, converted_index, &items); self.brillig_context.deallocate_single_addr(converted_index); @@ -1132,7 +1156,7 @@ impl<'block> BrilligBlock<'block> { converted_index.address, user_index.address, converted_index.address, - BinaryIntOp::Mul, + BrilligBinaryOp::Mul, ); let removed_items = vecmap(&results[2..element_size + 2], |result| { @@ -1144,7 +1168,12 @@ impl<'block> BrilligBlock<'block> { ) }); - self.update_slice_length(target_len.address, arguments[0], dfg, BinaryIntOp::Sub); + self.update_slice_length( + target_len.address, + arguments[0], + dfg, + BrilligBinaryOp::Sub, + ); self.slice_remove_operation( target_vector, @@ -1173,7 +1202,7 @@ impl<'block> BrilligBlock<'block> { target_len: MemoryAddress, source_value: ValueId, dfg: &DataFlowGraph, - binary_op: BinaryIntOp, + binary_op: BrilligBinaryOp, ) { let source_len_variable = self.convert_ssa_value(source_value, dfg); let source_len = source_len_variable.extract_single_addr(); @@ -1219,15 +1248,14 @@ impl<'block> BrilligBlock<'block> { result: SingleAddrVariable, is_signed: bool, ) { - let (op, bit_size) = if let BrilligBinaryOp::Integer(op) = binary_operation { - // Bit size is checked at compile time to be equal for left and right - (op, left.bit_size) - } else { + let bit_size = left.bit_size; + + if bit_size == FieldElement::max_num_bits() { return; - }; + } - match (op, is_signed) { - (BinaryIntOp::Add, false) => { + match (binary_operation, is_signed) { + (BrilligBinaryOp::Add, false) => { let condition = SingleAddrVariable::new(self.brillig_context.allocate_register(), 1); // Check that lhs <= result @@ -1235,7 +1263,7 @@ impl<'block> BrilligBlock<'block> { left, result, condition, - BrilligBinaryOp::Integer(BinaryIntOp::LessThanEquals), + BrilligBinaryOp::LessThanEquals, ); self.brillig_context.constrain_instruction( condition, @@ -1243,7 +1271,7 @@ impl<'block> BrilligBlock<'block> { ); self.brillig_context.deallocate_single_addr(condition); } - (BinaryIntOp::Sub, false) => { + (BrilligBinaryOp::Sub, false) => { let condition = SingleAddrVariable::new(self.brillig_context.allocate_register(), 1); // Check that rhs <= lhs @@ -1251,7 +1279,7 @@ impl<'block> BrilligBlock<'block> { right, left, condition, - BrilligBinaryOp::Integer(BinaryIntOp::LessThanEquals), + BrilligBinaryOp::LessThanEquals, ); self.brillig_context.constrain_instruction( condition, @@ -1259,7 +1287,7 @@ impl<'block> BrilligBlock<'block> { ); self.brillig_context.deallocate_single_addr(condition); } - (BinaryIntOp::Mul, false) => { + (BrilligBinaryOp::Mul, false) => { // Multiplication overflow is only possible for bit sizes > 1 if bit_size > 1 { let is_right_zero = @@ -1269,7 +1297,7 @@ impl<'block> BrilligBlock<'block> { zero, right, is_right_zero, - BrilligBinaryOp::Integer(BinaryIntOp::Equals), + BrilligBinaryOp::Equals, ); self.brillig_context.if_not_instruction(is_right_zero.address, |ctx| { let condition = SingleAddrVariable::new(ctx.allocate_register(), 1); @@ -1279,14 +1307,9 @@ impl<'block> BrilligBlock<'block> { result, right, division, - BrilligBinaryOp::Integer(BinaryIntOp::UnsignedDiv), - ); - ctx.binary_instruction( - division, - left, - condition, - BrilligBinaryOp::Integer(BinaryIntOp::Equals), + BrilligBinaryOp::UnsignedDiv, ); + ctx.binary_instruction(division, left, condition, BrilligBinaryOp::Equals); ctx.constrain_instruction( condition, Some("attempt to multiply with overflow".to_string()), @@ -1369,7 +1392,7 @@ impl<'block> BrilligBlock<'block> { // Increment the iterator self.brillig_context.usize_op_in_place( iterator_register.address, - BinaryIntOp::Add, + BrilligBinaryOp::Add, 1, ); } @@ -1479,7 +1502,7 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.usize_op( size, result_register, - BinaryIntOp::UnsignedDiv, + BrilligBinaryOp::UnsignedDiv, element_size, ); } @@ -1517,66 +1540,41 @@ pub(crate) fn type_of_binary_operation(lhs_type: &Type, rhs_type: &Type) -> Type } } -/// Convert an SSA binary operation into: -/// - Brillig Binary Integer Op, if it is a integer type -/// - Brillig Binary Field Op, if it is a field type pub(crate) fn convert_ssa_binary_op_to_brillig_binary_op( ssa_op: BinaryOp, typ: &Type, ) -> (BrilligBinaryOp, bool) { - // First get the bit size and whether its a signed integer, if it is a numeric type - // if it is not,then we return None, indicating that - // it is a Field. - let bit_size_signedness = match typ { + let (is_field, is_signed) = match typ { Type::Numeric(numeric_type) => match numeric_type { - NumericType::Signed { bit_size } => Some((bit_size, true)), - NumericType::Unsigned { bit_size } => Some((bit_size, false)), - NumericType::NativeField => None, + NumericType::Signed { .. } => (false, true), + NumericType::Unsigned { .. } => (false, false), + NumericType::NativeField => (true, false), }, _ => unreachable!("only numeric types are allowed in binary operations. References are handled separately"), }; - fn binary_op_to_field_op(op: BinaryOp) -> BrilligBinaryOp { - match op { - BinaryOp::Add => BrilligBinaryOp::Field(BinaryFieldOp::Add), - BinaryOp::Sub => BrilligBinaryOp::Field(BinaryFieldOp::Sub), - BinaryOp::Mul => BrilligBinaryOp::Field(BinaryFieldOp::Mul), - BinaryOp::Div => BrilligBinaryOp::Field(BinaryFieldOp::Div), - BinaryOp::Eq => BrilligBinaryOp::Field(BinaryFieldOp::Equals), - _ => unreachable!( - "Field type cannot be used with {op}. This should have been caught by the frontend" - ), - } - } - - fn binary_op_to_int_op(op: BinaryOp, is_signed: bool) -> BrilligBinaryOp { - let operation = match op { - BinaryOp::Add => BinaryIntOp::Add, - BinaryOp::Sub => BinaryIntOp::Sub, - BinaryOp::Mul => BinaryIntOp::Mul, - BinaryOp::Div => { - if is_signed { - BinaryIntOp::SignedDiv - } else { - BinaryIntOp::UnsignedDiv - } + let brillig_binary_op = match ssa_op { + BinaryOp::Add => BrilligBinaryOp::Add, + BinaryOp::Sub => BrilligBinaryOp::Sub, + BinaryOp::Mul => BrilligBinaryOp::Mul, + BinaryOp::Div => { + if is_field { + BrilligBinaryOp::FieldDiv + } else if is_signed { + BrilligBinaryOp::SignedDiv + } else { + BrilligBinaryOp::UnsignedDiv } - BinaryOp::Mod => return BrilligBinaryOp::Modulo { is_signed_integer: is_signed }, - BinaryOp::Eq => BinaryIntOp::Equals, - BinaryOp::Lt => BinaryIntOp::LessThan, - BinaryOp::And => BinaryIntOp::And, - BinaryOp::Or => BinaryIntOp::Or, - BinaryOp::Xor => BinaryIntOp::Xor, - BinaryOp::Shl => BinaryIntOp::Shl, - BinaryOp::Shr => BinaryIntOp::Shr, - }; - - BrilligBinaryOp::Integer(operation) - } - - // If bit size is available then it is a binary integer operation - match bit_size_signedness { - Some((_, is_signed)) => (binary_op_to_int_op(ssa_op, is_signed), is_signed), - None => (binary_op_to_field_op(ssa_op), false), - } + } + BinaryOp::Mod => BrilligBinaryOp::Modulo { is_signed_integer: is_signed }, + BinaryOp::Eq => BrilligBinaryOp::Equals, + BinaryOp::Lt => BrilligBinaryOp::LessThan, + BinaryOp::And => BrilligBinaryOp::And, + BinaryOp::Or => BrilligBinaryOp::Or, + BinaryOp::Xor => BrilligBinaryOp::Xor, + BinaryOp::Shl => BrilligBinaryOp::Shl, + BinaryOp::Shr => BrilligBinaryOp::Shr, + }; + + (brillig_binary_op, is_signed) } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_slice_ops.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_slice_ops.rs index 969f95cff20..75a98fd3fe6 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_slice_ops.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_slice_ops.rs @@ -1,7 +1,6 @@ -use acvm::brillig_vm::brillig::BinaryIntOp; - -use crate::brillig::brillig_ir::brillig_variable::{ - BrilligVariable, BrilligVector, SingleAddrVariable, +use crate::brillig::brillig_ir::{ + brillig_variable::{BrilligVariable, BrilligVector, SingleAddrVariable}, + BrilligBinaryOp, }; use super::brillig_block::BrilligBlock; @@ -17,7 +16,7 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.usize_op( source_vector.size, target_vector.size, - BinaryIntOp::Add, + BrilligBinaryOp::Add, variables_to_insert.len(), ); self.brillig_context.allocate_array_instruction(target_vector.pointer, target_vector.size); @@ -37,7 +36,7 @@ impl<'block> BrilligBlock<'block> { target_index.address, source_vector.size, target_index.address, - BinaryIntOp::Add, + BrilligBinaryOp::Add, ); self.store_variable_in_array(target_vector.pointer, target_index, *variable); self.brillig_context.deallocate_single_addr(target_index); @@ -54,7 +53,7 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.usize_op( source_vector.size, target_vector.size, - BinaryIntOp::Add, + BrilligBinaryOp::Add, variables_to_insert.len(), ); self.brillig_context.allocate_array_instruction(target_vector.pointer, target_vector.size); @@ -66,7 +65,7 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.usize_op( target_vector.pointer, destination_copy_pointer, - BinaryIntOp::Add, + BrilligBinaryOp::Add, variables_to_insert.len(), ); @@ -97,7 +96,7 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.usize_op( source_vector.size, target_vector.size, - BinaryIntOp::Sub, + BrilligBinaryOp::Sub, removed_items.len(), ); self.brillig_context.allocate_array_instruction(target_vector.pointer, target_vector.size); @@ -109,7 +108,7 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.usize_op( source_vector.pointer, source_copy_pointer, - BinaryIntOp::Add, + BrilligBinaryOp::Add, removed_items.len(), ); @@ -139,7 +138,7 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.usize_op( source_vector.size, target_vector.size, - BinaryIntOp::Sub, + BrilligBinaryOp::Sub, removed_items.len(), ); self.brillig_context.allocate_array_instruction(target_vector.pointer, target_vector.size); @@ -159,7 +158,7 @@ impl<'block> BrilligBlock<'block> { target_index.address, target_vector.size, target_index.address, - BinaryIntOp::Add, + BrilligBinaryOp::Add, ); self.retrieve_variable_from_array(source_vector.pointer, target_index, *variable); self.brillig_context.deallocate_single_addr(target_index); @@ -177,7 +176,7 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.usize_op( source_vector.size, target_vector.size, - BinaryIntOp::Add, + BrilligBinaryOp::Add, items.len(), ); self.brillig_context.allocate_array_instruction(target_vector.pointer, target_vector.size); @@ -197,7 +196,7 @@ impl<'block> BrilligBlock<'block> { source_vector.pointer, index.address, source_pointer_at_index, - BinaryIntOp::Add, + BrilligBinaryOp::Add, ); // Compute the target pointer after the inserted elements @@ -206,11 +205,11 @@ impl<'block> BrilligBlock<'block> { target_vector.pointer, index.address, target_pointer_after_index, - BinaryIntOp::Add, + BrilligBinaryOp::Add, ); self.brillig_context.usize_op_in_place( target_pointer_after_index, - BinaryIntOp::Add, + BrilligBinaryOp::Add, items.len(), ); @@ -220,7 +219,7 @@ impl<'block> BrilligBlock<'block> { source_vector.size, index.address, item_count, - BinaryIntOp::Sub, + BrilligBinaryOp::Sub, ); // Copy the elements to the right of the index @@ -237,7 +236,7 @@ impl<'block> BrilligBlock<'block> { target_index.address, index.address, target_index.address, - BinaryIntOp::Add, + BrilligBinaryOp::Add, ); self.store_variable_in_array(target_vector.pointer, target_index, *variable); self.brillig_context.deallocate_single_addr(target_index); @@ -259,7 +258,7 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.usize_op( source_vector.size, target_vector.size, - BinaryIntOp::Sub, + BrilligBinaryOp::Sub, removed_items.len(), ); self.brillig_context.allocate_array_instruction(target_vector.pointer, target_vector.size); @@ -279,11 +278,11 @@ impl<'block> BrilligBlock<'block> { source_vector.pointer, index.address, source_pointer_after_index, - BinaryIntOp::Add, + BrilligBinaryOp::Add, ); self.brillig_context.usize_op_in_place( source_pointer_after_index, - BinaryIntOp::Add, + BrilligBinaryOp::Add, removed_items.len(), ); @@ -293,7 +292,7 @@ impl<'block> BrilligBlock<'block> { target_vector.pointer, index.address, target_pointer_at_index, - BinaryIntOp::Add, + BrilligBinaryOp::Add, ); // Compute the number of elements to the right of the index @@ -302,9 +301,13 @@ impl<'block> BrilligBlock<'block> { source_vector.size, index.address, item_count, - BinaryIntOp::Sub, + BrilligBinaryOp::Sub, + ); + self.brillig_context.usize_op_in_place( + item_count, + BrilligBinaryOp::Sub, + removed_items.len(), ); - self.brillig_context.usize_op_in_place(item_count, BinaryIntOp::Sub, removed_items.len()); // Copy the elements to the right of the index self.brillig_context.copy_array_instruction( @@ -320,7 +323,7 @@ impl<'block> BrilligBlock<'block> { target_index.address, index.address, target_index.address, - BinaryIntOp::Add, + BrilligBinaryOp::Add, ); self.retrieve_variable_from_array(source_vector.pointer, target_index, *variable); self.brillig_context.deallocate_single_addr(target_index); diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir.rs index 2a96965171b..80b13c8f6ba 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir.rs @@ -151,7 +151,7 @@ impl BrilligContext { ReservedRegisters::stack_pointer(), size_register, ReservedRegisters::stack_pointer(), - BinaryIntOp::Add, + BrilligBinaryOp::Add, ); } @@ -173,7 +173,7 @@ impl BrilligContext { ReservedRegisters::stack_pointer(), size_register.address, ReservedRegisters::stack_pointer(), - BinaryIntOp::Add, + BrilligBinaryOp::Add, ); self.deallocate_single_addr(size_register); } @@ -213,7 +213,7 @@ impl BrilligContext { self.debug_show.array_get(array_ptr, index.address, result); // Computes array_ptr + index, ie array[index] let index_of_element_in_memory = self.allocate_register(); - self.memory_op(array_ptr, index.address, index_of_element_in_memory, BinaryIntOp::Add); + self.memory_op(array_ptr, index.address, index_of_element_in_memory, BrilligBinaryOp::Add); self.load_instruction(result, index_of_element_in_memory); // Free up temporary register self.deallocate_register(index_of_element_in_memory); @@ -234,7 +234,7 @@ impl BrilligContext { SingleAddrVariable::new_usize(array_ptr), index, SingleAddrVariable::new_usize(index_of_element_in_memory), - BrilligBinaryOp::Integer(BinaryIntOp::Add), + BrilligBinaryOp::Add, ); self.store_instruction(index_of_element_in_memory, value); @@ -288,7 +288,7 @@ impl BrilligContext { iterator_register.address, iteration_count, iterator_less_than_iterations.address, - BinaryIntOp::LessThan, + BrilligBinaryOp::LessThan, ); let (exit_loop_section, exit_loop_label) = self.reserve_next_section_label(); @@ -301,7 +301,7 @@ impl BrilligContext { on_iteration(self, iterator_register); // Increment the iterator register - self.usize_op_in_place(iterator_register.address, BinaryIntOp::Add, 1); + self.usize_op_in_place(iterator_register.address, BrilligBinaryOp::Add, 1); self.jump_instruction(loop_label); @@ -531,10 +531,9 @@ impl BrilligContext { fn binary_result_bit_size(operation: BrilligBinaryOp, arguments_bit_size: u32) -> u32 { match operation { - BrilligBinaryOp::Field(BinaryFieldOp::Equals) - | BrilligBinaryOp::Integer(BinaryIntOp::Equals) - | BrilligBinaryOp::Integer(BinaryIntOp::LessThan) - | BrilligBinaryOp::Integer(BinaryIntOp::LessThanEquals) => 1, + BrilligBinaryOp::Equals + | BrilligBinaryOp::LessThan + | BrilligBinaryOp::LessThanEquals => 1, _ => arguments_bit_size, } } @@ -556,6 +555,7 @@ impl BrilligContext { lhs.bit_size, rhs.bit_size ); + let is_field_op = lhs.bit_size == FieldElement::max_num_bits(); let expected_result_bit_size = BrilligContext::binary_result_bit_size(operation, lhs.bit_size); assert!( @@ -566,29 +566,26 @@ impl BrilligContext { operation ); self.debug_show.binary_instruction(lhs.address, rhs.address, result.address, operation); - match operation { - BrilligBinaryOp::Field(op) => { - let opcode = BrilligOpcode::BinaryFieldOp { - op, - destination: result.address, - lhs: lhs.address, - rhs: rhs.address, - }; - self.push_opcode(opcode); - } - BrilligBinaryOp::Integer(op) => { - let opcode = BrilligOpcode::BinaryIntOp { - op, - destination: result.address, - bit_size: lhs.bit_size, - lhs: lhs.address, - rhs: rhs.address, - }; - self.push_opcode(opcode); - } - BrilligBinaryOp::Modulo { is_signed_integer } => { - self.modulo_instruction(result, lhs, rhs, is_signed_integer); - } + + if let BrilligBinaryOp::Modulo { is_signed_integer } = operation { + self.modulo_instruction(result, lhs, rhs, is_signed_integer); + } else if is_field_op { + let opcode = BrilligOpcode::BinaryFieldOp { + op: operation.into(), + destination: result.address, + lhs: lhs.address, + rhs: rhs.address, + }; + self.push_opcode(opcode); + } else { + let opcode = BrilligOpcode::BinaryIntOp { + op: operation.into(), + destination: result.address, + bit_size: lhs.bit_size, + lhs: lhs.address, + rhs: rhs.address, + }; + self.push_opcode(opcode); } } @@ -683,7 +680,7 @@ impl BrilligContext { let rc_pointer = self.allocate_register(); self.mov_instruction(rc_pointer, variable_pointer); - self.usize_op_in_place(rc_pointer, BinaryIntOp::Add, 1_usize); + self.usize_op_in_place(rc_pointer, BrilligBinaryOp::Add, 1_usize); self.load_instruction(rc, rc_pointer); self.deallocate_register(rc_pointer); @@ -693,14 +690,14 @@ impl BrilligContext { let size_pointer = self.allocate_register(); self.mov_instruction(size_pointer, variable_pointer); - self.usize_op_in_place(size_pointer, BinaryIntOp::Add, 1_usize); + self.usize_op_in_place(size_pointer, BrilligBinaryOp::Add, 1_usize); self.load_instruction(size, size_pointer); self.deallocate_register(size_pointer); let rc_pointer = self.allocate_register(); self.mov_instruction(rc_pointer, variable_pointer); - self.usize_op_in_place(rc_pointer, BinaryIntOp::Add, 2_usize); + self.usize_op_in_place(rc_pointer, BrilligBinaryOp::Add, 2_usize); self.load_instruction(rc, rc_pointer); self.deallocate_register(rc_pointer); @@ -733,7 +730,7 @@ impl BrilligContext { let rc_pointer: MemoryAddress = self.allocate_register(); self.mov_instruction(rc_pointer, variable_pointer); - self.usize_op_in_place(rc_pointer, BinaryIntOp::Add, 1_usize); + self.usize_op_in_place(rc_pointer, BrilligBinaryOp::Add, 1_usize); self.store_instruction(rc_pointer, rc); self.deallocate_register(rc_pointer); } @@ -742,12 +739,12 @@ impl BrilligContext { let size_pointer = self.allocate_register(); self.mov_instruction(size_pointer, variable_pointer); - self.usize_op_in_place(size_pointer, BinaryIntOp::Add, 1_usize); + self.usize_op_in_place(size_pointer, BrilligBinaryOp::Add, 1_usize); self.store_instruction(size_pointer, size); let rc_pointer: MemoryAddress = self.allocate_register(); self.mov_instruction(rc_pointer, variable_pointer); - self.usize_op_in_place(rc_pointer, BinaryIntOp::Add, 2_usize); + self.usize_op_in_place(rc_pointer, BrilligBinaryOp::Add, 2_usize); self.store_instruction(rc_pointer, rc); self.deallocate_register(size_pointer); @@ -828,10 +825,6 @@ impl BrilligContext { right: SingleAddrVariable, signed: bool, ) { - // no debug_show, shown in binary instruction - let scratch_register_i = self.allocate_register(); - let scratch_register_j = self.allocate_register(); - assert!( left.bit_size == right.bit_size, "Not equal bitsize: lhs {}, rhs {}", @@ -839,38 +832,29 @@ impl BrilligContext { right.bit_size ); let bit_size = left.bit_size; + + let scratch_var_i = SingleAddrVariable::new(self.allocate_register(), bit_size); + let scratch_var_j = SingleAddrVariable::new(self.allocate_register(), bit_size); + // i = left / right - self.push_opcode(BrilligOpcode::BinaryIntOp { - op: match signed { - true => BinaryIntOp::SignedDiv, - false => BinaryIntOp::UnsignedDiv, + self.binary_instruction( + left, + right, + scratch_var_i, + match signed { + true => BrilligBinaryOp::SignedDiv, + false => BrilligBinaryOp::UnsignedDiv, }, - destination: scratch_register_i, - bit_size, - lhs: left.address, - rhs: right.address, - }); + ); // j = i * right - self.push_opcode(BrilligOpcode::BinaryIntOp { - op: BinaryIntOp::Mul, - destination: scratch_register_j, - bit_size, - lhs: scratch_register_i, - rhs: right.address, - }); + self.binary_instruction(scratch_var_i, right, scratch_var_j, BrilligBinaryOp::Mul); // result_register = left - j - self.push_opcode(BrilligOpcode::BinaryIntOp { - op: BinaryIntOp::Sub, - destination: result.address, - bit_size, - lhs: left.address, - rhs: scratch_register_j, - }); + self.binary_instruction(left, scratch_var_j, result, BrilligBinaryOp::Sub); // Free scratch registers - self.deallocate_register(scratch_register_i); - self.deallocate_register(scratch_register_j); + self.deallocate_register(scratch_var_i.address); + self.deallocate_register(scratch_var_j.address); } /// Adds a unresolved external `Call` instruction to the bytecode. @@ -903,7 +887,7 @@ impl BrilligContext { for register in used_registers.iter() { self.store_instruction(ReservedRegisters::stack_pointer(), *register); // Add one to our stack pointer - self.usize_op_in_place(ReservedRegisters::stack_pointer(), BinaryIntOp::Add, 1); + self.usize_op_in_place(ReservedRegisters::stack_pointer(), BrilligBinaryOp::Add, 1); } // Store the location of our registers in the previous stack pointer @@ -924,7 +908,7 @@ impl BrilligContext { for register in used_registers.iter().rev() { // Subtract one from our stack pointer - self.usize_op_in_place(iterator_register, BinaryIntOp::Sub, 1); + self.usize_op_in_place(iterator_register, BrilligBinaryOp::Sub, 1); self.load_instruction(*register, iterator_register); } } @@ -933,7 +917,7 @@ impl BrilligContext { pub(crate) fn usize_op_in_place( &mut self, destination: MemoryAddress, - op: BinaryIntOp, + op: BrilligBinaryOp, constant: usize, ) { self.usize_op(destination, destination, op, constant); @@ -944,7 +928,7 @@ impl BrilligContext { &mut self, operand: MemoryAddress, destination: MemoryAddress, - op: BinaryIntOp, + op: BrilligBinaryOp, constant: usize, ) { let const_register = self.make_usize_constant(Value::from(constant)); @@ -959,19 +943,16 @@ impl BrilligContext { lhs: MemoryAddress, rhs: MemoryAddress, destination: MemoryAddress, - op: BinaryIntOp, + op: BrilligBinaryOp, ) { self.binary_instruction( SingleAddrVariable::new_usize(lhs), SingleAddrVariable::new_usize(rhs), SingleAddrVariable::new( destination, - BrilligContext::binary_result_bit_size( - BrilligBinaryOp::Integer(op), - BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, - ), + BrilligContext::binary_result_bit_size(op, BRILLIG_MEMORY_ADDRESSING_BIT_SIZE), ), - BrilligBinaryOp::Integer(op), + op, ); } @@ -1075,7 +1056,7 @@ impl BrilligContext { shifted_field, radix_as_field, shifted_field, - BrilligBinaryOp::Integer(BinaryIntOp::UnsignedDiv), + BrilligBinaryOp::UnsignedDiv, ); }); @@ -1092,7 +1073,7 @@ impl BrilligContext { /// This instruction will reverse the order of the elements in a vector. pub(crate) fn reverse_vector_in_place_instruction(&mut self, vector: BrilligVector) { let iteration_count = self.allocate_register(); - self.usize_op(vector.size, iteration_count, BinaryIntOp::UnsignedDiv, 2); + self.usize_op(vector.size, iteration_count, BrilligBinaryOp::UnsignedDiv, 2); let start_value_register = self.allocate_register(); let index_at_end_of_array = self.allocate_register(); @@ -1104,12 +1085,12 @@ impl BrilligContext { // The index at the end of array is size - 1 - iterator ctx.mov_instruction(index_at_end_of_array, vector.size); - ctx.usize_op_in_place(index_at_end_of_array, BinaryIntOp::Sub, 1); + ctx.usize_op_in_place(index_at_end_of_array, BrilligBinaryOp::Sub, 1); ctx.memory_op( index_at_end_of_array, iterator_register.address, index_at_end_of_array, - BinaryIntOp::Sub, + BrilligBinaryOp::Sub, ); ctx.array_get( @@ -1142,25 +1123,73 @@ impl BrilligContext { /// Type to encapsulate the binary operation types in Brillig #[derive(Clone, Copy, Debug)] pub(crate) enum BrilligBinaryOp { - Field(BinaryFieldOp), - Integer(BinaryIntOp), + Add, + Sub, + Mul, + FieldDiv, + SignedDiv, + UnsignedDiv, + Equals, + LessThan, + LessThanEquals, + And, + Or, + Xor, + Shl, + Shr, // Modulo operation requires more than one brillig opcode Modulo { is_signed_integer: bool }, } +impl From for BinaryFieldOp { + fn from(operation: BrilligBinaryOp) -> BinaryFieldOp { + match operation { + BrilligBinaryOp::Add => BinaryFieldOp::Add, + BrilligBinaryOp::Sub => BinaryFieldOp::Sub, + BrilligBinaryOp::Mul => BinaryFieldOp::Mul, + BrilligBinaryOp::FieldDiv => BinaryFieldOp::Div, + BrilligBinaryOp::UnsignedDiv => BinaryFieldOp::IntegerDiv, + BrilligBinaryOp::Equals => BinaryFieldOp::Equals, + BrilligBinaryOp::LessThan => BinaryFieldOp::LessThan, + BrilligBinaryOp::LessThanEquals => BinaryFieldOp::LessThanEquals, + _ => panic!("Unsupported operation: {:?} on a field", operation), + } + } +} + +impl From for BinaryIntOp { + fn from(operation: BrilligBinaryOp) -> BinaryIntOp { + match operation { + BrilligBinaryOp::Add => BinaryIntOp::Add, + BrilligBinaryOp::Sub => BinaryIntOp::Sub, + BrilligBinaryOp::Mul => BinaryIntOp::Mul, + BrilligBinaryOp::UnsignedDiv => BinaryIntOp::UnsignedDiv, + BrilligBinaryOp::SignedDiv => BinaryIntOp::SignedDiv, + BrilligBinaryOp::Equals => BinaryIntOp::Equals, + BrilligBinaryOp::LessThan => BinaryIntOp::LessThan, + BrilligBinaryOp::LessThanEquals => BinaryIntOp::LessThanEquals, + BrilligBinaryOp::And => BinaryIntOp::And, + BrilligBinaryOp::Or => BinaryIntOp::Or, + BrilligBinaryOp::Xor => BinaryIntOp::Xor, + BrilligBinaryOp::Shl => BinaryIntOp::Shl, + BrilligBinaryOp::Shr => BinaryIntOp::Shr, + _ => panic!("Unsupported operation: {:?} on an integer", operation), + } + } +} + #[cfg(test)] pub(crate) mod tests { use std::vec; use acvm::acir::brillig::{ - BinaryIntOp, ForeignCallParam, ForeignCallResult, HeapVector, MemoryAddress, Value, - ValueOrArray, + ForeignCallParam, ForeignCallResult, HeapVector, MemoryAddress, Value, ValueOrArray, }; use acvm::brillig_vm::brillig::HeapValueType; use acvm::brillig_vm::{VMStatus, VM}; use acvm::{BlackBoxFunctionSolver, BlackBoxResolutionError, FieldElement}; - use crate::brillig::brillig_ir::BrilligContext; + use crate::brillig::brillig_ir::{BrilligBinaryOp, BrilligContext}; use super::artifact::{BrilligParameter, GeneratedBrillig}; use super::{BrilligOpcode, ReservedRegisters}; @@ -1282,9 +1311,9 @@ pub(crate) mod tests { &[HeapValueType::Vector { value_types: vec![HeapValueType::Simple] }], ); // push stack frame by r_returned_size - context.memory_op(r_stack, r_output_size, r_stack, BinaryIntOp::Add); + context.memory_op(r_stack, r_output_size, r_stack, BrilligBinaryOp::Add); // check r_input_size == r_output_size - context.memory_op(r_input_size, r_output_size, r_equality, BinaryIntOp::Equals); + context.memory_op(r_input_size, r_output_size, r_equality, BrilligBinaryOp::Equals); // We push a JumpIf and Trap opcode directly as the constrain instruction // uses unresolved jumps which requires a block to be constructed in SSA and // we don't need this for Brillig IR tests diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/debug_show.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/debug_show.rs index e32ce6f6b92..431ae9913a6 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/debug_show.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/debug_show.rs @@ -2,10 +2,7 @@ use super::BrilligBinaryOp; use crate::brillig::brillig_ir::ReservedRegisters; -use acvm::acir::brillig::{ - BinaryFieldOp, BinaryIntOp, BlackBoxOp, HeapArray, HeapVector, MemoryAddress, Value, - ValueOrArray, -}; +use acvm::acir::brillig::{BlackBoxOp, HeapArray, HeapVector, MemoryAddress, Value, ValueOrArray}; /// Trait for converting values into debug-friendly strings. trait DebugToString { @@ -48,43 +45,23 @@ impl DebugToString for HeapVector { } } -impl DebugToString for BinaryFieldOp { - fn debug_to_string(&self) -> String { - match self { - BinaryFieldOp::Add => "f+".into(), - BinaryFieldOp::Sub => "f-".into(), - BinaryFieldOp::Mul => "f*".into(), - BinaryFieldOp::Div => "f/".into(), - BinaryFieldOp::Equals => "f==".into(), - } - } -} - -impl DebugToString for BinaryIntOp { - fn debug_to_string(&self) -> String { - match self { - BinaryIntOp::Add => "+".into(), - BinaryIntOp::Sub => "-".into(), - BinaryIntOp::Mul => "*".into(), - BinaryIntOp::Equals => "==".into(), - BinaryIntOp::SignedDiv => "/".into(), - BinaryIntOp::UnsignedDiv => "//".into(), - BinaryIntOp::LessThan => "<".into(), - BinaryIntOp::LessThanEquals => "<=".into(), - BinaryIntOp::And => "&&".into(), - BinaryIntOp::Or => "||".into(), - BinaryIntOp::Xor => "^".into(), - BinaryIntOp::Shl => "<<".into(), - BinaryIntOp::Shr => ">>".into(), - } - } -} - impl DebugToString for BrilligBinaryOp { fn debug_to_string(&self) -> String { match self { - BrilligBinaryOp::Field(op) => op.debug_to_string(), - BrilligBinaryOp::Integer(op) => op.debug_to_string(), + BrilligBinaryOp::Add => "+".into(), + BrilligBinaryOp::Sub => "-".into(), + BrilligBinaryOp::Mul => "*".into(), + BrilligBinaryOp::Equals => "==".into(), + BrilligBinaryOp::FieldDiv => "f/".into(), + BrilligBinaryOp::SignedDiv => "/".into(), + BrilligBinaryOp::UnsignedDiv => "//".into(), + BrilligBinaryOp::LessThan => "<".into(), + BrilligBinaryOp::LessThanEquals => "<=".into(), + BrilligBinaryOp::And => "&&".into(), + BrilligBinaryOp::Or => "||".into(), + BrilligBinaryOp::Xor => "^".into(), + BrilligBinaryOp::Shl => "<<".into(), + BrilligBinaryOp::Shr => ">>".into(), BrilligBinaryOp::Modulo { is_signed_integer } => { let op = if *is_signed_integer { "%" } else { "%%" }; op.into() diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/entry_point.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/entry_point.rs index 83440e4a51d..f0b54b4216d 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/entry_point.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/entry_point.rs @@ -3,7 +3,7 @@ use super::{ brillig_variable::{BrilligArray, BrilligVariable, SingleAddrVariable}, debug_show::DebugShow, registers::BrilligRegistersContext, - BrilligContext, ReservedRegisters, BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, + BrilligBinaryOp, BrilligContext, ReservedRegisters, BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, }; use acvm::{ acir::brillig::{MemoryAddress, Opcode as BrilligOpcode}, @@ -220,7 +220,7 @@ impl BrilligContext { nested_array_pointer, source_index.address, nested_array_pointer, - acvm::brillig_vm::brillig::BinaryIntOp::Add, + BrilligBinaryOp::Add, ); let deflattened_nested_array_pointer = self.deflatten_array( nested_array_item_type, @@ -414,7 +414,7 @@ impl BrilligContext { flattened_nested_array_pointer, target_index.address, flattened_nested_array_pointer, - acvm::brillig_vm::brillig::BinaryIntOp::Add, + BrilligBinaryOp::Add, ); self.flatten_array( diff --git a/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap b/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap index d1997e34518..0b988240d5a 100644 --- a/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap +++ b/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap @@ -9,18 +9,18 @@ exports[`ContractClass creates a contract class from a contract compilation arti "selector": { "value": 2381782501 }, - "bytecode": "0x1f8b08000000000000ffed9d07741d45b6ae5bb61ce0481893b3450e06a3e49c64724ec6608c31b62c0b1b0739623298e81cc8c10639e78c718e18c3cc30393381811926dd3b7367ddf5e6be77df7a8f75bbcea9bdf4ab5c7daca3e992ff2355af5552f53ed5bdbffa7b7775aaeefa47100439416a6a1ea60b82c327f9bd4cff2ffcd7a6a218d755e89233274b389b650967f32ce1cccd12ce1659c2d9324b385b650967eb2ce13c26464ec5d62ca83dc5cd7bac035de3664c6499a67959a0697e96697a5c1668da26c88e36eaf82ce16c9b259c276409e78959c2795296709e9c259ca76409e7a959c2795a96709e9e259c676409e79959c2795696709e9d259ce7640967bb2ce12cc812ce73b384f3bc2ce13c3f4b382fc812ce0bb384f3a21839db03e7c5faff25faffa5faff65fabf94bd5cffbf42ffefa0eb98abe7af545c61520f698a8ddf4ac2541aa68e61ea64fcd6394c5dc2d4354cddf46f05fab7ee61ea11a69e61ea15a6de5a833e61ba2a4c5787e99a305d1ba6ebc2747d986e08d38d61ba294c3787e99630dd1aa6dbc2747b98ee08d39d61ba2b4c7dc3747798fa85e99e30dd1ba6fe61ba2f4c030c96fbc334304c0f846950981e0cd3e0300d095379988686a9224cc3c25419a687c2343c4c23c2f4709846866954984687694c98aac234364ce3c2343e4c13c234314c93c2f448982687e9d1303d16a6c70dcd9e08d393617a2a4c4f1b9ccf84e9d9304d09d373617a3e4c2f84e9c530bd14a697c334354cd3c2343d4c33c234334cb3c2343b4c73c234374cf3c2f44a985e0dd36b617a3d4c6f84e9cd30bd15a6b7c3f44e98de0dd3fc302d08d37b9a457684f7c3541da685615a14a6c5615a12a6a5615a16a6e5615a11a695615a15a6d5615a13a6b5615a17a6f561da10a68d61da14a6cd61fa204c5bc2f46198b686695b98b68769479876866957987687694f98f686695f98f687e940983e0ad3c1307d1ca64361fa244c9f86e95b61fa7698be13a6cfc2f4dd307dcfd0fcfb61fa41987e18a61f69db8ff5ff9fe8b272ffeea761fa99ceff5cffff85feff4bfdff7363995f85e9d786ed3761faad61fb224cbfd3f92ff5ffaff4ffdfebff7fd0ffbfd6ffffa8ffff49ffffb3feff17fdffaffaffbfe9ffffaeffff4dffffbbfeff1ffaff3fc2f440412adf3aa899ca8298daa8d2cae4b31f11ffe2a0f6a4b468ae7f93ff05da9eabe7e5bf68d742cfb730ec2df57c4b633dadf57c6bc3de56cfb735ec27eaf9130dfbc97afe64c37eaa9e3fd5b05fa0e72f007b22807bc3daae6ccdb529076c12afcdc0d642db9a83ada5ac0e6cadb4ad05d864fbb604db31dad60a6cc76a5b6bb025b4ed18d1324c79da5616c4152b8543d47af3e35eaf7e5e765cfcbc43d57adb38e23d3e7ede616abd6d1df0aaf83841afeb78889b13b5ad2dd84ed2b613c076b2b69d08b653b4ed24b09daa6d2783ed346d3b056ca76bdba9603b43db4e03db99da763ad8ced2b633c076b6b69d09b673b4ed2cb0b5d3b6b3c156a06de780ed5c6d6b07b6f3b4ad006ce76bdbb960bb40dbce03db85da763ed82ed2b60bc026edef856093f3c58bb44db51dc7e4c032da2eed56721969b3c176a9b4d760bb4cda6ab0b597761a6c97836fb15d016d8dd83a689bb45beab76e3a5f16c4b59f1457aaf5768f7bbde19ad57a7bc6bfdee433c75e418dae65e0a73b68d55be763ecd75484be7374123f62cf85fc4d5056ca891e72ec1176758ce9a1f3bdd32cd7cd582e1fcaf4b0d4bf2c88b7fe3d0d9e9e06730bc8bb89d992121fb3759e328ed9fe50d68c3d390f6a8c317b2b703888d9ce3e66eb3c651cb39550d68c3d39176e8c317b3f703888d97237315b5ce8633675df2c08ecb127d7438d3166470047fc31dbd1c76cdda78c63f639286bc69e5c1337c6989d0c1cf1c76ce7727f6e50e729e3989d0b65cdd893fb338d31665f040e07315be9dbd93a4f19c7ec7b50d68c3db957d81863f655e0883f66bb3a8ad9121fb341ea196810d8634fee5b37c6985d081cf1c7ec507f7fb6ee53c631bb03ca9ab127cf501a63ccaed779f59ce1c7fa39c35960fb89b69d0dbcf1c776454747b15dec633bd5372408ec312acff31a636cefd57915c73f87fe0862fb85b69d0bb65f6adb7960fb5cdbce877a39d807cafd3e50e729e37de0d750d68c6579b6dc18f7811f02878398adf0315be729e398fd2b9435634ffa3934c698fd02381cc46ca58fd93a4f19c7ecff81b266ec5da2f38d3166a5afa93a5ff8529f2f5c06b6afb4ad3dd87eaf6d9783ed0fda7605d8bed6b60e60fba3b65d09b63f695b21d8feac6d4560fb8bb61583edafda5602b67fd3b652b0fdbbb67504dbdfb4ad13d8feae6d9dc1f61fdad6056cffd0b6aedaa69e7749df2b396f6d0dac65417cdb3601bac89463cc9741bed82d4f613ef0a0afd2f87d95a8ba970475af7b29f0747450f704f8a80b4f47e0e9143f4fb22f6ae7f8d79bdcc62586a609f05502f5eae2a05e39e04bd62df3e22f1f6cb89f77b130768d9fb138077cc9ba65be2b308a0ddb1d79ff47f61fd5369f9b53c3eb605f4a1e9fd15f197088bf5c28f3cf7635652fd46c79f03bb6c19d0c9ba3b84cc685f89275cbbcf8cb83fa746a78c6e2ba327634185db51139e04bd66dface837c915b7dd2f27426f1ede0bcdbdaa689e6dd1bc07757c377a9e11bdb4e99d21ddbba0273ecd73ffad8d623fef516e2b9b25ca7881f3c7fc0eb89b8ea84bee53a45fc883d17f237e4d4949572a287b4c3c2aef661d996c86e2ed7c5582e1fca74b7d4bf2c88b7fe3d0c9e1e06b33adef48463a183fd211903dd0d0e992f05ed7a4468d71db493329780760ece3d93da75337864be23f048fb8ded595103f31411f8c67358bc9693dff13cc0d5f62a321865deb6bdba0263470ba38373c2e274c7c35260145b37e02971a459d4762d21f1ede2ba32077cc8b9b9796d930b656e6f5e53b622c7295b319e3bcb54d76bdef8b7537121ee1f75e171bc0f15398ac742bc7ff34d106fac99ed92d9de44dde371d59697183c322ffe3cb367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed933f3332b1e799e80fdb6a45c271246b3ff9babfbfcc96ff1e975e133a07f3aed0f565c88cffea41fc465469d73a1cc89cd6ad8fe1bfa83997d89a2b6a58bbeb1e9b6a5f8c3fe600df10cb1d4e0317de759f4c1e7d2a899ab3e50669b21f3d83f4df42b021e57fb63b1c163fac636a38454b3a876d6559fbea838b3f5272c88cd77f15057cf75d577cfd4b743cde3572743d3e437490d9b6a93ee6a5e536f17cf79337dee8cc70dc9c7f91c17fb65a0aff8dbd9e25afd139a05b58f1518ebaefa6ac97e257d23ba1bbe73a1ccb9cd6ab60df6a92b0b0e3f36601f2f59b72c73192cdbc358771b77f54ddb0fa53b704bbea551b7cec02d652e8263f74f75ded131b038d37724f0981cfff125d55fa424031e3cdeb9386771741c2dc4788cbbbf88d90fd276be2c65b00fa983febb698fc5e2cf337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d333fb3e2319fa1e3b3df5212c606ea63937c9e21df67c3e7625b9bd5f875fd0c509e39b537ea8cef28e7c23bca3b351bf67dc0ef4ad9b6a5ab676b51db52fcb1f57dc8b3e8a334eb61d1ccc1771dd37eb303bf9128faf5001e57fb63d4b73b6c6d4611a96651edac8bbe0be9e2ccd64fa12036dfa9fe222e9eeb4a7f11f3f8657ed708fb49880d9f83477d2facd8b01ded36c0d6af4df2f8cd051763dc603c9b7d05c51ff693f8426b2bfd24e26f078a0b5d1e23641f953e212596ba4a993f34ab29fb479dc7be42a5b0ae7f5a7e97295d9f046c531d7c3f36b97d655db27d6ddfaeed03ac31f92ec275e5e8d4c7d02017f2ffab594d59292765456b6157fb887c570ad9cde53a1acbe543995e96fa9705f1d6dffc96706f8359c5ce5f20cefe09e77aaedaa45e111a5d061a49193ce775d5afd66c23cd3ed3d827b2955106cf4fa5ccff87362aaa4fbaad4fa5abf385a8fe9c78be603ba731eb68f61d6feafd01f3f575888bfe80b2ee3641ed3e7981b1fef6b07ee16a15441f5ba44c5b58ffd1fcee95edda4f78b1bfa1943905aefd6ed0f94caefd8ed675bcedda0f978baa3bb60b711f1b311e91056359ca1418f1d82382bbab65d9f3239615adcc6f1fe275299e23c4ffddc8547bd3dba88bec53f87d7f2973a9b1dfc47fce943aff74f58d4c5997b441c596ba4a990eb0af15ea7c02b613be53d4dbf2bb4ce9ce3f453f55e7abe2af7372fb5eadd725dbf72a8bef6b803526df45e85bce3fc58fd87321df0b8e27524ef410ad855ded23720e87ece672dd8de5f2a14c1f4bfdcb8278eb7f95c17395c1ac62a704e2ac37bc6be1aaadee13a1517bd048cae0bd6bdb778d6df73a1aea3cd5fc5e7a7e70f8b77bf138e9e69ccdfeae9c79ffd6767ed2dee0c7f3935ba19d4d58ca9af7a565b938fba7e3fb40785e88ef03b9ba46ca0f6aeb996f70b8f4ddc6f0dda6017db7357cb76d40df5e73af3993e64c63fee073c866c0e8e25887c7d5ba30da8e7fcd81d1d53b9b251930e237aff178278c2ebe135edf3185f05ca70530ba78df38d3fbd59d8011bf31208c2eded1cef43bd5f8deb62cd70a185d8c6b846328d585d136d6516bf8ef605ca3a2fa8e0382631d1d038c2ec6064904b5c733391263376094e58e054617cf911241edfb6a4762c4e795b25cc23163ba63bbe3be3fc599de8368887e0551e71ae8dbc1fdff62ec9b50172d7abae5497bee83be1ddcff4a6a8163591e490b7c3ee7626ccd4450fb59d89178f019a22c770230963962ec9d01631930ca722702631f478c651930f60146b19f048c0eee432619fb64c088f7eb64b99381f16a478c5765c0783530ca72a700a38b7b8a09f05b17c66b8051963b1518af75c4784d068cd702a32c771a305ee788f1da0c18af034659ee7460bcde11e37519305e0f8cb2dc19c0788323c6eb3360bc011865b93381f146478c3764c0782330ca726701e34d8e186fcc80f1266094e5ce06c69b1d31de9401e3cdc028cb9d038cb73862bc3903c65b8051966b078cb73a62bc2503c65b8151962b00c6db1c31de9a01e36dc028cb9d0b8cb73b62bc2d03c6db8151963b0f18ef70c4787b068c7700a32c773e30dee988f18e0c18ef044659ee0260bccb11e39d1930de058cb2dc85c0d8d711e35d1930f6054659ee2260bcdb1163df0c18ef06c6be16c67e8e18efce80b11f30ca729703e33df13326afa5fb65c0780ff0dc1b3f4f52b37b32e0b9d72d4ff21b8af7587cdd17bfafe4b6e81fd4bdeef701cf80f87992dbe2be0c7884211f9643cdee8f9f31a9d9800c18ef079e81f1f32435bb3f039e81a0d9fd16cd1e889f31a9d9c00c181f009e41f1f324357b20039e41a0d90316cd1e8c9f31a9d9a00c181f049ec1f1f324357b30039ec1418d660f5a341b123f6352b3c119300e019ef2f879929a0dc980a71c341b62d16c68fc8c49cdca33601c0a3c15f1f324351b9a014f056836d4a2d9b0f819939a5564c0380c782ae3e7496a362c039e4ad06c9845b387e2674c6a569901e343c0333c7e9ea4660f65c0331c347bc8a2d988f819939a0dcf807104f03c1c3f4f52b31119f03c0c9a8db06836d211e3c319308eb4f0c4fd4df4872dbe463baafba8a0ee7517867c580efb498c71c4383a03c631c028cb613f892a478c633260ac0246592ee198315d3f892af03d367edfc976a92aa8bb3e63ddf2a4ed2781bec739d2626c50772dc6b9e549db4f027d8f77a4c5b8a0ee5a8c079e090eb448808fbaf008433e2c87fd24263a629c9001e3446094e5b09fc424478c1333609c048cb21cf69378c411e3a40c181f0146590efb494c76c4f848068c93815196c37e128f3a629c9c01e3a3c028cb613f89c71c313e9a01e363c028cb613f89c71d313e9601e3e3c028cb613f89271c313e9e01e313c028cb613f89271d313e9101e393c028cb613f89a71c313e9901e353c028cb613f89a71d313e9501e3d3c028cb613f89671c313e9d01e333c028cb613f89671d313e9301e3b3c028cb613f89298e189fcd80710a30ca72231d33a6bb7e99d2c87d475dab3476df51d7258dddb78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74cbe9f73e03b013e64ca31e6cb202f0cf9b0dc48cfd8a81991a7203e9e42ac3bfa7a9ea0eecf5b78721cd51d7dbd40507761c836c6e7b280716416307a1d537d10ebc3a8785e74c4f342063c2f02cf4b8e785ecc80e725e079397e9e644cbd94018f30e4c37223b380f1b92c60f43a7a1d9918bd8e4d4747cfe8193da3673c1a8cd9d0867bc6ac88c7e2fa322a9ea9f1f324357b39039ea9a0992c77af5bc6e2fa322a9e69f1f324359b9a01cf34d06caa4533078cc5f565543cd3e3e7496a362d039ee9a0d9348b660e188bebcba87866c4cf93d46c7a063c3340b3e916cd1c3016d79751f1cc8c9f27a9d98c0c78668266332c9a39602cae2fa3e299153f4f52b39919f0cc02cd665a3473c0585c5f46c5333b7e9ea466b332e0990d9acdb268e680b1b8be8c8a674efc3c49cd6667c03307349b6dd1cc0163717d1915cfdcf879929acdc980672e6836c7a2192be3c82c607c2e0b181deb585c5f46c533cf11cfdc0c78e601cf2b8e78e665c0f30af0bc1a3f4f32a65ec9804718f261b99159c0f85c16307a1dbd8e4c8c5ec7a6a3a367f48c9e3133c6e7b380d16f6bcfc8cae8e0fa2aed3b34af3472df51efd03476df51efd03476df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c33f97e2d7edfc599bec3fa1af0b878a7d6513d0bd57a5fd7ebfa2646fd94566f185abd6268950f655e07fdde70a05f0ef89575cbbcf8cb94f962026647be8b8f0bd7710cd45f7c3c67e8a1fcbfe9a8ee516dfd9b8ddc77545bdfd87d47b5f58dddb78f731fe74dc1b78f731fe74dc1b78f731fe72cbe319f1bd49cb7cbf795d43aded2f9167a5eca3f0fcb49997ead52ffdb047e1f72e1dbef43fe58d1147cfb38f771de147cfb38f771de147cfb38e78b738c87ab1b8027307882343c4f92f17426e3194bc633948ce71e329e9bc8787a91f14c26e32926e39949c6f33019cf4b643c83c878ee24e3b9968ce70a329ea7c978ba92f18c27e31946c6731f19cf2d643c65643c8f91f19492f1cc22e3194dc6f33219cf60329ebe643c2f90f15c4fc6f32c194f77329e39643c9792f14c24e3b9848ce721329e42329efbc9788e23e36943c6731b19cf55643c4f90f17422e3994dc65345c633958ca79c8ca71f19cf95643c3792f1f424e39947c6f308194f1119cf08329e07c878ee20e3694ec6730d19cf53643c5dc878c691f1b427e3a920e39946c6d39f8ce766329ede643c8f92f19490f18c22e379908ce72e329e86f81e47263c53c878ae23e379868ca71b19cf04329ee9643c1793f15492f10c20e3c923e3c927e3e940c6732b194f1f329ec7c9783a92f18c21e31942c6733719cf8b643c3790f1f420e3994bc633898c670619cf70329e81643c9791f11c4fc6d3968ce776329e1c029e4470f8379213f0fb6b606b662cab3e2bd5ada0e6f7b7b5bd192cf38ece37b7acfb6db0c9b7aadeb12c8b3abd0d7529d3f9c27f6d4aea84beca605efce501c73b243cb793f1b425e3399e8ce732329e81643cc3c9786690f14c22e3994bc6d3838ce706329e17c978ee26e31942c633868ca72319cfe3643c7dc8786e25e3e940c6934fc69347c633808ca7928ce762329ee9643c13c878ba91f13c43c6731d19cf14329ed7c878ee22e379908c6714194f0919cfa3643cbdc9786e26e3e94fc6338d8ca7828ca73d19cf38329e2e643c4f91f15c43c6d39c8ce70e329e07c8784690f11491f13c42c6338f8ca72719cf8d643c5792f1f423e32927e3994ac65345c6339b8ca71319cf13643c5791f1dc46c6d3868ce738329efbc9780ac9781e22e3b9848c672219cfa5643c73c878ba93f13c4bc6733d19cf0b643c7dc9780693f1bc4cc6339a8c6716194f2919cf63643c65643cb790f1dc47c6338c8c673c194f57329ea7c978ae20e3b9968ce74e329e41643c2f91f13c4cc633938ca7988c6732194f2f329e9bc878ee21e3194ac633968ca73319cf93643c575b785e73c423efbbcbba65fe3512df0eb643a15aefbb8eea345fafaba55eaff08bbf5c2853746ceabf7a3e84cb0a97f97d02ecfb3d1f347acb515dcc313165fead46eebb8de1bb4d13f1ddd6f0ddb689f8f671eee39cc9f7fcf87d17e3b76d64ca31e6cb208fc71717df047254cf5ac7f66f62d44f69b5c0d0ea2d43ab7c28f32ee8b7c0817eb6f30599177f99325f4cc08c715110c41b17efc55fa762d597e618d0f53d435facd7fb8e348d3a86bcdfc87d471d431abbefa8634863f7ede3dcc77953f0ede3dcc77953f0ede3dcc73993ef6a9d8ff1bab1107da87bbf723d500d7e17e97c4e8c7ed5ba16ea75b5d0eb168e45c023655e817bd17e9ff7fb7c5cbefdb1cdc77953f0cd1ce7665e9e215e026cae9ef146c562433c5f3e9abea362b1b1fb8e8ac5c6eedbc7b98f7326df8be3f79d7c86f85a507b4af70c7131f02c74a085a37a26af9d9618757acda8533e94a9867a2e7150cf1cf02beb96f925b01db28d59f14cd1791cdf45ca4d216114db42b73cc9fd6b4a507b4ab77f2d011e07fb4191a37a26f7afa5469da658749732d550cfa50eea69db77647e296c876c63563cf2eeaeb026a0dc0b248c625bec9627b97fbd10d49ed2ed5f4b81c745fbe3a89ec9fd6b9951a7172cba4b996aa8e73207f5b4ed3b32bf0cb643b6312b1e19cb44581350ee451246b12d71cb539a803acb946eff5a063c2eda1f47f54cee5fcb8d3abd68d15dca54433d973ba8a76ddf91f9e5b01d3cb367b6312b1e796752581350ee251246b12d75ca535a98803acb94ae1d5b0e3c2eda7947ba27dbb115469d5eb2e82e65aaa19e2b1cd4d3b6efc8fc0ad80e9930cfcf42e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b991974563c2febbcb026a0dccb248c625be69627f9fececb41ed29c7982f83fc0ae059ee401f47f54cf67b5f69d4e9658bee52a61aeab9d2413d6dfb8eccaf84ed9009f3fc2c64aece4266069d15cf549d17d604949b4ac228b6e56e7992edd8d4a0f694ae1d5b093c2eda7947f54cb663ab8c3a4db5e82e65aaa19eab1cd4d3b6efc8fc2ad80e9ed933db9815cf349d17d604949b46c228b6154e798a93ef214e0b6a4fe9dab155c0e3a29d77a47bb21d5b6dd4699a457729530df55ceda09eb67d47e657c376c884797e1632576721b3d7d9eb1cc55c9d85cc5e67af7314737516327b9dbdce51ccd559c8ec75f63a4731576721b3d7d9eb1cc55c9d85cc5e67af7314737516327b9dbdce51ccd559c8cca0b3e299aef3c29a8072d34918c5b6d2294f49f2b9c3f4a0f694eeb9c36ae071f15cc691eec9e70e6b8c3a4db7e82e65aaa19e6b1cd4d3b6efc8fc1ad80e8d9d797e1632577be60661f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e6286686d8503c33745e5813506e0609a3d856b9e5497ef76046507b4ad76f670df0ac76a08fa37a26fbedac35ea34c3a2bb94a9867aae75504fdbbe23f36b613b7866cf6c63563c33755e5813506e2609a3d856bbe549b6633383da53ba766c2df0b868e71dd533d98ead33ea34d3a2bb94a9867aae73504fdbbe23f3eb603b7866cf6c63563cb3745e5813506e1609a3d8d6b8e549b663b382da53ba766c1df0b868e71dd533d98ead37ea34cba2bb94a9867aae77504fdbbe23f3eb613b7866cf6c63563cb3755e5813506e3609a3d8d6bae5294e409d654ad78ead071e17edbca37a26dbb10d469d665b749732d550cf0d0eea69db77647e036c876c63563c73745e5813506e0e09a3d8d6b9e549ee5f7382da53bafd6b03f0b8687f1cd533b97f6d34ea34c7a2bb94a9867a6e74504fdbbe23f31b613b641bb3e299abf3c29a8072734918c5b6de2d4f72ff9a1bd49ed2ed5f1b81c745fbe3a89ec9fd6b9351a7b916dda54c35d47393837adaf61d99df04db21db9815cf3c9d17d604949b47c228b60d8e7912506799d2ed5f9b80c745fbe3a89ec9fd6bb351a77916dda5ccfb50cfcd0eea69db77647e33f0c87435f0b88acbc0e0092cfac8f424194f67329eb1643c43c978ee21e3b9898ca71719cf64329e62329e87c9780691f1dc49c6732d19cf15643c4f93f17425e3194fc6338c8ce73e329e5bc878cac8781e23e32925e3194dc633988ca72f19cff5643ccf92f17427e3b9948c672219cf43643c85643cf793f1bc4fc6731c194f1b329edbc878ae22e379828ca713194f15194f39194f3f329e2bc9786e24e3e949c6f308194f1119cf08329e07c878ee20e3694ec6730d19cf53643c5dc878c691f1b427e3a920e3e94fc6b3808ce766329ede643c8f92f19490f18c22e379908ce72e329eebc8789e21e3e946c633818ce762329e4a329e01643c79643cf9643c1dc8786e25e3e943c6f338194f47329e31643c43c878ee26e3b9818ca70719cf24329ee1643c03c9782e23e3399e8ca72d19cfed643c39043c89e0f077f112f0fb02b0c93b63f3c0f681ce6f045b338b0f7916b1196cb93a2feb6815a66b0b0e5f37eae4ea3d39f45506f3e22f0f383e20e1b99d8ca72d19cff1643c9791f10c24e3194ec633898ca70719cf0d643c7793f10c21e31943c6d3918ce771329e3e643cb792f17420e3c927e3c923e31940c65349c6733119cf04329e6e643ccf90f15c47c6731719cf83643ca3c8784ac8781e25e3e94dc6733319cf02329efe643c15643cedc978c691f17421e3798a8ce71a329ee6643c7790f13c40c633828ca7888ce711329e9e643c3792f15c49c6d38f8ca79c8ca78a8ca71319cf13643c5791f1dc46c6d3868ce738329ef7c978ee27e32924e379888c672219cfa5643cddc9789e25e3b99e8ca72f19cf60329ed1643ca5643c8f91f19491f1dc42c6731f19cf30329ef1643c5dc9789e26e3b9828ce75a329e3bc9780691f13c4cc6534cc633998ca71719cf4d643cf790f10c25e3194bc6d3998ce749329eab2d3c0b1cf198e326c8fc0202df6abe3be8a2a604fc8edf597fdf11e3028351e6df0746e475ad591b83a78da1d9d1f4adea2fefeac83d70dc5ef8de39c3f66ad3009ab53578da1a9a1d4ddf4a0b79b62def0ce2f6c2efd4326c2f7cafda41fb5c9a3078d49463cc97417eb3637d1cd5b310dfbbfe26c6f52aadb6185a2d30b4ca87329b40bf2d0ef4cb01bfb26e99177f9ed93347312b1ee94b62fb1e403f1246b1e1b8181fc6cf539a3078d494ae7dfcd0b13e8eea996cc7b60676dd3f04dda50cc6ea5607f5cc01bfb26e99df6af15d10c4abc5b63a68b1cdc2b3ad81b5107f99326fca4266069d158fbc6b20ac0928d79f84516c5b80677bfc3ca50983474de9dac7ed8ef57154cf649bb023b0ebbe1d749732b87fed7050cf1cf02beb96f91db01d3261de9a85cc5ee7fa312b1e79475b5813506e0009a3d8b601cfced8798a0b13068f9ad2b5633b1debe3a69ea9766c5760d77d27e82e6570ffdae5a09e39e057d62df3bb603b7866cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367e666563c03755e5813506e2009a3d87600cfeed87952cf1d90474de99e3bec76ac8f9b7aa69e3bec09ecbaef06dda50cc6ea1e07f5cc01bfb26e99df03dbc1337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d3337b3e219a4f3c29a8072834818c5b60b78f6c6cf539a3078d494eeb9c35ec7fa38aa67f2b9c3bec0aefb5ed05dca60acee7350cf1cf02beb96f97db01df67966cf6c61563c83755e5813506e3009a3d8f600cffed87952cf4f91474de9dab1fd8ef57153cf543b7620b0ebbe1f74973218ab071cd43307fccaba65fe006c874c98b76621b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec756e3a3a2b9e729d17d604942b276114db3ee0f928769e92c284c1a3a61c63be0cf21f39d6c74d3d53cf1d0e0676dd3f02dda50cee5f071dd43307fccaba65fe206c87c6cebc350b997d6c340cb38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c333473133c486e2a9d079614d40b90a1246b11d009e8fe3e7294d183c6aca31e6cb20ffb1637d1cd533d96fe75060d7fd63d05dcae0fe75c8413d73c0afac5be60fc176f0cc9ed9c6ac782a755e581350ae9284516c0781e793f8798a13068f9ad2b5639f38d6c7513d93edd8a7815df74f40772983b1faa9837ae6805f59b7cc7f0adb21db9815cf709d17d604941b4ec228b643c0e320ee923cf9068fcc7f42e05bcd57e97c9efe8fdbab0a1819b6577e0368d6c6e069636876347dabfa8fd5f9e3f47fdc5e638191617bb56900cdda1a3c6d0dcd8ea66fa5c5389d3f5effc7ed350e1819b6575bb73cc50983474de9ce373e059e6fc7cf93bc8efb34039e6f03cfb7e2e7297254cf42b5deef007b5ceb555a7d6668f5a9a1553e944186cf1ce897037e65dd322ffe3cb3678e62c6b650581350ee131246b17d0b785cb41baaee57e875c9fa5b84e90727d6f875717f0def2db4d4eb150ef1970b65ce6e57c3f613cd9607bfcb7653f53968d81cbdf35664bbcf2bf3e22f2fb05febbbba871a75efe120f01cb46876c0a2d97e478c070c4699df0f8cb6fbbc071cf144dd77167fd8661c24d50cdf03fe08785c9d1747c599eb7d2ed3f3cb8f2c3cdfc4c75388b181be5cc42ab66d75a9bb6ddf89b1ee45f80c0b7d39d80792c7a90e7a5db27e752cf8af139d6a5e8aed831ca73a1875ce8532ff7d4e0ddbff4d739c6a161c7e5fb840dba58cfcfe8db69beb28d0eb96f9eefa3fc689d8fc31b0f673c4ee86966c9ae1bef5b145c71e16ee1e04dc188f0db1ada3ee7de0b6ee61e8c8a6196eeb4f2c3af6b470f724e066dcaf7b1a3ab26976a4fdba9f85bb1f0137e37eddcfd0914db323edd7fd2ddcfd09b819f7ebfe868e6c9a1d69bf1e60e11e40c0cdb85f0f307464d3ec48fbf5400bf740026ec6fd7aa0a1239b6647daaf0759b807117033eed7830c1dd9343bd27e3dd8c23d98809b71bf1e1cd4d6914db323edd7e516ee72026ec6fdbadcd0914db323edd71516ee0a026ec6fdbac2d0914db323edd79516ee4a026ec6fdbad2d0914db323edd7c32ddcc309b819f7ebe1868e6c9a1d69bfaeb27057117033eed755868e6c9a1d69bf1e6be11e4bc0cdb85f8f357464d3ec48fbf5380bf738026ec6fd7a9ca1239b66b6fdda51ffb28cfb217fec549fd4f8b399bc87857d495cc494a3382874d4d724d90f79bfa1d5c78656f85dff03a09fab3e5951fdc6c49f67f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b667e667ccf139faf48b9867807b82e8c62c367522eeef3abba5fa9d725eb6f11a6db4faef11bff738be2e47300d15fdec7bcd2a8732e94d971760d5b5fcd86cf17f1b9a86d5b1e88bd0e757be71cdfd3c7674147f379e74716cdf65b34dbe788d16c33647e1f308a7efb81c7d5fe78c0e0317ddbde0d67d32caa9d7515f7517166f35d109befe2a16ebe85505ca8bed1764c70787b2275c07dd7451c66fa4d00dc2f1c3c772f72f5febfaad33ea34e078d3ae543998ba19efb1cd4b3aefb964c57038fabf6283078028b3e323523e379928ca73319cf58329ea1643c1790f1dc43c6731a19cf4d643cc790f1f422e3994cc6534cc6f33019cf20329e76643c7792f19c48c6732d194f2e19cf15643c4f93f17425e3194fc6338c8ce722329e43643c9793f1dc47c6730619cf2d643c09329e32329ec7c8784ac9784693f10c26e339978ca72f19cfc9643cd793f1b424e379968ca73b19cf44329e4bc9781e22e3b9848ca7908ce77e329eb3c8786e23e3398e8ca70d19cf55643c4f90f17422e3a922e32927e3399f8ca71f19cfa9643c5792f1dc48c6d39a8ca72719cf23643c45643c23c8781e20e339878ce70e329e13c878ae21e3694ec6f314194f17329e71643cedc9782ac8782e24e3e94fc6733a19cfcd643cc792f1f426e379948ca7848c671419cf83643c05643c7791f19c44c6731d194f0b321ed7ef0166caf30c194f37329e09643c95643c1793f10c20e339938ce756329e3c329e7c329e0e643c7dc8781e27e3e948c633868c670819cf79643c7793f19c42c67303194f2b329e1e643c93c8788693f10c24e3399b8ce732329edbc9788e27e3694bc69343c093080eff16137effeb20d8f6e93c7e5bb099657df25c58caabe3d0ad0587afbb9965ddfb2d0ca8d3dea0a62e653a5ff8af4d499dd05719cc8bbf3ce0d84fc2d3968ce778329edbc9782e23e3399b8c672019cf70329e49643c3dc8785a91f1dc40c6730a19cfdd643ce791f10c21e31943c6d3918ce771329e3e643c1dc878f2c978f2c8786e25e339938c670019cfc5643c95643c13c878ba91f13c43c6f311194f0b329eebc8784e22e3b98b8ca7808ce741329e51643c25643c8f92f1f426e339968ce766329ed3c978fa93f15c48c65341c6d39e8c671c194f17329ea7c8789a93f15c43c6730219cf1d643ce790f13c40c633828ca7888ce711329e9e643cadc9786e24e3b9928ce754329e7e643ce793f19493f15491f17422e379828ce72a329e36643cc791f1dc46c6731619cffd643c85643c9790f13c44c6732919cf44329eee643ccf92f1b424e3b99e8ce764329ebe643ce792f10c26e3194dc6534ac6f318194f19194f828ce716329e33c878ee23e3b99c8ce71019cf45643cc3c878c693f17425e3799a8ce70a329e5c329e6bc9784e24e3b9938ca71d19cf20329e87c9788ac9782693f1f422e339868ce726329ed3c878ee21e3b9808c672819cf58329ece643c4f92f13423e3b9dae0c1dfd5b9b5bc1fb60f6cf2fbb3baf16aa3d72565e49988bab7b4c7b0a9faee7654df3d41cd5406f3bba1bec2be0778f638e2d96bf098bef320df0334db65d814e34e478cbb0c4699df098ca2df2ee0d9e58867b7c163face837c4fd06c8761538cdb1d31ee3018657e3b308a7e3b806787239e9d068fe93b0ff2fd40b36d864d316e75c4b8cd6094f9adc028fa6d039e6d8e78b61b3ca6ef3cc8f707cd3e346c8a718b23c60f0d4699df028ca2df87c0f3a1239ead068fe93b0ff20340b30f0c9b62dcec88f1038351e63703a3e8f701f07ce088678bc163face83fc40d06c9361538c1b1d316e3218657e23308a7e9b806793239ecd068fe93b0ff28340b30d864d31ae77c4b8c16094f9f5c028fa6d009e0d8e78361a3ca6ef3cc80f06cdd61936c5b8d611e33a8351e6d702a3e8b70e78d639e2596ff098bef3205f0e9aad316c8a71b523c63506a3ccaf0646d16f0df0ac71c4b3d6e0317de741be02345b65d814e34a478cab0c46995f098ca2df2ae059e58867b5c163face837c2568b6c2b029c6e58e1857188c32bf1c1845bf15c0b3c211cf4a83c7f49d07f9e1a0d932c3a618973a625c6630cafc526014fd9601cf32473ccb0d1ed3771ee4ab40b325864d312e76c4b8c46094f9c5c028fa2d019e258e78961a3ca6ef3cc88f05cd161936c5b8d011e3228351e61702a3e8b708781639e2596cf098bef3203f0e34ab366c8af17d478cd506a3ccbf0f8ca25f35f0543be25968f098bef320df176cc25b04b6f774be186c0b74be046cf375be146cefea7c47b0bda3f39dc0f6b6ce7706db5b3adf056c6fea7c57b0bda1f3ddc0f6bacef702db6b3adf1b6cafea7c19d85ed1f93e609ba7f357816daece5f0db6393a7f0dd866ebfcb5609ba5f3d7816da6ce5f0fb6193a7f03d8a6ebfc8d609ba6f337816daacedf0cb69775fe16b0bda4f3b782ed459dbf0d6c2fe8fced607b5ee7ef00db733a7f27d8a6e8fc5d601ba9f37783ed5e9dbf076c9feafc7d60fb96cedf0fb66febfc0360fb8ece3f08b6cf747e08d8beabf343c1f63d9d1f06b6efebfc4360fb81ce8f00db0f75fe61b0fd48e74781edc73a3f1a6c3fd1f93160fba9ce8f07dbcf747e02d87eaef313c1f60b9d9f04b65feafc2360fb5ce72783ed573aff28d87eadf38f81ed373aff38d87eabf34f80ed0b9d7f126cbfd3f9a7c0f6a5ce3f0db6af74fe19b0fd5ee79f05db1f745eda35d5cefe51e70b8278dbd9af839aa9007c8b3f55e64f3adfca2823cbe6429952fd411ff58c437dcb54da616997954ddae1f7c026edf002b0493b3c1f6cd20ebf0b366987df019bb4c36f834ddae1b7c026edf09b609376f80db0493bfc3ad8a41d7e0d6c653aff2ad8a41d7e056cd20ecf039bb4c373c126edf01cb0493b3c1b6cd20ecf029bb4c333c126edf00cb0493b3c1d6cd20e4f039bb4c353c126edf0cb609376f825b0493bfc22d8a41d7e016cd20e3f0f3669879f039bb4c353c026fbcbd76093b67924d8a46dbe176cd2367f0a36699bbf0536699bbf0d36699bbf0336699b3f039bb4cddf059bb4cddf039bb4cddf079bb4cd3f009bb4cd3f049bb4cd3f02db689dff31d8a46dfe09d8a46dfe29d8a46dfe19d8a46dfe39d8a46dfe05d8a46dfe25d8a46dfe1c6cd236ff0a6cd236ff1a6cd236ff066cd236ff166cd2367f0136699b7f0736699bbf049bb4cd5f81ed599d97b6ba35d8e459b19a0affc509c7e16906be84a92c88b7edc7a90cf2cf40dd659a46c633968ce775329e0bc8785690f12c27e3398d8ce703329ecd643cc790f1ec23e3d94bc6339b8ce71d329e41643cedc8784e24e3c925e3b9828ca79a8ce755329e8bc8780e91f15c4ec6730619cf26329e8d643ccbc8789692f124c878f690f1ec26e3799f8c672619cf5b643c83c978ce25e339998ca725194f77329e4bc978e691f15c42c6b3848c6731194f2119cf59643c1bc878d693f12c20e3398e8ca70d19cf2e329e9d643cd3c978be26e3a922e379838ca79c8ce77c329e7e643ca792f15c49c6d39a8ca72719cf1c329e45643c0bc978de25e339878c671d19cf5a329e13c8787690f16c27e3694ec633958c671c19cf6b643cedc9782ac8782e24e3e94fc6733a19cfb1643c53c8786691f1bc4dc6f37b329e02329e35643cabc9784e22e3d946c6b3958ca70519cf47643caf90f15492f1bc47c633808ce74c329e3c329e7c329e0e643c23c9786690f1bc49c6731e19cf2a329e95643ca790f17c48c6b3858ca795fecfc2d3838c672e19cf70329ef9643c03c978ce26e3b98c8ce778329eb6643c39043c09e008c026bf3707db573a7f086cf2bd9e8fc0f6a5ce5783ed773aff2cd89eb2d89a59f884e12bb0c9bbd64f834deecf7c09367987e3776093e3a2f857f37d0b0ee76f06cb889fe6167ef4f73b0b97e4717bcb326541bcdb1b7d9505877f4f290f389e26e1694bc6733c19cf65643c6793f10c24e3994fc6339c8c672e194f0f329e56643c5bc8783e24e339858c672519cf2a329ef3c878de24e39941c633928ca703194f3e194f1e19cf99643c03c878de23e3a924e379858ce723329e16643c5bc978b691f19c44c6b39a8c670d194f0119cfefc978de26e39945c633858ce758329ed3c978fa93f15c48c65341c6d39e8ce735329e71643c53c9789a93f16c27e3d941c6730219cf5a329e75643ce790f1bc4bc6b3908c671119cf1c329e9e643cadc978ae24e339958ca71f19cff9643ce5643c6f90f15491f17c4dc6339d8c672719cf2e329e36643cc791f12c20e3594fc6b3818ce72c329e42329ec5643c4bc8782e21e39947c67329194f77329e96643c2793f19c4bc633988ce72d329e99643cef93f1ec26e3d943c69320e3594ac6b38c8c672319cf26329e33c8782e27e33944c6731119cfab643cd5643c5790f1e492f19c48c6d38e8c671019cf3b643cb3c978f692f1ec23e339868c673319cf07643ca791f12c27e35941c6730119cfeb643c63c978a691f134b3f01c72c423c74a59b7cc1f22f0addec3957bf1fbf4ff04fc8ee337573b623c6430ca7c35308a6d2ff07477c4b3dbe0d96dd1e268f9565ac8b73ff6e8ff09f81dbf57e82aa6ba1b8c326f8ba9ddc0d3c311cf4e8367a7458ba3e55b69217d1fa50f49027ec7f1f05cc5540f8351e66d3185e3b9f674c4b3dde0d96ed1e268f9565a485f43e9c39f80df71fc4b5731d5d36094795b4ce1785dfd1cf16c3578b65ab4385abe9516f2ee99bcb39c80df713c215731d5cf6094795b4ce1f810fd1df16c3178b658b4385abe9516f22d09f92652027ec7effbbb8aa9fe06a3ccdb620abf8f3cc011cf668367b3458ba3e55b6921dfaa936bf604fc8edfb7751553030c4699b7c5d466e019e88867a3c1b3d1a2c5d1f2adb418a4f3f20c2e01bf0f0246573135d06094795b4c6d049e418e78d61b3ceb2d5a1c2ddf4a8bc13a2f7d3213f0fb6060741553830c4699b7c5d47ae019ec8867adc1b3d6a2c5d1f2adb428d77979673001bf9703a3ab981a6c30cabc2da670fcdd72473cab0d9ed5162d8e966fa585bc7bbf46ff4fc0ef381ee760478ce506a3cc0f0646b1e1786f158e78561a3c2b2d5a1c2ddf4a0bf996967c833101bfe3f858ae62aac26094795b4ce17827958e78961b3ccb2d5a1c2ddf4a8be13abf42ff4fc0efc381d1554c551a8c326f8ba9e5c0b3dc11cf52836729916fa585bc0b277dd812f07b1530ae70c41815532b80516c4b8167a9239ec506cf6222df4a0b799623ef5c24e0f7b1c0b8cc1163544c2d0346b12d069eb18e78161a3c0b2d5a1c2ddf4a0bf976cc22fd3f01bfe378ed8b1d318e3518657e31308a6d21f02c74c413750faf217c47dd8f6a08df51f7561ac277d47d8286f01d758fbd217c475dbf3584efa86b9186f01d759fa1217c479dd33784efa8e7db0de13bea596d43f88e7aeed8d8f76f7f2c695ac792a3d9ae35d563896fcf39dbf371f1fb2e4e04b5af69d49463cc97411eaf5f1639d0c2513d0bf19af09b18d76bbb865f6868950f65f01ad5d5f5df388347e6c55f3632635ce4c4e7bb30013ee41d6565937b2def814dee712c009bdc03990f36b987f62ed8e47ed63b6093fb5d6f836db8ce8f049bdcbbc4fe48726f733bd8ca751efbc10cd6f9ad6093e744d8ff429ef56d019b3cafc5e7fef2cc7d33d8a4df043e6f96be2f1bc126fd97f039a7f4415b0f36e94788cfd7aa757e2dd8644c097caef3a5ceaf06db573a8fcf1364acce95607b52e7a780ed0b9dff1a6c4fe8fc42b0fd56e7f19ecfe33a3f166cbfd1f9b7c0f66b9d7f136c8fe9fc1b607b54e7f781ed573abf176c93751efb877eaef3bbc1f688ce63bfc45feafc4eb0fd42e75f07db249d7f0d6c1375fe55b0fd5ce75f01db049d9f07b69fe9fc5cb08dd7f93960fba9cecf06db4f747e16d8c6e8fc4cb0fd58e767806db4ce4f07db289d9f06b61fe9fc54b03dacf3bf07db0f757e1cd89ae9fc62b0c9f793f19eaebcb3b8146c324e09deab976f9554814dc6df5b0eb6d63a8fcf65e4bda4e160936fdb57824ddeffaf009b8c91540e3619c76930d8e45b6083c026df2b1b083619b37400d8645cd5fe60936f17f7039bbc4fd9136c3246480fb0c97754ba834dc6bec33181e57b97d560937782709c60f9eefe97609377cbbf029b8cdf846302cb37ae9e049b8c4bfa05d8ced1f927c026ef6bfe166c053aff38d8ced5f9df80ed3c9dff35d8e4fb958f814ddea979146cf21dfd5f814ddecd9e0cb68b75fe73b05da2f38f804dbe43f44bb0c958b1bf005b7b9d9f043679677e22d8aed0f99f834dc63a9b0036f9beeacfc026dff81a0fb6229dff29d88a75fe27602bd1f931602bd5f91f83ada3ce8f065b279d1f05b6ce3aff23b075d1f987c1d655e7a59d51fbb3dacf0feaf9b220bef332e5efe3a0f694eeda40189027ce73ed7ce0415f0762af7b71f2bc5ef6fb667abd124307c0f7bed87da7ae29f6eb75b5d0ebdd67f8ce85329fea46442db7077e2f833ac872788d2deb9665ae8465f71aeb6ea3ebbbdf517df7194cc2bd1f98a4cc6767d7947d423796ad619918d992d7c7126b0168885319e485c18d56c58578de5b179efdc013ff7e92ba5e771113b86fc57dbd6ede6332632d1fcaec03fdf63ad00ff77559b7cc8b3fcfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccfccc8a479e27e0736529779084516c0780677ffc3c85f81c56d6af9eeb3c00cf750ec4eeb7f6f3bd967abd85469d73a1ccaa736ad886e87c1efc2edb2d6a5bee8bbd0ee9b7a5f8cb83faec071e07db32c973c0e0317de759f4519aedb568b6c711a3d966c8fc1e60dca7f37b81c7d5feb8cfe0317d639bb19f54b3a876d645bf84747166eb8350109befe2a1ae9eebaa3e53aa2f8779fc3a68688a7d20c486cfc1f360994ff4ff04e8f309e87334db00b35f02b6531f03e3bed8198b6b3d0396b6ff4a4353ec03f1a2d656fa40c4df0e1417ba3c46c83e6af6adc0ba4a99e9709c9ba9f3d80fe820aceb5dcbef32e518f36590c7367557fc754e6e5fe9bf2adb7797c5f70e608dc977ad77397274123f62cf85fc3be7d4949572a287682dec386e15b29bcb7d6c2c970f65765bea5f16c45bff5d06cf2e8359c5ce1c88b377e15ccf559bb43b42a32b41232983e7bc0efa1459db48e1107faa8c6cff5646193c3f95328ba18d527591765eea89fd98f018e0ea7ce1a0513f99c7f305db398d5947151fb79f5cc3ebfa5aa05960d79aa5afdf66682fe2eeebb71962c8765e2aeb2f84f50b57ab20fad82265b61ac75117d793b82d4d3df7039394d909edd07fd6e3baee685da3475dd7ed76c083d71a32a53bbee331c645fbe2a89e85b663d75ea34ef950e662a8a783f398b4efa4ee02df2eb6396a21e750fb0c2d72a1cc778db6234a475907de07705b9762ebf960a1a52e52e6c7463bb5d30193cbed86e7596abd072c759532bf80f6ef73389fdfa77fc7b6f42f96df654ad71ee037e5b7c55fe7e4f695f71b65fb6eb3f8fe105863f25deb9b1472be2f7ec49e0bf93fc3f15bca891ea2b5b0ab7d44deef447673b97dc672f95066bba5fe6541bcf5df66f06c339855ecfc06e2ec2f70beefaadddc1ea15121682465f0598179bf05ef9de071bfa1ae0b64fe236014db2ed0f73f9dde2f4fb17d64b099f7cb6de78385063f9e0ffe6f68671396b2ee9f03a4ce6db05e528fc0a86b60d4d5d1f96b698ea16719f8e900f67d3a2f3acb6f788e2b6572daa5febbbb7f55fb3eb6704b3df079dd1e837bafa12bde8b6a09dc2aeecd6b0b3c4f777c4d5b8ae762e6f9105e8749993c60b79dc71db2d4c53c4e370b0ebf16fcc6288bd7d9e99633f31f19cbe03d830316265bdb17db7b3945858526bfaddd3b6830db7495fd00634ed665ee2b783e2465ce84ed96b094556dd27f9d58a38f6c47bcd76ebbcfe2ea7811759f45fc2946db3b932e9e6134c577d35ac7b6deaee5b6e76cecfd195a1bf9787c1757e0b1229d167b2c3caeee694669b1c7e23b3e2d3a0db5b573362d765b785c5d634669b1dbe23b462d2a6df7166c5aecb2f0b8bad688d26297c5777c5a74ae755f239d163b2d3cf1dfd348af053e13cb84793701736b231f8fefd272dbb33b9b163b2c3cae9edd4569b1c3e23b3e2d8a3ad9aed96d5a6cb7f06c6f602db65b7cc7a74597aeb67b2a362db659781cdc5f4babc5368bef18e36218de5f4ba7c5560bcfd606d662abc5778ce7879dd2dd33442d3eb4f0b8baf717a5c58716df316a3144f9de52072db65878b634b0165b2cbee3d3a2bca3f2fd411db4f8c0c2f341036bf181c5777c5a0ce9a27c6fae83169b2d3c9b1b588bcd16df315e4325e362531db4d864e1d9d4c05a6cb2f88e4f8b8ae4b9d6c63a68b1d1c2b3b181b5d868f11d9f1685c963ea863a68b1c1c2b3a181b5d860f11d635c24af27d7d7418bf5169ef50dacc57a8bef188f23c9b85857072dd65978d635b016eb2cbee3d3a23279ff696d1db4586be159dbc05aacb5f88ef19e4b322ed6d4418b35169e350dacc51a8beff8b428491e5357d7418bd5169ed50dacc56a8beff8b418967c26b6aa0e5aacb2f0ac6a602d56597cc778de996c2f56d6418b95169e950dacc54a8bef18cf3b93f72f56d4418b15169e150dacc50a8bef18dbcee479e7f23a68b1dcc2e36a8cc8282d6ce353c678de99d462591db45866e17135b6619416cb2cbe633cef4c1e4796d6418ba5161e5763514669611b0733c6b848b69d4beaa0c5120bcf9206d66289c5778cf7b5926de7e23a68b1d8c2e36a6c8e282d165b7cc7783d92bcc7b7a80e5a2cb2f02c6a602d16597cc7f8ac28790ebeb00e5a2cb4f02c6c602d1682effdb1fb4ef5e7161fd217eb0a438b5c28f36da32f56948eb20e7c8716eb521d7b5d52fdcade8fa84b35d445cafcc0e8cbf7be032647754dc6cc7b7a5dd237fd634b5da5cc4fdbd594fdb9ce27609b1c8275fdd1f2bb4c39c67c19e4453f55e7f9f1d73919ab320e906cdff916dfef006b4cbe8bd0778e4ee247ecb990ffba5d4d5929277a88d6c2aef691053a8fece6720b8de5f2a1cc024bfdcb8278eb3fdfe0996f3027df7b8038933872d376a5981644687405682465b0cfde21473c1f1b3cc221fe7282c3df459532b22cbe8bfa77a3dfaef483947a46f5917ccf51fda2fa488abfa87751cd3aaaf8f801f4fd94714164cc10659331404a603d9d0d9baa6b174775155fb26e99ef028c322649e786672cae2b63278351f17473a0198eb32253bae34537e0e9ea80c7513d93c7a1ee469dba1875ca8732f86e637707f5cc01bfb26e99ef0ebe5d6c73d4428ec9971a5ae44299bc82d47f397f8cd251d6a1e2b7b3a52eae74ec64f074b2f8eee5584759b7b489bd1ac0770fc37747c3b7dab731c6d4946edfee01cc3d1d30abf5f68e7fbd8578ce28f12c7e3a429dfa800671d509d725e7987d0c6d73217f7e414d59292765e5d829ec6a3f926d89ece672dd8ce5f2a14c2f4bfdcb8278ebdfdbe0e96d30abf386d30a6a381cec0fc918e86570c87c47d0ae778476bd403b2983c7de4e8eb4eb69f0c87c27e091f3abee6093f314e14fc0ef250dc06db67bdd2ddc62c3f1083b59183bc6cf589ceeb8d01118c5d613787a38d2ccdcd6971afae039412ba38c2c9b0b65ba14a4fecbbb5a6659b5df9d9b5353afe6da1edb7b6bba4d6fe9402f1c0f34007d0243439984a175503366689c3cc7063563824e9858357ec843c3ee1a967aec2968b90626fecfb154a319d830dfdc620b82da439fe6824d863e6d01b666862c38e4aa9497a1135dc8857ac8ba730dced6c012a76f1c3656a674a1d30a785c84b20a1d193a5687cebde3474c1c86f1d1c2e0ac4feca8df9aa72917b52e89835c0775472659b7cc8b3fa54fbece8f1d3274649ff10f4d1a3d6cccc409086bee5c98cf314430ffdb96c120c19d49d6d3c210e7d8f8c529c5318a4dbe00fcc9240cad839a718c63e44906aa8c353c74c8a851774c2a1f3562e87593c60c9d38a26a0c2adada502e4a6df9bd25d86c4d1d965513eebeb86c2b8bcd36e1a8ceadc1262df83160139e63c1d61cf252dedc324ef6918b61fd12d6ea37254e0b5df156414d08c86149b52f6a1f529f5155a7036a68693594b4da9cea8e9d1a1a5a7d454e0dfdac867a56433baba19cd5d0cd6aa8663534f3d9416ae86575f7b220480da57c5e901a2af982203514f245c0f76d60be24489d7ea8a18cdb07a9a18ad5ed43f5fab8fad49a7abf5d9dc6aacb6375eaa72e75d469983afd52a7d9ea1682ba9da44e6dd469a33a2552a731eab4bcb7d6ba4f98ae0ad3d561ba264cd786e9ba305d1fa61bc27463986e0ad3cd61ba254cb786e9b630dd1ea63bc2746798ee0a53df30dd1da486d3be274cf706a9e1b6ef0b524371df1fa486e97e20480de1fd60901ade7b48901afa7b68901a167c58901a32fca120359cf888203554f1c82035b4f1e820353cb21aa67c6c901a125d0db5ac8665564338aba19dd5d0d06a186935e4b41a8a5a0d65fd44901a22fba9303d1da486d07e364c53c2f45c989e0fd30b617a314c2f85e9e520352cbb1aae5d0de33e23480dfb3e2b480d13af868f57c3caabe1e6d530f46a787a356cbd1acefe8d30bd19a6b7c2f476907a2ca01e87a8c704ea16bcba45ac1ed35407a9dbd78b82d46366f5d85d754350dd325437951541aa1b93ead6a5bab9a96e7faa1ba4ea16aabac9aa6ec3aa1bb5ea56aebad9abd70ed46b18eab514f59a8e7a6d49bdc6a55e6b53aff9a95735d5ab8fea555ef56af3be20756bfa40907a5ca96e57abdbd2ea16bdba85fe6998be15a462f23b61fa2c4cdf0dd3f7c2f4fd30fd20480d19ad869756c353aba1acd510d76a386c3574b61a7a5b0dc9fd79901aea5b0d15fe9b2035dcf81761fa5d901af2fcab2035dcfd1fc2f47598fe18a63f85e9cf61fa4b98fe1aa67f0bd3bf87e96f61fa7b98fe234cff086a8635c786a440b73ee7eaf92113270e1b3d7662c1c4aa82d193464d1c3176d4630593474c1c5e50f5c8b0f195a3aa26e3c2bfd50bcb98ec7dc68f1ff258c1883115c31e2da89a34b1a0aab2a0bc6ad2988a5a07d2ffa7173aeb708f432a2aa29de535ff17488f6f5e3fa7edf47232dafd8de9eb765ef37a0872497d16baa59e15ba5b1fc1e492af6fea7cb060c2a8aa8905850563c2bfe181b76af2b08a0e05f8db8450e409130b264c1c327e6241e5f8aad105451d70bd85c7d6a312f38e750353727afdc4f9e4ecd4ff7a85d80be7d4438145e7d48f74d339ff02e987f574fa597d6af8a3fa2cf45ff5240cda45ca326152f9c4f143864e8c5eb8c5bfb270a25d3daa7946bbfa55f35bf571f6fdfa2cf4b77a12260aeae1ac7341dd9d05ff035566efd0b0020600", + "bytecode": "0x1f8b08000000000000ffed9d07741d45b6ae5bb61ce0481893b3450e06a3e49c64724ec6608c31b62c0b1b073962323643700ee460839c73c638478c6166983b393181811926dd3b7367bdf5e6be77df7a8ff5bacea9bdf4ab5c7daca3e992ff2355af5552f53ed5bdbffa7b7775aaeefa47100439416a6a1ea68b822327f9bd4cff2ffcd7a6a218d755e89233274b389b650967f32ce1cccd12ce1659c2d9324b385b650967eb2ce13c2e464ec5d62ca83dc5cd7bbc035de3664c6499a67959a0697e96697a421668da26c88e36eac42ce16c9b259c276509e7c959c2794a96709e9a259ca76509e7e959c2794696709e99259c676509e7d959c2794e96709e9b259ce7650967bb2ce12cc812cef3b384f3822ce1bc304b382fca12ce8bb384f3921839db03e7a5faff65faffe5faff15fabf94bd52ffbf4affefa0eb98abe7af565c61520f698a8ddf4ac2541aa68e61ea64fcd6394c5dc2d4354cddf46f05fab7ee61ea11a69e61ea15a6de5a833e61ba264cd786e9ba305d1fa61bc27463986e0ad3cd61ba254cb786e9b630dd1ea63bc2746798ee0ad3dd61ba274c7dc3746f98fa85e9be30dd1fa6fe617a204c030c9607c334304c0f856950981e0ed3e0300d095379988686a9224cc3c25419a647c2343c4c23c2f4689846866954984687694c98aac234364ce3c2343e4c13c234314c93c2f458982687e9f1303d11a6270dcd9e0ad3d3617a264ccf1a9ccf85694a98a686e9f9307d2b4c2f84e9c530bd14a697c3342d4cd3c334234c33c3342b4cb3c334274c73c3342f4cf3c3f44a985e0dd36b617a3d4c6f84e9cd30bd15a6b7c3f44e98de0dd382302d0cd37b9a457684f7c3541da645615a1ca625615a1aa665615a1ea615615a19a655615a1da635615a1ba675615a1fa60d61da18a64d61da1ca62d61fa204c5bc3f46198b685697b9876846967987685697798f684696f98f685697f980e84e960983e0ad3a1307d1ca6c361fa244c9f86e9db61fa4e98be1ba6cfc2f4bd30fd9ba1f9f7c3f48330fd304c3fd2b61febff3fd165e5fedd4fc3f4339dffb9feff0bfdff97faffe7c632bf0ad3af0ddb6fc2f45bc3f645987ea7f35feaff5fe9ffbfd7ffffa0ff7fadffff51ffff93feff67fdff2ffaff5ff5ff7fd7ffff43ffff9bfeff77fdff3ff5ff7f84e9a18254be755033950531b551a595c9673f22fea541ed4969d15cff26ff0bb43d57cfcb7fd1ae859e6f61d85beaf996c67a5aebf9d686bdad9e6f6bd84fd6f3271bf653f5fca986fd743d7fba61bf48cf5f04f64400f786b55dd99a6b530ed8245e9b81ad85b635075b4b591dd85a695b0bb0c9f66d09b6e3b4ad15d88ed7b6d6604b68db71a26598f2b4ad2c882b560a87a8f5e6c7bd5efdbcec84f87987aaf5b671c47b62fcbcc3d47adb3ae055f171925ed7891037276b5b5bb09da26d2781ed546d3b196ca769db29603b5ddb4e05db19da761ad8ced4b6d3c17696b69d01b6b3b5ed4cb09da36d6781ed5c6d3b1b6ce769db39606ba76de782ad40dbce03dbf9dad60e6c17685b01d82ed4b6f3c17691b65d00b68bb5ed42b05da26d17814ddadf8bc126e78b97689b6a3b8ecb8165b45ddaade432d26683ed7269afc17685b4d5606b2fed34d8ae04df62bb0ada1ab175d03669b7d46fdd74be2c886b3f29ae54ebed1ef77ac335abf5f68c7fbdc9678ebd821a5dcbc04f77d0aab7cec7d8afa9087de7e8247ec49e0bf95ba0ac94133de4d823ecea18d343e77ba759ae9bb15c3e94e961a97f59106ffd7b1a3c3d0de616907713b325253e66eb3c651cb3fda1ac197b721ed41863f676e07010b39d7dccd679ca38662ba1ac197b722edc1863f641e07010b3e56e62b6b8d0c76ceabe5910d8634fae871a63cc8e008ef863b6a38fd9ba4f19c7ecf350d68c3db9266e8c313b1938e28fd9cee5fedca0ce53c6313b0fca9ab127f7671a63ccbe081c0e62b6d2b7b3759e328ed9f7a0ac197b72afb031c6ecabc0117fcc767514b3253e6683d433d020b0c79edcb76e8c31bb0838e28fd9a1fefe6cdda78c6376279435634f9ea134c698dda0f3ea39c38ff5738673c0f6136d3b1778e38fed8a8e8e62bbd8c776aa6f4810d863549ee735c6d8dea7f32a8e7f0efd11c4f60b6d3b1f6cbfd4b60bc0f6b9b65d08f572b00f94fb7da0ce53c6fbc0afa1ac19cbf26cb931ee033f040e07315be163b6ce53c631fb57286bc69ef473688c31fb05703888d94a1fb3759e328ed9ff0d65cdd8bb4ce71b63cc4a5f5375bef0a53e5fb8026c5f695b7bb0fd5edbae04db1fb4ed2ab07dad6d1dc0f6476dbb1a6c7fd2b642b0fd59db8ac0f6176d2b06db5fb5ad046cffae6da560fb0f6deb08b6bf695b27b0fd5ddb3a83ed3fb5ad0bd8fea16d5db54d3def92be5772deda1a58cb82f8b66d02749129c7982f837cb15b9ec27ce0415fa5f1fb2a51752f09ea5ef752e0e9e8a0ee09f051179e8ec0d3297e9e645fd4cef1af37b98d4b0c4d13e0ab04ead5c541bd72c097ac5be6c55f3ed8703fef6261ec1a3f63710ef89275cb7c5760141bb63bf2fe8fec3faa6d3e3fa786d7c1be943c3ea3bf32e0107fb950e69fed6aca5eacd9f2e0776c833b19364771998c0bf125eb9679f19707f5e9d4f08cc57565ec6830ba6a2372c097acdbf49d07f922b7faa4e5e94ce2dbc179b7b54d13cdbb3780efae86ef52c337b69d32a53bb67505e6d8af7ff4b1ad47fceb2dc47365b94e113f78fe80d71371d5097dcb758af8117b2ee46fcaa9292be5440f6987855dedc3b22d91dd5cae8bb15c3e94e96ea97f59106ffd7b183c3d0c6675bce909c74207fb433206ba1b1c325f0adaf588d0ae3b6827652e03ed1c9c7b26b5eb66f0c87c47e091f61bdbb3a206e62922f08de7b0782d27bfe37980abed556430cabc6d7b7505c68e164607e784c5e98e87a5c028b66ec053e248b3a8ed5a42e2dbc575650ef8907373f3da2617cadcd9bca66c458e53b6623c7796a9aed7bcf16fa7e242dc3feac2e3781f2a72148f8578ffe69b20de5833db25b3bd89bac7e3aa2d2f3178645efc7966cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367e667563cf23c01fb6d49b94e248c66ff3757f7f993dfe2d3ebc26740ff74da1facb8109ffd493f882b8c3ae74299939bd5b0fd37f40733fb12456d4b177d63d36d4bf187fdc11ae21962a9c163faceb3e883cfa55133577da0cc3643e6b17f9ae857043caef6c76283c7f48d6d4609a96651edacab3e7d517166eb4f58109befe2a1ae9eebaaef9ea96f879ac7af4e86a6c96f921a36d526ddd3bca6de2e9ef366fadc198f1b928ff3392ef6cb405ff1b7b3c5b5fa27340b6a1f2b30d65df5d592fd4afa4674377ce74299f39bd56c1bec5357161c796cc03e5eb26e59e60a58b687b1ee36eeea9bb61f4a77e0967c4ba36e9d815bca5c02c7ee9feabca3636071a6ef48e03139fee34baabf4849063c78bc7371cee2e8385a88f118777f11b31fa4ed7c59ca601f5207fd77d31e8bc59f67f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b667e66c5633e43c767bfa5248c0dd4c726f93c43becf86cfc5b635abf1ebfa19a03c736a6fd419df51ce857794776936ecfb80df95b26d4b57cfd6a2b6a5f863ebfb9067d14769d6c3a29983ef3aa6fd66077e2351f4eb013caef6c7a86f77d8da8c2252cda2da59177d17d2c599ad9f42416cbe53fd455c3cd795fe22e6f1cbfcae11f693101b3e078ffa5e58b1613bd66d80ad5f9be4f19b0b2ec6b8c17836fb0a8a3fec27f185d656fa49c4df0e1417ba3c46c83e2a7d424a2c7595327f685653f68f3a8f7d854a615dffb4fc2e53ba3e09d8a63af87e6c72fbcaba64fbdabe5ddb075863f25d84ebcad1a98fa1412ee4ff67b39ab2524eca8ad6c2aef611f9ae14b29bcb753496cb8732bd2cf52f0be2adbff92de1de06b38a9dbf409cfd13cef55cb549bd2234ba0234923278ceebaa5fadd9469a7da6b14f642ba30c9e9f4a99ff076d54549f745b9f4a57e70b51fd39f17cc1764e63d6d1ec3bded4fb03e6ebeb1017fd0165dd6d82da7df20263fded61fdc2d52a883eb64899b6b0fe63f9dd2bdbb59ff0627f4329731a5cfbdda4f3995cfb1dabeb78dbb51f2e1755776c17e23e36623c220bc6b2942930e2b147047757cbb217462c2b5a99df3ec4eb523c4788ffbb91a9f6a6b75117d9a7f0fbfe52e67263bf89ff9c2975fee9ea1b99b22e69838a2d7595321d605f2bd4f9046c277ca7a8b7e57799d29d7f8a7eaaced7c45fe7e4f6bd56af4bb6ef3516dfd7016b4cbe8bd0b79c7f8a1fb1e742be171c4fa49ce8215a0bbbda47e41c0ed9cde5ba1bcbe543993e96fa9705f1d6ff1a83e71a8359c54e09c4596f78d7c2555bdd2742a3f6a09194c17bd7b6ef1adbee7534d479aaf9bdf4fce0c86ff7e271d2cd399bfd5d39f3feadedfca4bdc18fe727b7433b9bb09435ef4bcb7271f64fc7f781f0bc10df0772758d941fd4d633dfe070e9bb8de1bb4d03fa6e6bf86edb80bebde65e7326cd99c6fcc1e790cd80d1c5b10e8fab7561b41dff9a03a3ab77364b3260c46f5ee3f14e185d7c27bcbe630ae1b94e0b6074f1be71a6f7ab3b01237e6340185dbca39de977aaf1bd6d59ae1530ba18d708c750aa0ba36daca3d6f0dfc1b84645f51d0704c73a3a0e185d8c0d92086a8f677234c66ec028cb1d0f8c2e9e232582daf7d58ec688cf2b65b98463c674c776c77d7f8a33bd07d110fd0aa2ce35d0b783fbffc5d837a12e5af474cb93f6dc077d3bb8ff95d402c7b23c9a16f87ccec5d89a89a0f6b3b0a3f1e0334459ee24602c73c4d83b03c6326094e54e06c63e8e18cb3260ec038c623f05181ddc874c32f6c98011efd7c972a702e3b58e18afc980f15a6094e54e034617f71413e0b72e8cd701a32c773a305eef88f1ba0c18af074659ee0c60bcc111e3f51930de008cb2dc99c078a323c61b3260bc111865b9b380f126478c3766c0781330ca726703e3cd8e186fca80f1666094e5ce01c65b1c31de9c01e32dc028cb9d0b8cb73a62bc2503c65b8151963b0f186f73c4786b068cb701a32cd70e186f77c4785b068cb703a32c57008c773862bc3d03c63b8051963b1f18ef74c47847068c7702a32c770130dee588f1ce0c18ef024659ee4260bcdb11e35d1930de0d8cb2dc45c0788f23c6bb3360bc071865b98b81b1af23c67b3260ec0b8cb2dc25c078af23c6be1930de0b8c7d2d8cfd1c31de9b01633f6094e5ae04c6fbe2674c5e4bf7cb80f13ee0b93f7e9ea466f765c073bf5b9ee43714efb3f87a207e5fc96dd13fa87bdd1f009e01f1f324b7c50319f008433e2c879a3d183f6352b30119303e083c03e3e7496af660063c0341b3072d9a3d143f6352b38119303e043c83e2e7496af650063c8340b3872c9a3d1c3f6352b34119303e0c3c83e3e7496af670063c83831acd1eb66836247ec6a4668333601c023ce5f1f324351b92014f396836c4a2d9d0f819939a9567c03814782ae2e7496a3634039e0ad06ca845b361f1332635abc8807118f054c6cf93d46c58063c95a0d9308b668fc4cf98d4ac3203c647806778fc3c49cd1ec980673868f68845b311f13326351b9e01e308e079347e9ea4662332e07914341b61d16ca423c64733601c69e189fb9be88f5a7c8d7654f75141ddeb2e0cf9b01cf69318e3887174068c63805196c37e12558e18c764c058058cb25cc23163ba7e1255e07b6cfcbe93ed525550777dc6bae549db4f027d8f73a4c5d8a0ee5a8c73cb93b69f04fa1eef488b7141ddb5180f3c131c6891001f75e111867c580efb494c74c4382103c689c028cb613f89498e182766c03809186539ec27f19823c64919303e068cb21cf69398ec88f1b10c182703a32c87fd241e77c4383903c6c7815196c37e124f38627c3c03c627805196c37e124f3a627c2203c627815196c37e124f39627c3203c6a7805196c37e124f3b627c2a03c6a7815196c37e12cf38627c3a03c667805196c37e12cf3a627c2603c667815196c37e12cf39627c3603c6e7805196c37e12531c313e9701e3146094e5b09fc454478c5332609c0a8cb2dc48c78ce9ae5fa63672df51d72a8ddd77d4754963f7ede3dcc77953f0ede3dcc77953f0ede3dcc77953f0ede3dcc77953f0ede3dcc77953f0ede3dcc77953f0ede3dcc73993efe71df84e800f99728cf932c80b433e2c37d233366a46e429888fa710eb8ebebe4550f76f5978721cd51d7dbd40507761c836c6e7b380716416307a1d537d10ebc3a8785e74c4f342063c2f02cf4b8e785ecc80e725e079397e9e644cbd94018f30e4c37223b380f1f92c60f43a7a1d9918bd8e4d4747cfe8193da3673c168cd9d0867bc6ac88c7e2fa322a9e69f1f324357b39039e69a0992c77bf5bc6e2fa322a9ee9f1f324359b9601cf74d06c9a4533078cc5f565543c33e2e7496a363d039e19a0d9748b660e188bebcba87866c6cf93d46c46063c3341b31916cd1c3016d79751f1cc8a9f27a9d9cc0c78668166332d9a39602cae2fa3e2991d3f4f52b35919f0cc06cd66593473c0585c5f46c533277e9ea466b333e099039acdb668e680b1b8be8c8a676efc3c49cde664c03317349b63d1cc0163717d1915cfbcf879929acdcd80671e6836d7a2192be3c82c607c3e0b181deb585c5f46c533df11cfbc0c78e603cf2b8e78e667c0f30af0bc1a3f4f32a65ec9804718f261b99159c0f87c16307a1dbd8e4c8c5ec7a6a3a367f48c9e3133c66f6501a3dfd69e9195d1c1f555da77685e69e4bea3dea169ecbea3dea169ecbe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb3867f2fd5afcbe8b337d87f535e071f14eada37a16aaf5beaed7f54d8cfa29adde30b47ac5d02a1fcabc0efabde140bf1cf02beb9679f19729f3a504cc8e7c179f10aee338a8bff878ded043f97fd351dda3dafa371bb9efa8b6beb1fb8e6aeb1bbb6f1fe73ece9b826f1fe73ece9b826f1fe73ece597c63be455073de2edf5752eb780b7ecf81f2f2ddb25c28d3af55ea7f9bc0ef432e7cfb7dc81f2b9a826f1fe73ece9b826f1fe73ece9b826f1fe77c718ef1706d03f004064f9086e769329ece643c63c9788692f1dc47c6730b194f2f329ec9643cc5643cb3c8781e25e379898c671019cfdd643cd793f15c45c6f32c194f57329ef1643cc3c8781e20e3b98d8ca78c8ce709329e52329ed9643ca3c9785e26e3194cc6d3978ce705329e1bc978a690f17427e3994bc6733919cf44329ecbc8781e21e32924e379908ce704329e36643c7790f15c43c6f314194f27329e39643c55643cd3c878cac978fa91f15c4dc67333194f4f329ef9643c8f91f11491f18c20e379888ce72e329ee6643cd791f13c43c6d3858c671c194f7b329e0a329ee9643cfdc9786e25e3e94dc6f338194f0919cf28329e87c978ee21e36988ef7164c233958ce706329ee7c878ba91f14c20e39941c67329194f2519cf00329e3c329e7c329e0e643cb793f1f421e379928ca72319cf18329e21643cf792f1bc48c67313194f0f329e79643c93c8786692f10c27e31948c6730519cf89643c6dc978ee24e3c921e04904477e233901bfbf06b666c6b2eab352dd0a6a7e7f5bdb9bc132efe87c73cbbadf069b7cabea1dcbb2a8d3db5097329d2ffcd7a6a44ee8ab0ce6c55f1e70bc43c27327194f5b329e13c978ae20e31948c6339c8c672619cf24329e79643c3dc8786e22e379918ce75e329e21643c63c8783a92f13c49c6d3878ce776329e0e643cf9643c79643c03c8782ac9782e25e39941c633818ca71b19cf73643c3790f14c25e3798d8ce71e329e87c9784691f19490f13c4ec6d39b8ce756329efe643cd3c9782ac878da93f18c23e3e942c6f30c19cf75643ccdc978ee22e379888c6704194f1119cf63643cf3c9787a92f1dc4cc67335194f3f329e72329e69643c55643c73c8783a91f13c45c6730d19cf1d643c6dc8784e20e379908ca7908ce711329ecbc8782692f15c4ec633978ca73b19cf14329e1bc9785e20e3e94bc633988ce765329ed1643cb3c9784ac9789e20e32923e3b98d8ce701329e61643ce3c978ba92f13c4bc6731519cff5643c7793f10c22e379898ce751329e59643cc5643c93c9787a91f1dc42c6731f19cf50329eb1643c9dc9789e26e3b9d6c2f39a231e79df5dd62df3af91f876b01d0ad57adf7554a7057a5d2df57a855ffce54299a2e353ffd5f3215c56b8ccef1360dfef05a0d15b8eea628e8929f36f3572df6d0cdf6d9a88efb686efb64dc4b78f731fe74cbe17c4efbb18bf6d23538e315f06793cbeb8f82690a37ad63ab67f13a37e4aab8586566f195ae543997741bf850ef4b39d2fc8bcf8cb94f95202668c8b8220deb8782ffe3a15abbe34c781aeef19fa62bdde77a469d431e4fd46ee3bea18d2d87d471d431abb6f1fe73ece9b826f1fe73ece9b826f1fe73ece997c57eb7c8cd78d85e8a34550733d500d7e17eb7c4e8c7ed5ba1681df1ce0107fb950e615b817edf779bfcfc7e5db1fdb7c9c3705dfcc716ee6e519e265c0e6ea196f542c36c4f3e563e93b2a161bbbefa8586cecbe7d9cfb3867f2bd247edfc96788af05b5a774cf109700cf22075a38aa67f2da69a951a7d78c3ae543996aa8e75207f5cc01bfb26e995f0adb21db9815cf549dc7f15da4dc541246b12d72cb93dcbfa606b5a774fbd752e071b01f1439aa6772ff5a66d469aa457729530df55ce6a09eb67d47e697c176c83666c523efee0a6b02cabd40c228b6256e7992fbd70b41ed29ddfeb50c785cb43f8eea99dcbf961b757ac1a2bb94a9867a2e77504fdbbe23f3cb613b641bb3e291b14c843501e55e246114db52b73ca509a8b34ce9f6afe5c0e3a2fd7154cfe4feb5c2a8d38b16dda54c35d47385837adaf61d995f01dbc1337b661bb3e2917726853501e55e226114db32a73ca58509a8b34ce9dab115c0e3a29d77a47bb21d5b69d4e9258bee52a61aeab9d2413d6dfb8eccaf84ed9009f3822c64aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390994167c5f3b2ce0b6b02cabd4cc228b6e56e7992efefbc1cd49e728cf932c8af049e150ef47154cf64bff755469d5eb6e82e65aaa19eab1cd4d3b6efc8fc2ad80e99302fc842e6ea2c6466d059f14cd379614d40b969248c625be19627d98e4d0b6a4fe9dab155c0e3a29d7754cf643bb6daa8d3348bee52a61aeab9da413d6dfb8eccaf86ede0993db38d59f14cd779614d40b9e9248c625be994a738f91ee2f4a0f694ae1d5b0d3c2eda7947ba27dbb135469da65b749732d550cf350eea69db77647e0d6c874c98176421737516327b9dbdce51ccd559c8ec75f63a4731576721b3d7d9eb1cc55c9d85cc5e67af7314737516327b9dbdce51ccd559c8ec75f63a4731576721b3d7d9eb1cc55c9d85cc0c3a2b9e193a2fac0928378384516cab9cf294249f3bcc086a4fe99e3bac011e17cf651ce99e7ceeb0d6a8d30c8bee52a61aeab9d6413d6dfb8eccaf85edd0d89917642173b5676e10661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e6266880dc53353e7853501e56692308a6db55b9ee4770f6606b5a774fd76d602cf1a07fa38aa67b2dfce3aa34e332dba4b996aa8e73a07f5b4ed3b32bf0eb68367f6cc3666c5334be7853501e56691308a6d8d5b9e643b362ba83da56bc7d6018f8b76de513d93edd87aa34eb32cba4b996aa8e77a07f5b4ed3b32bf1eb68367f6cc3666c5335be7853501e56693308a6dad5b9e643b363ba83da56bc7d6038f8b76de513d93edd806a34eb32dba4b996aa8e70607f5b4ed3b32bf01b68367f6cc3666c53347e7853501e5e690308a6d9d5b9ee204d459a674edd806e071d1ce3baa67b21ddb68d4698e457729530df5dce8a09eb67d47e637c276c83666c53357e7853501e5e692308a6dbd5b9ee4fe3537a83da5dbbf36028f8bf6c7513d93fbd726a34e732dba4b996aa8e72607f5b4ed3b32bf09b643b6312b9e793a2fac0928378f84516c1bdcf224f7af7941ed29ddfeb509785cb43f8eea99dcbf361b759a67d15dca54433d373ba8a76ddf91f9cdb01db28d59f1ccd779614d40b9f9248c62dbe8982701759629ddfeb519785cb43f8eea99dcbfb618759a6fd15dcabc0ff5dce2a09eb67d47e6b7008f4cd7028fabb80c0c9ec0a28f4c4f93f17426e3194bc633948ce73e329e5bc8787a91f14c26e32926e379948c671019cfdd643cd793f15c45c6f32c194f57329ef1643cc3c8781e20e3b98d8ca78c8ce709329e52329ed1643c83c978fa92f1dc48c633858ca73b19cfe5643c13c9781e21e32924e379908ce77d329e13c878da90f1dc41c6730d19cf53643c9dc878aac878cac978fa91f15c4dc67333194f4f329ec7c8788ac8784690f13c44c67317194f73329eebc8789e21e3e942c6338e8ca73d194f05194f7f329e85643cb792f1f426e3799c8ca7848c671419cfc3643cf790f1dc40c6f31c194f37329e09643c9792f15492f10c20e3c923e3c927e3e940c6733b194f1f329e27c9783a92f18c21e31942c6732f19cf4d643c3dc8782691f10c27e31948c6730519cf89643c6dc978ee24e3c921e0490447be8b9780df17824dde199b0fb60f747e13d89a597cc8b3882d60cbd5795947ab305d5f70e4ba512757efc9a1af3298177f79c0f10109cf9d643c6dc9784e24e3b9828c672019cf70329e49643c3dc8786e22e3b9978c670819cf18329e8e643c4f92f1f421e3b99d8ca703194f3e194f1e19cf00329e4a329e4bc9782690f17423e3798e8ce706329e7bc8781e26e31945c65342c6f338194f6f329e5bc9781692f1f427e3a920e3694fc6338e8ca70b19cf33643cd791f13427e3b98b8ce721329e11643c45643c8f91f1f424e3b9998ce76a329e7e643ce5643c55643c9dc8789e22e3b9868ce70e329e36643c2790f1bc4fc6f320194f2119cf23643c13c9782e27e3e94ec633858ce746329ebe643c83c9784693f19492f13c41c65346c6731b19cf03643cc3c878c693f17425e379968ce72a329eebc978ee26e31944c6f328194f3119cf64329e5e643cb790f1dc47c633948c672c194f67329ea7c978aeb5f02c74c4638e9b20f30b097cabf9eea08b9a12f03b7e67fd7d478c0b0d46997f1f1891d7b5666d0c9e368666c7d2b7aabfbcab23f7c0717be17be70cdbab4d0368d6d6e0696b68762c7d2b2de4d9b6bc3388db0bbf53cbb0bdf0bd6a07ed7369c2e051538e315f06f92d8ef57154cf427ceffa9b18d7abb4da6a68b5d0d02a1fca6c06fdb63ad02f07fccaba655efc7966cf1cc5ac78a42f89ed7b00fd4818c586e3627c183f4f69c2e05153baf6f143c7fa38aa67b21ddb16d875ff1074973218abdb1cd43307fccaba657e9bc5774110af16dbeba0c5760bcff606d642fc65cabc390b991974563cf2ae81b026a05c7f1246b16d059e1df1f394260c1e35a56b1f7738d6c7513d936dc2cec0aefb0ed05dcae0feb5d3413d73c0afac5be677c276c884795b16327b9debc7ac78e41d6d614d40b901248c62db0e3cbb62e7292e4c183c6a4ad78eed72ac8f9b7aa6dab1dd815df75da0bb94c1fd6bb7837ae6805f59b7ccef86ede0993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999b59f10cd479614d40b981248c62db093c7b62e7493d77401e35a57beeb0c7b13e6eea997aeeb037b0ebbe0774973218ab7b1dd43307fccaba657e2f6c07cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccdccc8a6790ce0b6b02ca0d226114db6ee0d9173f4f69c2e05153bae70efb1cebe3a89ec9e70efb03bbeefb40772983b1badf413d73c0afac5be6f7c376d8ef993db38559f10cd679614d40b9c1248c62db0b3c0762e7493d3f451e35a56bc70e38d6c74d3d53edd8c1c0aefb01d05dca60ac1e7450cf1cf02beb96f983b01d3261de9685cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7b9e9e8ac78ca755e581350ae9c84516cfb81e7a3d8794a0a13068f9a728cf932c87fe4581f37f54c3d773814d875ff08749732b87f1d7250cf1cf02beb96f943b01d1a3bf3b62c64f6b1d130cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5cc101b8aa742e7853501e52a4818c57610783e8e9fa73461f0a829c7982f83fcc78ef57154cf64bf9dc3815df78f41772983fbd76107f5cc01bfb26e993f0cdbc1337b661bb3e2a9d479614d40b94a1246b11d029e4fe2e7294e183c6a4ad78e7de2581f47f54cb6639f0676dd3f01dda50cc6eaa70eea99037e65dd32ff296c876c63563cc3755e5813506e3809a3d80e038f83b84bf2e41b3c32ff09816f355fa5f379fa3f6eaf2a6064d85ef90da0591b83a78da1d9b1f4adea3f56e74fd0ff717b8d054686edd5a601346b6bf0b435343b96be9516e374fe44fd1fb7d7386064d85e6dddf214270c1e35a53bdff81478be133f4ff23aeed30c78be033cdf8e9fa7c8513d0bd57abf0bec71ad5769f599a1d5a78656f95006193e73a05f0ef89575cbbcf8f3cc9e398a19db42614d40b94f4818c5f66de071d16ea8ba5fa5d725eb6f11a61f9c5ce3d7c5fd35bcb7d052af5738c45f2e9439b75d0ddb4f345b1efc2edb4dd5e7906173f4ce5b91ed3eafcc8bbfbcc07eadefea1e6ad4bd8743c073c8a2d9418b66071c311e341865fe0030daeef31e74c41375df59fc619b718854337c0ff823e071755e1c1567aef7b94ccf2f3fb2f07c131f4f21c606fa7211abd8b6d5a5eeb67d27c6ba17e1332cf4e5601f481ea73ae875c9fad5b1e0bf4e76aa7929b60f729cea60d43917cafcf779356cff27cd71aa5970e47de1026d9732f2fb37da6eaea340af5be6bbebff182762f3c7c0dacf11bb1b5ab26986fbd6c7161d7b58b87b1070633c36c4b68ebaf781dbba87a1239b66b8ad3fb1e8d8d3c2dd93809b71bfee69e8c8a6d9d1f6eb7e16ee7e04dc8cfb753f434736cd8eb65ff7b770f727e066dcaffb1b3ab26976b4fd7a80857b000137e37e3dc0d0914db3a3edd7032ddc0309b819f7eb81868e6c9a1d6dbf1e64e11e44c0cdb85f0f327464d3ec68fbf5600bf760026ec6fd7a70505b4736cd8eb65f975bb8cb09b819f7eb72434736cd8eb65f5758b82b08b819f7eb0a434736cd8eb65f575ab82b09b819f7eb4a434736cd8eb65f0fb7700f27e066dcaf871b3ab26976b4fdbacac25d45c0cdb85f57193ab26976b4fd7aac857b2c0137e37e3dd6d0914db3a3edd7e32cdce308b819f7eb71868e6c9ad9f66b47fdcb32ee87fcb1537d52e3cf66f21e16f6257111538ee2a0d0515f93643fe40386561f1b5ae177fd0f827eaefa6445f51b137f9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec99f999f13d4f7cbe22e51ae21de0ba308a0d9f49b9b8cfafea7eb55e97acbf4598ee3cb5c66ffccf2d8a93cf01447f791ff36aa3ceb95066e7b9356c7d351b3e5fc4e7a2b66d7930f63ad4ed9d737c4f1f9f051dcbe79d1f59343b60d16cbf2346b3cd90f9fdc028fa1d001e57fbe34183c7f46d7b379c4db3a876d655dc47c599cd77416cbe8b87baf9164271a1fa46db71c191ed89d401f75d177198e9370170bf70f0dcbdc8d5fbffaa4efb8d3a1d32ea940f652e857aee7750cfbaee5b325d0b3caedaa3c0e0092cfac8d48c8ce769329ece643c63c9788692f15c44c6731f19cf19643cb790f11c47c6d38b8c6732194f3119cfa3643c83c878da91f1dc4dc6733219cff5643cb9643c5791f13c4bc6d3958c673c19cf30329e4bc8780e93f15c49c6f30019cf59643cb791f124c878cac8789e20e32925e3194dc633988ce77c329ebe643ca792f1dc48c6d3928c670a194f77329e89643c9793f13c42c67319194f2119cf83643ce790f1dc41c67302194f1b329e6bc8789e22e3e944c65345c6534ec67321194f3f329ed3c978ae26e3b9998ca735194f4f329ec7c8788ac8784690f13c44c6731e19cf5d643c2791f15c47c6d39c8ce719329e2e643ce3c878da93f15490f15c4cc6d39f8ce74c329e5bc9788e27e3e94dc6f338194f0919cf28329e87c9780ac878ee21e339858ce706329e16643caedf03cc94e739329e6e643c13c8782ac9782e25e31940c6733619cfed643c79643cf9643c1dc878fa90f13c49c6d3918c670c19cf10329e0bc878ee25e3398d8ce726329e56643c3dc8782691f10c27e31948c6732e19cf15643c7792f19c48c6d3968c27878027111cf92d26fcfed721b0edd779fcb66033cbfae4b9b09457c7a1db0b8e5c7733cbba0f581850a77d414d5dca74bef05f9b923aa1af3298177f79c0718084a72d19cf89643c7792f15c41c6732e19cf40329ee1643c93c8787a90f1b422e3b9898ce734329e7bc9782e20e31942c633868ca72319cf93643c7dc8783a90f1e493f1e491f1dc4ec6733619cf00329e4bc9782ac9782690f17423e3798e8ce723329e16643c3790f19c42c6730f194f0119cfc3643ca3c8784ac8781e27e3e94dc6733c19cfad643c6792f1f427e3b9988ca7828ca73d19cf38329e2e643ccf90f13427e3b98e8ce724329ebbc878ce23e379888c6704194f1119cf63643c3dc9785a93f1dc4cc6733519cfe9643cfdc8782e24e32927e3a922e3e944c6f31419cf35643c6dc8784e20e3b9838ce71c329e07c9780ac9782e23e379848ce772329e89643cddc978a690f1b424e3b9918ce754329ebe643ce793f10c26e3194dc6534ac6f304194f19194f828ce736329eb3c8781e20e3b9928ce73019cf25643cc3c878c693f17425e379968ce72a329e5c329eebc9784e26e3b99b8ca71d19cf20329e47c9788ac9782693f1f422e3398e8ce716329e33c878ee23e3b9888c672819cf58329ece643c4f93f13423e3b9d6e0c1dfd5bb58f27ed87efd3f177e9fa21baf367a5d52469e89a87b4b7b0d9baaef1e47f5dd1bd44c6530bf07ea2bec7b8167af239e7d068fe93b0ff23d40b3dd864d31ee72c4b8db6094f95dc028faed069edd8e78f6183ca6ef3cc8f704cd761a36c5b8c311e34e8351e67700a3e8b71378763ae2d965f098bef320df0f34db6ed814e336478cdb0d4699df068ca2df76e0d9ee886787c163face837c7fd0ec43c3a618b73a62fcd06094f9adc028fa7d083c1f3ae2d966f098bef3203f0034fbc0b029c62d8e183f3018657e0b308a7e1f00cf078e78b61a3ca6ef3cc80f04cd361b36c5b8c911e3668351e63701a3e8b71978363be2d962f098bef3203f0834db68d814e306478c1b0d4699df008ca2df46e0d9e8886793c163face83fc60d06cbd61538ceb1c31ae3718657e1d308a7eeb8167bd239e0d068fe93b0ff2e5a0d95ac3a618d738625c6b30cafc1a6014fdd602cf5a473ceb0c1ed3771ee42b40b3d5864d31ae72c4b8da6094f955c028faad069ed58e78d6183ca6ef3cc85782662b0d9b625ce18871a5c128f32b8051f45b093c2b1df1ac32784cdf79901f0e9a2d376c8a719923c6e506a3cc2f0346d16f39f02c77c4b3c2e0317de741be0a345b6ad814e312478c4b0d46995f028ca2df52e059ea886799c163face83fc58d06cb161538c8b1c312e3618657e11308a7e8b8167b1239e25068fe93b0ff2e340b36ac3a618df77c4586d30cafcfbc028fa55034fb5239e45068fe93b0ff27dc126bc45607b4fe78bc1b650e74bc0b640e74bc1f6aece7704db3b3adf096c6feb7c67b0bda5f35dc0f6a6ce7705db1b3adf0d6cafeb7c2fb0bda6f3bdc1f6aace9781ed159def03b6f93a7f0dd8e6e9fcb5609babf3d7816d8ece5f0fb6d93a7f03d866e9fc8d609ba9f337816d86cedf0cb6e93a7f0bd8a6e9fcad607b59e76f03db4b3a7f3bd85ed4f93bc0f682cedf09b66fe9fc5d607b5ee7ef06db549dbf076c2375fe5eb0ddaff3f781ed539d7f006cdfd6f907c1f61d9d7f086cdfd5f987c1f699ce0f01dbf7747e28d8fe4de78781edfb3aff08d87ea0f323c0f6439d7f146c3fd2f95160fbb1ce8f06db4f747e0cd87eaaf3e3c1f6339d9f00b69febfc44b0fd42e72781ed973aff18d83ed7f9c960fb95ce3f0eb65febfc1360fb8dce3f09b6dfeafc5360fb42e79f06dbef74fe19b07da9f3cf82ed2b9d7f0e6cbfd7f92960fb83ce4bbba6dad93fea7c41106f3bfb75503315806ff1a7cafc49e75b196564d95c2853aa3fe8a39e71a86f994a3b2cedb2b2493bfc1ed8a41d5e0836698717804ddae177c126edf03b609376f86db0493bfc16d8a41d7e136cd20ebf013669875f079bb4c3af81ad4ce75f059bb4c3af804ddae1f9609376781ed8a41d9e0b366987e7804ddae1d96093767816d8a41d9e0936698767804ddae1e9609376781ad8a41d7e196cd20ebf043669875f049bb4c32f804ddae16f814ddae1e7c126edf054b0c9fef235d8a46d1e0936699bef079bb4cd9f824ddae66f834ddae6ef804ddae6ef824ddae6cfc0266df3f7c0266df3bf814ddae6ef834ddae61f804ddae61f824ddae61f816db4ceff186cd236ff046cd236ff146cd236ff0c6cd236ff1c6cd236ff026cd236ff126cd2367f0e36699b7f0536699b7f0d36699b7f0336699b7f0b36699bbf009bb4cdbf039bb4cd5f824ddae6afc03645e7a5ad6e0d367956aca6c27f71c271789a812f612a0be26dfb712a83fc73507799a693f18c25e3799d8ce722329e95643c2bc878ce20e3f9808c670b19cf71643cfbc978f691f1cc21e379878c6710194f3b329e93c97872c978ae22e3a926e379958ce712329ec3643c5792f19c45c6b3998c671319cf72329e65643c09329ebd643c7bc878de27e39945c6f31619cf60329ef3c9784e25e36949c6d39d8ce772329ef9643c9791f12c25e35942c65348c6730e19cf46329e0d643c0bc9784e20e36943c6b39b8c671719cf0c329eafc978aac878de20e32927e3b9908ca71f19cfe9643c5793f1b426e3e949c633978c673119cf22329e77c978ce23e3594fc6b38e8ce724329e9d643c3bc8789a93f14c23e31947c6f31a194f7b329e0a329e8bc978fa93f19c49c6733c19cf54329ed9643c6f93f1fc9e8ca7808c672d19cf1a329e53c878b693f16c23e36941c6f31119cf2b643c95643cef91f10c20e3399b8c278f8c279f8ca70319cf48329e99643c6f92f15c40c6b39a8c671519cf69643c1f92f16c25e369a5ffb3f0f420e39947c6339c8c670119cf40329e73c978ae20e339918ca72d194f0e014f023802b0c9efcdc1f695ce1f069b7cafe723b07da9f3d560fb9dce4f01db33165b330b9f307c053679d7fa59b0c9fd992fc126ef70fc0e6c725c14ff6abe6fc191fccd6019f1d3dcc28ffe7e67e1923c6e6f59a62c88777ba3afb2e0c8ef29e501c7b3243c6dc9784e24e3b9828ce75c329e81643c0bc8788693f1cc23e3e941c6d38a8c672b19cf87643ca791f1ac22e3594dc6730119cf9b643c33c9784692f17420e3c927e3c923e3399b8c670019cf7b643c95643caf90f17c44c6d3828c671b19cf76329e53c878d690f1ac25e32920e3f93d19cfdb643cb3c978a692f11c4fc67326194f7f329e8bc9782ac878da93f1bc46c6338e8c671a194f73329e1d643c3bc9784e22e35947c6b39e8ce73c329e77c9781691f12c26e3994bc6d3938ca73519cfd5643ca793f1f423e3b9908ca79c8ce70d329e2a329eafc9786690f1ec22e3d94dc6d3868ce704329e85643c1bc8783692f19c43c65348c6b3848c672919cf65643cf3c9782e27e3e94ec6d3928ce754329ef3c9780693f1bc45c6338b8ce77d329e3d643c7bc97812643ccbc8789693f16c22e3d94cc6731619cf95643c87c9782e21e379958ca79a8ce72a329e5c329e93c978da91f10c22e379878c670e19cf3e329efd643cc791f16c21e3f9808ce70c329e15643c2bc9782e22e3799d8c672c19cf74329e66169ec38e78e45829eb96f9c304bed57bb8722f7ebffe9f80df71fce66a478c870d4699af0646b1ed039eee8e78f6183c7b2c5a1c2bdf4a0bf9f6c75efd3f01bfe3f70a5dc554778351e66d31b507787a38e2d965f0ecb26871ac7c2b2da4efa3f42149c0ef381e9eab98ea6130cabc2da6703cd79e8e7876183c3b2c5a1c2bdf4a0be96b287df813f03b8e7fe92aa67a1a8c326f8b291cafab9f239e6d06cf368b16c7cab7d242de3d93779613f03b8e27e42aa6fa198c326f8b291c1fa2bf239ead06cf568b16c7cab7d242be2521df444ac0eff87d7f5731d5df6094795b4ce1f7910738e2d962f06cb16871ac7c2b2de45b7572cd9e80dff1fbb6ae626a80c128f3b698da023c031df16c32783659b43856be951683745e9ec125e0f741c0e82aa6061a8c326f8ba94dc033c811cf06836783458b63e55b693158e7a54f66027e1f0c8cae626a90c128f3b698da003c831df1ac3378d659b43856be9516e53a2fef0c26e0f77260741553830d4699b7c5148ebf5bee88678dc1b3c6a2c5b1f2adb49077efd7eaff09f81dc7e31cec88b1dc6094f9c1c028361cefadc211cf2a836795458b63e55b6921dfd2926f3026e0771c1fcb554c55188c326f8b291cefa4d211cf0a836785458b63e55b69315ce757eaff09f87d3830ba8aa94a8351e66d31b502785638e25966f02c23f2adb49077e1a40f5b027eaf02c6958e18a3626a25308a6d19f02c73c4b3c4e05942e45b6921cf72e49d8b04fc3e1618973b628c8aa9e5c028b625c033d611cf22836791458b63e55b6921df8e59acff27e0771caf7d8923c6b106a3cc2f0146b12d029e458e78a2eee13584efa8fb510de13beade4a43f88eba4fd010bea3eeb13784efa8ebb786f01d752dd210bea3ee333484efa873fa86f01df57cbb217c473dab6d08df51cf1d1bfbfeed8f254deb58722cdbb5a67a2cf1ed39677b3e2e7edfc589a0f6358d9a728cf932c8e3f5cb62075a38aa67215e137e13e37a6dd7f08b0cadf2a10c5ea3babafe1b67f0c8bcf8cb46668c8b9cf87c1726c087bca3ac6c72afe53db0c93d8e8560937b200bc026f7d0de059bdccf7a076c72bfeb6db00dd7f99160937b97d81f49ee6dee005bb9ce633f98c13abf0d6cf29c08fb5fc8b3bead6093e7b5f8dc5f9eb96f019bf49bc0e7cdd2f76513d8a4ff123ee7943e681bc026fd08f1f95ab5ceaf039b8c2981cf75bed4f93560fb4ae7f179828cd5b90a6c4febfc54b07da1f35f83ed299d5f04b6dfea3cdef37952e7c782ed373aff16d87eadf36f82ed099d7f036c8febfc7eb0fd4ae7f7816db2ce63ffd0cf757e0fd81ed379ec97f84b9ddf05b65fe8fceb609ba4f3af816da2cebf0ab69febfc2b609ba0f3f3c1f6339d9f07b6f13a3f176c3fd5f93960fb89cecf06db189d9f05b61febfc4cb08dd6f919601ba5f3d3c1f6239d9f06b64775fef760fba1ce8f035b339d5f0236f97e32ded395771697814dc629c17bf5f2ad922ab0c9f87b2bc0d65ae7f1b98cbc97341c6cf26dfb4ab0c9fbff1560933192cac126e3380d069b7c0b6c10d8e47b6503c12663960e009b8cabda1f6cf2ede27e6093f7297b824dc608e90136f98e4a77b0c9d8773826b07cefb21a6cf24e108e132cdfddff126cf26ef9576093f19b704c60f9c6d5d360937149bf00db793aff14d8e47dcddf82ad40e79f04dbf93aff1bb05da0f3bf069b7cbff209b0c93b358f834dbea3ff2bb0c9bbd993c176a9ce7f0eb6cb74fe31b0c977887e0936192bf617606baff393c026efcc4f04db553aff73b0c9586713c026df57fd19d8e41b5fe3c156a4f33f055bb1ceff046c253a3f066ca53aff63b075d4f9d160eba4f3a3c0d659e77f04b62e3aff28d8baeabcb4336a7f56fbf9213d5f16c4775ea6fc7d1cd49ed25d1b0803f2c479ae9d0f3ce8eb60ec752f4e9ed7cb7edf4caf5762e820f8de1fbbefd435c501bdae167abdfb0ddfb950e653dd88a8e5f6c2ef655007590eafb165ddb2ccd5b0ec3e63dd6d747d0f38aaef7e8349b80f009394f9ecdc9ab24fe9c6b2352c13235bf2fa58622d000d712a83bc30b8d1aab810cf7bebc2730078e2df4f52d7eb2e6202f7adb8afd7cd7b4c66ace54399fda0df3e07fae1be2eeb9679f1e7993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999f59f1c8f3047cae2ce50e91308aed20f01c889fa7109fc3cafad5739d87e0b9cec1d8fdd67ebed752afb7d0a8732e94597d5e0ddb109dcf83df65bb456dcbfdb1d721fdb6147f79509f03c0e3605b26790e1a3ca6ef3c8b3e4ab37d16cdf63a6234db0c99df0b8cfb757e1ff0b8da1ff71b3ca66f6c330e906a16d5cebae897902ece6c7d100a62f35d3cd4d5735dd5674af5e5308f5f870c4db10f84d8f039781e2cf389fe9f007d3e017d8e651b60f64bc076ea6360dc1f3b6371ad67c0d2f65f6d688a7d205ed4da4a1f88f8db81e24297c708d947cdbe1558572933038e73b3741efb011d8275bd6bf95da61c63be0cf2d8a6ee8ebfcec9ed2bfd5765fbeeb6f8de09ac31f9aef52e478e4ee247ecb9907fe7bc9ab2524ef410ad851dc7ad427673b98f8de5f2a1cc1e4bfdcb8278ebbfdbe0d96d30abd8990b71f62e9cebb96a93f644687435682465f09cd7419f226b1b291ce24f9591eddfca2883e7a7526609b451aa2ed2ce4b3db11f131e035c9d2f1c32ea27f378be603ba731eba8e2e3ce536b785d5f0b340bec5ab3f4f5db02ed45dc7dfdb6400cd9ce4b65fd85b07ee16a15441f5ba4cc36e338eae27a12b7a5a9e701609232bba01dfa1ff5b8ae3b56d7e851d7757b1cf0e0b5864ce98eef788c71d1be38aa67a1edd8b5cfa8533e94b914eae9e03c26ed3ba9bbc1b78b6d8e5ac839d47e438b5c28f33da3ed88d251d681f701dcd6a5d87a3e5868a98b94f9b1d14eed72c0e472bbe179965aef414b5da5cc2fa0fdfb1ccee7f7ebdfb12dfd8be57799d2b507f84df9edf1d739b97de5fd46d9bedb2dbe3f04d6987cd7fa26859cef8b1fb1e742fecf70fc9672a287682dec6a1f91f73b91dd5c6ebfb15c3e94d961a97f59106ffdb71b3cdb0d66153bbf8138fb0b9cefbb6a3777446854081a49197c5660de6fc17b2778dc6fa8eb0299ff0818c5b61bf4fd1f4eef97a7d83e32d8ccfbe5b6f3c142831fcf07ff17b4b3094b59f7cf0152e736582fa94760d43530eaeae8fcb534c7d0b30cfc7400fb7e9d179de5373cc7953239ed52ffddddbfaa7d1f5bb8a51ef8bc6eafc1bdcfd015ef45b5046e15f7e6b5059ea73bbea62dc57331f37c08afc3a44c1eb0dbcee30e5bea621ea79b05475e0b7e6394c5ebec74cb99f98f8c65f09ec1410b93aded8bedbd9ca2c24293dfd6ee1d32986dbaca7e803127eb32f7153c1f923267c3764b58caaa36e9bf4eaed147b623de6bb7dd677175bc88bacf22fe14a3ed9d4917cf309ae2bb69ad635b6fd772db7336f6fe0cad8d7c3cbe8b2bf058914e8bbd161e57f734a3b4d86bf11d9f169d86dada399b167b2c3caeae31a3b4d863f11da31695b67b0b362d765b785c5d6b4469b1dbe23b3e2d3ad7baaf914e8b5d169ef8ef69a4d7029f8965c2bc8780b9b5918fc77769b9edd99d4d8b9d161e57cfeea2b4d869f11d9f16459d6cd7ec362d7658787634b0163b2cbee3d3a24b57db3d159b16db2d3c0eeeafa5d562bbc5778c71310cefafa5d3629b85675b036bb1cde23bc6f3c34ee9ee19a2161f5a785cddfb8bd2e2438bef18b518a27c6fad83165b2d3c5b1b588bad16dff16951de51f9fea00e5a7c60e1f9a081b5f8c0e23b3e2d867451beb7d4418b2d169e2d0dacc5168bef18afa19271b1b90e5a6cb6f06c6e602d365b7cc7a74545f25c6b531db4d864e1d9d4c05a6cb2f88e4f8bc2e43175631db4d868e1d9d8c05a6cb4f88e312e92d7931beaa0c5060bcf8606d66283c5778cc791645cacaf8316eb2d3ceb1b588bf516dff1695199bcffb4ae0e5aacb3f0ac6b602dd6597cc778cf2519176beba0c55a0bcfda06d662adc5777c5a94248fa96beaa0c51a0bcf9a06d6628dc5777c5a0c4b3e135b5d072d565b785637b016ab2dbe633cef4cb617abeaa0c52a0bcfaa06d66295c5778ce79dc9fb172beba0c54a0bcfca06d662a5c5778c6d67f2bc73451db45861e1713546649416b6f129633cef4c6ab1bc0e5a2cb7f0b81adb304a8be516df319e77268f23cbeaa0c5320b8fabb128a3b4b08d8319635c24dbcea575d062a9856769036bb1d4e23bc6fb5ac9b673491db45862e17135364794164b2cbe63bc1e49dee35b5c072d165b781637b0168b2dbe637c56943c075f54072d1659781635b0168bc0f781d87da7fa738b0fe98b7595a1452e94f98ed1172b4a475907be438b75a98ebd2ea97e65ef47d4a51aea22657e60f4e57bdf0193a3ba2663e63dbd2ee99bfeb1a5ae52e6a7ed6acafe5ce713b04d0ec3bafe68f95da61c63be0cf2a29faaf382f8eb9c8c55190748b6ef028bef77803526df45e83b4727f123f65cc87fddaea6ac94133d446b6157fbc8429d477673b945c672f95066a1a5fe6541bcf55f60f02c309893ef3d409c491cb969bb524c0b2334ba0a349232d867efb0239e8f0d1ee1107f39c191efa24a195916df45fdbbd16f57fa414a3da3fa48bee7a87e517d24c55fd4bba8661d557cfc00fa7ecab820326688b2c9182025b09ece864dd5b58ba3ba8a2f59b7cc7701461993a473c33316d795b193c1a878ba39d00cc7599129ddf1a21bf07475c0e3a89ec9e35077a34e5d8c3ae543197cb7b1bb837ae6805f59b7cc7707df2eb6396a21c7e4cb0d2d72a14c5e41eabf9c3f46e928eb50f1dbd95217573a7632783a597cf772aca3ac5bdac45e0de0bb87e1bba3e15beddb18636a4ab76ff700e69e0e98d57a7bc7bfde423c679478163f1da14e7d4083b8ea84eb9273cc3e86b6b990bfb0a0a6ac9493b272ec1476b51fc9b6447673b96ec672f950a697a5fe6541bcf5ef6df0f43698d579c31905351c0ef687640cf4323864be2368d73b42bb5ea09d94c1636f2747daf5347864be13f0c8f95577b0c9798af027e0f79206e036dbbdee166eb1e178849d2c8c1de3672c4e775ce8088c62eb093c3d1c69666eebcb0d7df09ca095514696cd85325d0a52ffe55d2db3acdaefcecfa9a957736d8fedbd35dda6b774a0178e071a803e81a1a14cc2d03aa81933344e9ee3839a3141274cac1a3fe49161f70c4b3df614b45c0313ffe758aad10c6c986f6eb10541eda14f73c126439fb6005b3343161c7255cacbd0892ee4423d64ddb906676b6089d3370e1b2b53bad069053c2e4259858e0c1dab43e7fef123260ec3f8686170d62776d46fcdd3948b5a97c441ae83ba2393ac5be6c59fd2275fe7c70e193ab2cff847268d1e3666e2048435772ecce7182298ff6dcb6090e0ce24eb696188737cfce294e218c5265f00fe641286d641cd38c631f2240355c61a1e3a64d4a8bb26958f1a31f4864963864e1c513506156d6d2817a5b6fcde126cb6a60ecbaa09775f5cb695c5669b7054e7d6609316fc38b009cff1606b0e79296f6e1927fbc8a5b07e096bf59b12a785ae78aba02604e4b0a4da17b50fa9cfa8aad30135b4b41a4a5a6d4e75c74e0d0dadbe22a7867e56433daba19dd550ce6ae8663554b31a9af9dc2035f4b2ba7b5910a48652be20480d957c51901a0af912e0fb0e305f16a44e3fd450c6ed83d450c5eaf6a17a7d5c7d6a4dbddfae4e63d5e5b13af553973aea344c9d7ea9d36c750b41dd4e52a736eab4519d12a9d318755ade5b6bdd274cd784e9da305d17a6ebc37443986e0cd34d61ba394cb784e9d630dd16a6dbc3744798ee0cd35d61ba3b4cf784a96f98ee0d52c369df17a6fb83d470db0f04a9a1b81f0c52c3743f14a486f07e38480def3d24480dfd3d34480d0b3e2c480d19fe48901a4e7c44901aaa7864901ada7874901a1e590d533e36480d89ae865a56c332ab219cd5d0ce6a6868358cb41a725a0d45ad86b27e2a480d91fd4c989e0d5243684f09d3d4303d1fa66f85e98530bd18a697c2f472901a965d0dd7ae86719f19a4867d9f1da4868957c3c7ab61e5d570f36a187a353cbd1ab65e0d67ff4698de0cd35b617a3b483d16508f43d46302750b5edd22568f69aa83d4edebc541ea31b37aecaeba21a86e19aa9bcaca20d58d4975eb52dddc54b73fd50d52750b55dd6455b761d58d5a752b57ddecd56b07ea350cf55a8a7a4d47bdb6a45ee352afb5a9d7fcd4ab9aead547f52aaf7ab5797f90ba357d30483dae54b7abd56d69758b5edd42ff344cdf0e5231f9dd307d16a6ef85e9dfc2f4fd30fd20480d19ad869756c353aba1acd510d76a386c3574b61a7a5b0dc9fd79901aea5b0d15fe9b2035dcf81761fa5d901af2fcab2035dcfd1fc2f47598fe18a63f85e9cf61fa4b98fe1aa67f0fd37f84e96f61fa7b98fe334cff086a8635c786a440b73ee7ebf92113270e1b3d7662c1c4aa82d193464d1c3176d4130593474c1c5e50f5d8b0f195a3aa26e3c2bfd50bcb98ec7dc68f1ff244c1883115c31e2fa89a34b1a0aab2a0bc6ad2988a5a07d2ffab173ae7488f432a2aa29de535ff17484f6c5e3fa7edf47232dafdcde9eb7641f37a0872597d16baad9e15ba571fc1e492af6fea7cb060c2a8aa8905850563c2bfe181b76af2b08a0e05f8db8450e409130b264c1c327e6241e5f8aad105451d70bd85c7d7a312f38f7703537266fdc4f9e4dcd4ff7a85d80be7d54381c5e7d58f74f379ff02e987f574fa597d6af8a3fa2cf45ff5240cda45ca326152f9c4f143864e8c5eb8c5bfb270a25d3daa7956bbfa55f3dbf571f6fdfa2cf4b77a12260aeae1ac7341dd9d05ff1f1bdedcb8b0020600", "isInternal": false }, { "selector": { "value": 2603445359 }, - "bytecode": "0x1f8b08000000000000ffed9d67701cc7b1c7f700100cc72308e64c28514c000f8744800994c41c642a8b4a0449502245121409e51c6ccb966dd9720eb264cb414e720e72ce39e724dbb225dbb265ebcb73bdf7ea55a9deccdeb4f1c76876853b6f83b3b8deaae6cd36e6b67fdddb33bb3733bb7c2608824c50dcaa959c143c77a3bf779bcffc7fb6352778ac3c276726259c5529e1ac4e09674d4a3847a584b336259ca353c23926259c6313e4d46c55c1e02d69de710c714d9a319bb2988e4f414c73298be98414c4b42e48471f3531259cf529e19c9412cec929e19c9212cea929e19c9612cee929e19c9112ce9929e19c9512ced929e19c9312ceb929e19c9712cef929e16c4809e70929e13c31259c27a584f3e494709e9220e712e05c603e4f359f0bcde722f3b9d87cd277969acf46e3638dd96f52b24cb32969b6fe5650d2a2a455499bf5b776251d4a962be9347f6b307feb52b242c94a25ab94ac56b2c6c461ad92d3949caee40c25eb94ac57b241c946259b946c56b245c95625db946c5772a6921728d9a1e42c25672b3947c9b94ace5372be920b945c68b1ec547291928b955ca2e452259729d9a5a447c96e257b94ec55d2ab649f92cb955ca164bf92034aae547250c921258795f42939a2e42a2547951c53d2afe46a25d728b956c9754aaeb7627683921b95dca4e4668bf31625b72ab94dc9ed4aee5072a792bb94bc50c98b94bc58c9dd4a5ea2e4a54aee51f232252f57f20a25f72a79a5925729b94fc9ab95bc46c96b95bc4ec9eb95bc41c91b95bc49c99b95bc45c9fd86851ac25b953ca0e441256f53f276250f29798792772a799792772b7958c97b94bc57c9fb94bc5fc907943ca2e4834a3ea4e4c34a3ea2e4a34a3ea6e4e34a3ea1e4934a3ea5e451259f56f219259f55f239259f57f205255f54f225255f56f215255f55f235255f57f20d25df54f22d25df56f21d25df55f23d2be6df57f203253f54f223a3fbb1f9fc89a94be3623f55f23353feb9f9fc85f9fca5f9fc95f59d5f2bf98da5fbad92c72cddef94fcde94ff603e1f379f7f349f7f329f4f98cf27cde79fcde75fcce75fcde753e6f36fe6f3efe6f369f3f90ff3f94ff3f98c92dba714cb638281ad3b48a88f6add97d7732a14fc05c1e04dc7a2dafc8d3e1b8cbec6ecd327c56e94d91f65e96bcd7ead759c31667f8ca5af37fbf5967eb2d99f6ce9a79afda9967ebad99f6ee94f36fb27833e1bc098abd16b5db551654047f95a05ba5146570dba5a3a1ce8461bdd28d0d1f9ad05dd58a31b0dba714637067459a31b4bb15432dee8ba83a47225dfa38f9b4bfab8661e6a42f2bc7bf471eb98782726cfdbab8f5bcfc0abf3639239d644c89bc946570f3ad3dd04934037d5e826836e9ad14d01dd74a39b0aba1946370d74338d6e3ae86619dd0cd0cd36ba99a09b6374b34037d7e866836e9ed1cd01dd7ca39b0bba06a39b07ba138c6e3ee84e34ba06d0d11a97134077b2d19d08ba538cee24d0515f7b32e8e8def014a3d3fdc4980c7cc7e8a98f0abf43fd33e81652df0cba45d42f836e31f5c9a05b02b649b714fa15d2351a1df551fa6f5da6dc1d24d5260a619b5891f471d591f57157257fdc70de6e753010d76eb0b30262b5c694135c1bd48cb63346c80ee96ba0bc09ea523d8a075d67885d5f4f569af29a98ef7559dfcb419d950effbb8364fd5f65f1acb2984781ff3c39db52909c1df25672ce9e0f75eddca37b9e9198b35b81832167db256787bc959cb3bd50d7ce3dbaef1d8939bb13381872b68727670b79c9d9e2185910b8738f7efb8cc49cbd023892cfd936c9d9a16f25e7eced50d7ce3dfafd3b1273f61ae0483e673b7ae4de60c85bc9397b2fd4b5738fc6624662cede051c0c39db2bfdec90b79273f67ea86be71e8d0b8ec49cbd0f3892cfd94ea69c6d919c0d8af39d41e0ce3d1aa31e8939fb2070249fb37b647c76e85bc939fb28d4b5738fe64b4662ce3e62ca7a9ee1c7669e610ee87e6274738137f9dcdedbca94db05c9ede23a902070e728cddd8dc4dcfebc29eb3cfe39ac3d20dd2f8cee04d0fdd2e84e04ddaf8cee24f08ba10df4481b18f256721bf80dd4b57399e69147621bf8217030e4ec1ec9d9216f25e7ec5350d7ce3d5ad3301273f677c0c190b3bd92b343de4aced9ff86ba76ee2d34e59198b3b4ae54df2ffcc1dc2f2c06dde346b704747f34baa5a0fb93d13582ee09a36b02dd9346b70c747f36ba3ce8fe6274cda0fbabd11540f794d1b580ee6f46d70ababf1b5d1be89e36ba76d0fdc3e83a40f74fa35b0eba678caed3e8f47c17adbdfab6d1e9734bf1e80e923bb7e17aab60f096b1f6bba1dcc8cb93cf05839f45205bcb92b7d5a27d6f0a86eefb32e0c933f89e051b43e1c9034f73f23ce1bad342f2c70dcf719315d32cd86a02bf5a18fcca802d3a36ed93bd1ce8b02f697130b626cf58c8802d3a36edb70223e9b06fa36b0cb51fdd373764067819da52787d467bddc041f66aa0cedc2903754f366ce3e1efd4078c8732f6fdcd968e2957c35c215b746cda2f0023f9d83cfc8c85a132e62d46ae7e2303b6e8d8b6edf18ef8e898b53a62d6c6c4d86a31d27e1b3052fc5a879fb1305446bb5f60ea939a87da27515c9a873f66433aaf39d0e1fd5f9b83b13d79c6f0bcb6598cb4df0e8ca46b011eaeeb61547bf5c536c77d08e6335db3e8fa43f66aa04e47f540ddad703d65e8430ba5de9b629f9efc792ae4f17a36141ee673d7cc948f79ec3b9f0d92cd35bbcd375bb1c2368f7d39573f19d597933d61166661166661166661166661166661166661166661166661166661166661f69f396a5eceb59ee1783292ae003c1ce3fce13baaccb1700ee83198d7497edea290c7b97a5ac7b8c8f2b906eafc5f6680ed71c73a099c3b5f66e998d62985e712d72975c33ed9c3751bb86e8a61ed49c8b3d4e2b16d8f77c4c7c775243eadd1885aa7e553cc72a0c3f5704d4c3c5179d6e4b0dd9098edc21e9eb653c8ebf701e977ea517f62b7115cfbb6c4d2e93ea9ab7ac06f8e1c2875de19af1b544e721e17f30d6d25bfdea630687d425530f85a81f7140c6b5406cd57d3da8876cb760dd4195b15fcfbdc2c87bf7707cf5d23a4eb7458c7a6ef2c82ef7658c7aee3f337b63f6c076e2ad75abe350237d5995035e0e3e74c99e97ea680eb6703e00d2c9f68c3f519c9dfef15d78bb494c0d3063c1c6bd798ee6bf3988f49af17e9b062e5ba5fa63aed10bf0e86f8c5ad59237bc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc2ec3f33beff8258f119e982278cc3b4c6269ccfa07719e1bcd803550376b9e70069ce69b1e5333ea3fc74d500db43a68cef08703def8ee7926b6e2dea5c92bdf1c1739fd3673a97437ef7439b23661d8e982d6762b4fb0cda5f0e8c14bf0ee0e16a8fed168f6d1bfb8c364f6316d5cf72ad5f89ca33d73a8586c46c17d78b70ccebd27a11fbfa55b0628aeb244887f3e0f86e159fdfff62af5dc07e0ad76825df6f1606cd01db6b05c91eae93f886892dad9348be1f28e439af11d446694d488bc357aaf35db8ce7ddf9471ad50018ef598e3efb4c5ad49c03e35f17770e68b73fcf4ee4a3abf5d0edb2b813521dbcd683b6384ec90be06cabfad1aa84bf5281e146b62d76d84de6588ecf6f79aadefe5a04ea7c3ffee2059ffbb2c9e2e8b59e7ce8f20cf1e837b3dae3ea93322468b20465407ef79b9ae5ff69a6d7bad32f6a3a3ad3af4dd1aa8f324f451a5bc2b8aeb7e21ea1a80f70bf67561286bc72b7d3de0bfa0bf487a3de0bf20875cf7a574fcc5707ce21a1d445f5ba8ceff5ad75186f57a437aef95ebb71ff1e27a43aaf32cf45579b32e37ea778ceb390baedf0d51cf7d903dbca72ac577ec1792be36623e220be6f2bfafd126d6948f1d11dccb1cdfcd467c976245ebcbf177b21d3f1d874ef84e77227128f6375d962fd4a63ac117aa530fbef0dc3315ef3f93f775f0fd10f541ad0e5fa9ce347817dc0c53cec279c2bef254c7df698bbbffa4f8699f87fb9dea68db8777aa2fa81ea86bbf1b9d625dea3bd5dbadeff9f84ef5d99067a7c2b3165c7df5ca88182d8618511d7cd6d1fefd1f758d399eef25b5fb4dbc4e0e279b3d7eebba3fa13a780f4d75daa09fcd3aeadae3d2740d49727d3a3e0fb414ece2f3404b99e2990b06c733677170daaeb36cd70da3ed7acb76fd30da96984bcc7d8a39c3ff3d51f6ff8581ff6745550a18ab53c0589302c6512960ac4d01e3e814308e4901e3d814308e4b016316188fe7b59d213e05cffebfa7d87b0db4cdf03e8730168dc1d063d1c4cb137bef83b619dea152f2ff37c0fc7f613597fb7f61e5e07b9352c03839058c5352c03835058cd352c0383d058c3352c03833058cb352c0383b058c7352c03837058cf352c0383f058c0d29603c21058c27a680f1a414309e9c02c65352c0b8401813615cc2cb58f0edff71ce0683d79a3d1f0ff3bb47c37728bade73caf17fe396ea3bf37b879bcb7d4f1faeb1e0fdbf1effb3770972aca128f55d8271ff3f361363a15c46aeb5e4b88e7a283cf81caaebf91606c642b98c5ccfa0e0339143e171fd5fbdbccf041563560e23d79ab152d734e2b382ed8e98313016ca65e47aee009f891c0a8febd9c5665ec642b98c5ceb73b36063283c9d10b3e58e98313016ca65647abe2c8c5967093cf81c56a723660c8c85721935cf0aa6987595c0b30262d6e588994f8cc893f43bd1bb1cb6389edb2bd5776240c6b129601c9702465c27c1d17fc5ad93e8e28d4fa1dcf8709dafb87512689be139913016f85cc0f3c562152f4fec3a09b4bd9a2916f8dcc6f3c56235f0703c4792051b43e121861c7c6f520a1827a780714a0a18a7a680715a0a18a7a78071460a1867a68071560a1867a780714e0a18e7a680715e0a18e7a780117fab32dc2bc6fe7e593dc26d47fd5619e9b6a37e978c74db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e4b94fb6d330c62f8c238f11791a92e3c9a3ef68abdb03dfbb1d3c1926dfd1d65a0f7c2786b431ae4901e38a14304a1c8b6b10cb61d43ca731f1ac2d81e734e0399d89e7b412784e079e3392e70973eaf41278882107df5b9102c635296094384a1c7d629438564e1c8551188551188f07631afa70614c453e16ca65d43ceb92e709637646093ceb2066f4bd665ec642b98c9a677df23c61ccd695c0b31e62b6ce113306c642b98c9a6743f23c61ccd697c0b30162b6de113306c642b98c9a6763f23c61cc3694c0b31162b6c1113306c642b98c9a6753f23c61cc3696c0b30962b6d1113306c642b98c9a6773f23c61cc3695c0b31962b6c9113306c642b98c9a674bf23c61cc3697c0b30562b6d9113306c642b98c9a676bf23c61ccb694c0b31562b6c5113306c642b98c9a675bf23c61ccb696c0b30d62b6d511335f1957a480714d0a1899e358289751f36c67e2d95602cf76e0399389677b093c6702cf0b92e70973eacc1278882107df5b9102c635296094384a1c7d629438564e1c85511885b134c6ee1430cab916465f19197e5fc53e4373e608b75d67d9aeab10db51cfd08c74db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e47925d8963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e47925d8963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9efb647b47f2b60ba53ec3ba0378389ea965f233af8f7b9639d6b309c64fc7ea6c2b56675ab1ca419db3207e6733c42f0376e9d8b44ff64a653ed5036626db8509ea1863c17fb2b1c68a87b67f0e93ef517dfd3923dc76545f3fd26d47f5f523ddb6e4b9e47925d8963c973caf04db92e792e7bed8c6724d3070df4eef57d2c738d79447997d64a5ef519d55a38b9f7581b4210edbd286e45a5109b625cf25cf2bc1b6e4b9e47925d8963cf733cfcf4bde76383786bf2ff4163737761ef09ccb100b263ff3daa7f32d9fceb17cca411d7c67edf90c7e66c02e1d9bf6cf87f3903666cdb3da9489350bf5567bc248ba737979c2f6b53a18bcc5b5aff38187a11d3433f919b6af0b2c9f563be24e7530572f60f0d3d57668ff02380f6963d63c6b4d9958b3506fad278ca43b8f97276c5f6b83c15b5cfbba007838fa1f263fc3f675a1e5d35a47dca90ee6ea850c7ebada0eed5f08e7216dcc9ae7345326d62cd43bcd1346d29dcfcbd39a059f698b6b5f17020f47ffc3e467d8be765a3e9de6883bd5c15cddc9e0a7abedd0fe4e380fc22ccc2e66cd43ffa73cb166a1dee99e3092ee02569ed67c167ca62dae1fdb093c1cfd3c53dcc37eec22cba7d31d71a73a98ab1731f8e96a3bb47f119c875298d7a49059e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e25c1eb3e639c39489350bf5cef084917417f2f284cfef9c110cde32d67e37942f029e9d0cf161f2335cf77eb1e5d3198eb8531d6c5f1733f8e96a3bb47f319c875298d7a49059e25c1eb3e65967cac49a857aeb3c6124dd4e5e9eb01f5b170cdee2fab18b8187a39f67f233ecc72eb17c5ae7883bd5c1f67509839faeb643fb97c07910666176316b9ef5a64cac59a8b7de1346d25dc4ca53089f435c1f0cdee2fab14b8087a39f678a7bd88f5d6af9b4de1177aa83b97a29839faeb643fb97c2792885794d0a9925ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e728668973e5c459f36c306562cd42bd0d9e3092ee62569e9670de614330788b9b77b8147838e66598e21ece3b5c66f9b4c11177aa83edeb32063f5d6d87f62f83f330d299d7a4905972637898253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a3987dc80dcdb3d19489350bf5367ac248ba4b7879c2f71e6c0c066f71eb762e039e4b19e2c3e467b86e6797e5d34647dca90eb6af5d0c7ebada0eedef82f3b04b9885d9c1ac79369932b166a1de264f184977292f4fd88f6d0a066f71fdd82ee0e1e8e799fc0cfbb11ecba74d8eb8531dccd51e063f5d6d87f6c99e300b7314b3e6d96ccac49a857a9b3d6124dd65bc3c613fb63918bcc5f5633dc0b38b213e4c7e86fdd86ecba7cd8eb8531dccd5dd0c7ebada0eedef86f320ccc2ec62d63c5b4c9958b3506f8b278ca4dbc5cb53c882cfb4c5f563bb8187a39f67f233ecc7f6583e6d71c49dea60aeee61f0d3d576687f0f9c87b4316b9eada64cac59a8b7d51346d2f5f0f284ed6b6b30788b6b5f7b8087a3ff61f2336c5f7b2d9fb63ae24e753057f732f8e96a3bb4bf17ce43da9835cf365326d62cd4dbe60923e976f3f284ed6b5b30788b6b5f7b8187a3ff61f2336c5fbd964fdb1c71a73a98abbd0c7ebada0eedf7c279481bb3e6d96ecac49a857adb3d61241df653b45501e37626c6c0620cacf820cf3ccf787678c633c3339e499ef18cf58c6791673cd59ef12cf78ca7cd339e82673cf33de399e919cf64cf78c679c6b3d4339e1acf781678c6b3d8339e599ef14cf18c27eb194fa3673ca33ce3e9f28ca7d3339e859ef1b47bc6d3e219cf32cf78667bc633d5339e259ef18cf78c27e7194f93673cb59ef1acf48c678e673cd33ce399e0194f9d673ca33de359e5194f87673cad9ef1e43de399eb19cf74cf78267ac653ef19cf18cf78321ef06483e7ae63c8c2df7780aecafaaebebeec9e32f0779a37ae82efec33e56ac7b17b4147f3ccfb1cdfc53871cd85a3ad6ed8277be381639f273c633ce3a9f78c67a2673cd33de399eb194fde339e56cf783a3ce359e519cf68cf78ea3ce399e019cf34cf78e678c6b3d2339e5acf789a3ce3c979c633de339e259ef14cf58c67b6673ccb3ce369f18ca7dd339e859ef1747ac6d3e519cf28cf781a3de3c97ac633c5339e599ef12cf68c6781673c359ef12cf58c679c673c933de399e919cf7ccf780a9ef1b479c6b3dc339e6acf781679c633d6339e499ef1ccf08c6787673cf33ce3a972f0ec60e2897ab6798727b619ce435e1ff772269fae30c7aa35c7257eb25703754e32038f7afe03bf4b5cf6fc3fb69d2b20465cef95c8593cb4bf7784dbaeb36cd75588ed7acb767d85d8963c973caf04db92e792e795605bf25cf2dc47dbcf2667bb4dde2f35741e799f533c8fbccf299e47dee714cf23ef738ae791f739c5f3c8fb9ce279e47d4ef13c0b3ce391f739c5f3c8fb9ce2791a3de319e5198fbccf299e67a1673cf23ea7781e799f533c8fbccf299e67bc673cf23ea7789e5acf787c7b9f936fef8397f74bc5f34cf08c47de2f15cf23ef978ae791f74bc5f3c8fba5e279e4fd52f13c633ce3c978c0f37cef97c2f7425d61ca7b4147eb4be3de439585e35c013a1acfa563e8ebd5a129cf65a882efec77705deeb04776f63bbe3b1c71475bddb04ff6f07d55fb3de119e3194fbd673c133de399ee19cf5ccf78f29ef1b47ac6d3e119cf2acf78467bc653e719cf04cf78a679c633c7339e1d9ef1acf48ca7d6339e26cf78729ef18cf78c6789673c533de399ed19cf32cf785a3ce369f78c67a1673c9d9ef17479c633ca339e46cf78b29ef14cf18c6796673c8b3de359e0194f8d673c4b3de319e719cf64cf78667ac633df339e82673c6d9ef12cf78ca7da339e459ef18cf58c6792673c333ce399e7194f958387eb9d5151cfd70fc7fbaa9ecfb6de5f0a71d15b16fe3e1ccf71edb018691fd73d202ff12c65e2897a2fc0520f6c6bffe9b7e804f39985bfe373385c39b5d462a47d574ee1bac646269ea8f719347a605bc7a2c994690d4016fede048c5c39d56831d2be2ba7ea79795ab3e0336d716b8db0cd719c43263ff3d8fe127c87465ec76abb15ab262b5639a8331cebd2a3fa03b227ccc21cc5ac79682e8558f17a361ccf990d85d1757d65e009fbc765c1e02dae7fdc0e3c1cd70f263fc37eec80e5d33247dca90ee6ea01063f5d6d87f60f386c3704c9c6e2ca21c4e24a07cf95c31c0bb2572af38e1432fb1067cd436b118915d737e73d6124dd525e9eb07fcc0783b7b8fef14ae0e1b87e30f919f609072d9ff28eb8531d6c5f0719fc74b51dda3f08e7a114e6032964963897c7ac79680e8258b350afe00923e9b6b3f214f259f099b6b87eec20f070f4f34c710ffbb143964f0547dca90eb6af430c7ebada0eed1f82f320ccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22ccc7e336b1e7a369658b350afc51346d25dc9ca539c776809066f71f30e878087635e8629eee1bcc361cba71647dca90ee6ea61063f5d6d87f60fc3791066611666611666611666611666611666611666611666611666611666611666bf99350fbdb39d58b350afd51346d21de4e5099fdb6a0d066f71f30e8781e710437c98fc0ce71dfa2c9f5a1d71a73a98ab7d0c7ebada0eedf7c17910666176316b1e7a571bb166a15e9b278ca43bc4ca539c3f6d0b066f71fd581ff070f4f34c710ffbb123964f6d8eb8531dccd5230c7ebada0eed1f81f3500af38114324b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc12e7e161f621ce9a87fe0f4162cd42bd764f1849779895a7259c77680f066f71f30e478087635e8629eee1bcc355964fed8eb8531d6c5f5731f8e96a3bb47f159c8791ce7c2085cc921bc3c32cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc5ec436e689e0e5326d62cd4ebf08491747dbc3ce17b0f3a82c15bdcba9dab80e708437c98fc0cd7ed1cb57cea70c49dea60fb3acae0a7abedd0fe51380fc22ccc2e66cdb3dc9489350bf5967bc248ba23bc3c852cf84c5b5c3f76147838fa79263fc37eec98e5d37247dca90ee6ea31063f5d6d87f68fc179481bb3e6e9346562cd42bd4e4f184987d7e54e269e9cc59373c4e278d9d6fb5da63cde7c66e1ef5dc0c8d51f765a8cb48f398ebcc4d3c5c45367f1d4396271bc6c6bff579af204f39985bfaf0446ae9ceab21869df955375c0b39289a7dee2a977c4e278d9d6b15865ca13cd6716febe0a18b9726aa5c548fbae9caa079e554c3c517dd2aa61b01dd5be86c37654ae0c876d897974cc19da5d383eb02a18bcc5dd57e3b585a3af62f233efba7eafb27cc2eb37dea31eafeb93300b731433d37d6e6bd6b24df1092c1eda8e32c762387f6777593ea5e177761cf38114324b9ccb63d6b6fb93b7dd9ab56c537c028b87b67ee65830f919f6075707ee1893bd1cd4c13cbd9ac1cf0cd8a563d3fed5701e4a613e904266897379ccdaf63589db2ebe7f186d537c028b87b66b9863c1e367b13fb83670c798ece5a00ee6e9b50c7e66c02e1d9bf6af85f320ccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22ccc7e336bdbd7256ebb387e8fb6293e81c543db75ccb1e0f1b3387e7f7de08e31d9cb411d3ce7d733f89901bb746cdabf1ece83300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb330fbcdac6ddf90bcedf0791cb44df1092c1eda6e608e05939fe1f8fd8d813bc6642f0775f09cdfc8e06706ecd2b169ff46380fc22ccc2e666dfba6c46d17e7f3d036c527b07868bb8939163c7e16fb839b03778cc95e0eeae039bf99c1cf0cd8a563d3fecd701e4a613e90426689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e25c3971d6b66f49dc764b387e8fb6293e81c543db2dccb1e0f1b3387e7f6be08e31d9cb411dccd35b19fccc805d3a36eddf0ae761a4331f4821b3e4c6f0304b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e486304731fb901bdaf66dc9db0e9f6747db149fc0e2a1ed36e65830f919ae7fb93d70c798ece5a00ee6e9ed0c7e66c02e1d9bf6c99e300b7314b3b67d47f2b60b59cb36c527b07868bb8339164c7e86fdc19d813bc6642f0775f09cdfc9e06706ecd2b169ff4e380f6963c6f39749ce76b86e936c54994fadbbcb94ab41f74253ae01dd8b4c7914e85e6ccab5a0bbdb944783ee25e01be95e6aca4b40778f29af02ddcb4c7925e85e6eca5da07b85297782ee5e533e0aba579af231d0bdca94fb41779f295f0dba579bf235a07b8d295f0bbad79af275a07b9d295f0fbad79bf20da07b8329df08ba379af24da07b9329df0cba379bf22da07b8b29df0abafb4d7901e8deead03d60cab781ee4153be1d746f33e51da07bbb298f05dd43a63c0e74ef80327dbed394c783ee5da69c03ddbb4d7902e81e36e53ad0bdc7942782eebda65c0fbaf799f224d0bddf942783ee03a63c05748f98f254d07dd094a781ee43a63c1d741f36e519a0fb8829cf04dd474d7916e83e66cab341f771539e03ba4f98f25cd07dd294e781ee53a63c1f748f9a329edf4f9bf21da0a37ee54ed051bf7217e8a85f7921e8a85f7911e8a85f7931e8a85fb91b74d4afbc047494772f051de5dd3da0a3bc7b19e828ef5e0e3acabb57808ef2ee5ed051debd12749477af021de5dd7da0a3bc7b35e828ef5e033acabbd7828ef2ee75a0a3bc7b3de828efde003acabb37828ef2ee4da0a3bc7b33e828efde023acabbfb414779f756d051de3d003acabb0741d760ca6f03dd09a6fc76d09d68ca0f81ee2453c67ee664537e27e84e31e577818efac27783ee54537e18740b4df93da05b64caef05dd62537e1fe89698f2fb41b7d4943f00ba46537e04744da6fc41d02d33e50f812e6fca1f065db3297f04740553fe28e85a4cf963a06b35e58f83aecd943f01ba7653fe24e83a4cf953a05b6eca8f828eaee3d4cfe8f6acdb25c58162a475e47393c317d28d015fba8364efe9c8161d9bf65b8091ce4161f8190b43656cb618354f1b43cc30af688bfbcdd4063cad0c3c4c7e86bf99da2d9f5a2c9f7250e754f0b39dc1cf0cd8a563d37e3bd8e638e7188b5a73dc85562c6aa04eabb9c8e9eb695c1ce9183a7f0b0e5fb8e2d86cf1343b6c7732c7918e4d7d62e730d8eeb06ce72ddb782da02dae6d7700f37206667ddcaee48f1bb6ed15e65894cf64270f3ead841824e513dace18213ba4af81f296290375a91ec583ae9dc4aedb119d4b64b7bfd7667d2f07753a1dfe7707c9fadf65f17459ccfaf744f794010e86f610e640a7c541fb79885d5744ec3a21765407afbd8d4cb15b6ef1d07e23f0d0fd553be8e83e85f8f11eaf6918b8ed7eafddc14dba0e606c74301692670cefb31a2d46da2f0023e996034f0753ccec73bdd08a0fde138cb6ead0776ba0ce2eb82e671d7575bb6bc80cf845bfff9f0d92edd36b19e285631301c427b062481b318c0906c62f92e419170c8c4f1cebef3bda7379ef59bd3d7b3380566361e267c6e14615e8b05cedd005c1e061181c0ea661181c0eaeb2c282c33f545fff8cd36ed15047efa1fdfde71eee3dbce7e8f547fa7bf76eedbb1ca94759f4481ae50192a28eb631c1c080517790ec4450ad652b2e79c6c0e7e8e4799a99fc0c2f7a632d9f6a2d9f72506714fc6d2c839f19b04bc7a6fdb10edb097644612cc60d2116e31c3ce386391638e84e3a6ca9f4779cb8a9b27cc1168d3ed9799ea8436470011c3f63e0f4df74631f659c191d0c9c6cea3df51dad3e097ab4565fb5f468ac1e7dd55d901e5dd517343d7aaa474bf5e8a81e0dd5a39f7ab4538f6eead14c3d7aa9472bf5e86443501c7dd4a38d7a74518f269e026cdf065efd8b5e5f21f568a01efdd3a37dface4adf01e8bb117df7adef14f5af477d87a07fd5ea110e7db5d57732fa2aadafacfa4e51df21ea3b7a7d87ab67c8562b596362bd56c9694a4e57728692754ad62bd9a064a3924d4a362bd9a264ab926d4ab62b3953c90b82e2c8fe594ace56728e9273959ca7e47c251728b950c94e251729b958c9254a2e557299925d4a7a94ec56b247c95e25bd4af629b95cc9154af607c55541572a39a8e49092c34afa941c517255509ca5d3b3727a164ecfbae959363daba667d1f4ac999e25d3b3627a164ccf7ae9592e3dab755b509c8dd233117ae641cf34e899053d93a0670eee0e8a33037a26e09ea038d2af47f6f548be1eb9d723f57a645e8fc4eb91773dd2ae47d6f548ba1e39d723e57a645c8f84eb916f3dd2ad47b6f548b61eb97e30288e4ceb91683df2ac479af5c8b21e49d623c70f07c591613d12ac477ef548af1ed9d523b97ae4568fd4ea91593d12ab475ef548ab1e59d523a97ae4548f94ea91513d12fa19259f55f239259f57f205255f54f225255f56f215255f55f235255f57f20d25df54f2ada09897df51f25d25df53f27d253f50f243253f52f263253f51f253253f53f27325bf50f24b25bf52f26b25bf51f25b258f29f99d92df2bf98392c795fc51c99f943ca1e449257f56f217257f55f29492bf29f9bb92a795fc43c93f953c130cccac602732c6f43c34cadfd3dfdf7be8487f437f5fc3a1ab0ff6ef3f72f0fa866bf7f75fd1d0774defd17d07fbaec52f7fdd7c99a630d61e3dda737dc3fec37b7baf6be8bbbabfa16f5fc3eebeab0fef3d865f7ac27c69ce732df6ecdd1b6decbffe13d2ff29d3e868d327d2e4d0a678dfc65597119089e57ca9b5ba3c87569aab0efd7a3fbb78b7db70ec605f7f43bee1b0fab7e7a0fa4eefdea606fcdb3115e463fd0dc7fa7b8ef637ec3bda77a8a1b9098f7be2f8329c689952c6972e9b3274cf83ff07e76a99f7f1d90300", + "bytecode": "0x1f8b08000000000000ffed9d67701cc7b1c7f700100cc72308e64c28514c000f8744800994c41c642a8b4a0449502245121409e51c6ccb966dd9720eb264cb414e720e72ce39e724dbb225dbb265ebcb73bdf7ea55a9deccdeb4f1c76876853b6f83b3b8deaae6cd36e6b67fdddb33bb3733bb7c2608824c50dcaa959c143c77a3bf779bcffc7fb6352778ac3c276726259c5529e1ac4e09674d4a3847a584b336259ca353c23926259c6313e4d46c55c1e02d69de710c714d9a319bb2988e4f414c73298be98414c4b42e48471f3531259cf529e19c9412cec929e19c9212cea929e19c9612cee929e19c9112ce9929e19c9512ced929e19c9312ceb929e19c9712cef929e16c4809e70929e13c31259c27a584f3e494709e9220e712e05c603e4f359f0bcde722f3b9d87cd277969acf46e3638dd96f52b24cb32969b6fe5650d2a2a455499bf5b776251d4a962be9347f6b307feb52b242c94a25ab94ac56b2c6c461ad92d3949caee40c25eb94ac57b241c946259b946c56b245c95625db946c5772a6921728d9a1e42c25672b3947c9b94ace5372be920b945c68b1ec547291928b955ca2e452259729d9a5a447c96e257b94ec55d2ab649f92cb955ca164bf92034aae547250c921258795f42939a2e42a2547951c53d2afe46a25d728b956c9754aaeb7627683921b95dca4e4668bf31625b72ab94dc9ed4aee5072a792bb94bc50c98b94bc58c9dd4a5ea2e4a54aee51f232252f57f20a25f72a79a5925729b94fc9ab95bc46c96b95bc4ec9eb95bc41c91b95bc49c99b95bc45c9fd86851ac25b953ca0e441256f53f276250f29798792772a799792772b7958c97b94bc57c9fb94bc5fc907943ca2e4834a3ea4e4c34a3ea2e4a34a3ea6e4e34a3ea1e4934a3ea5e451259f56f219259f55f239259f57f205255f54f225255f56f215255f55f235255f57f20d25df54f22d25df56f21d25df55f23d2be6df57f203253f54f223a3fbb1f9fc89a94be3623f55f23353feb9f9fc85f9fca5f9fc95f59d5f2bf98da5fbad92c72cddef94fcde94ff603e1f379f7f349f7f329f4f98cf27cde79fcde75fcce75fcde753e6f36fe6f3efe6f369f3f90ff3f94ff3f98c92dba714cb638281ad3b48a88f6add97d7732a14fc05c1e04dc7a2dafc8d3e1b8cbec6ecd327c56e94d91f65e96bcd7ead759c31667f8ca5af37fbf5967eb2d99f6ce9a79afda9967ebad99f6ee94f36fb27833e1bc098abd16b5db551654047f95a05ba5146570dba5a3a1ce8461bdd28d0d1f9ad05dd58a31b0dba714637067459a31b4bb15432dee8ba83a47225dfa38f9b4bfab8661e6a42f2bc7bf471eb98782726cfdbab8f5bcfc0abf3639239d644c89bc946570f3ad3dd04934037d5e826836e9ad14d01dd74a39b0aba1946370d74338d6e3ae86619dd0cd0cd36ba99a09b6374b34037d7e866836e9ed1cd01dd7ca39b0bba06a39b07ba138c6e3ee84e34ba06d0d11a97134077b2d19d08ba538cee24d0515f7b32e8e8def014a3d3fdc4980c7cc7e8a98f0abf43fd33e81652df0cba45d42f836e31f5c9a05b02b649b714fa15d2351a1df551fa6f5da6dc1d24d5260a619b5891f471d591f57157257fdc70de6e753010d76eb0b30262b5c694135c1bd48cb63346c80ee96ba0bc09ea523d8a075d67885d5f4f569af29a98ef7559dfcb419d950effbb8364fd5f65f1acb2984781ff3c39db52909c1df25672ce9e0f75eddca37b9e9198b35b81832167db256787bc959cb3bd50d7ce3dbaef1d8939bb13381872b68727670b79c9d9e2185910b8738f7efb8cc49cbd023892cfd936c9d9a16f25e7eced50d7ce3dfafd3b1273f61ae0483e673b7ae4de60c85bc9397b2fd4b5738fc6624662cede051c0c39db2bfdec90b79273f67ea86be71e8d0b8ec49cbd0f3892cfd94ea69c6d919c0d8af39d41e0ce3d1aa31e8939fb2070249fb37b647c76e85bc939fb28d4b5738fe64b4662ce3e62ca7a9ee1c7669e610ee87e6274738137f9dcdedbca94db05c9ede23a902070e728cddd8dc4dcfebc29eb3cfe39ac3d20dd2f8cee04d0fdd2e84e04ddaf8cee24f08ba10df4481b18f256721bf80dd4b57399e69147621bf8217030e4ec1ec9d9216f25e7ec5350d7ce3d5ad3301273f677c0c190b3bd92b343de4aced9ff86ba76ee2d34e59198b3b4ae54df2ffcc1dc2f2c06dde346b704747f34baa5a0fb93d13582ee09a36b02dd9346b70c747f36ba3ce8fe6274cda0fbabd11540f794d1b580ee6f46d70ababf1b5d1be89e36ba76d0fdc3e83a40f74fa35b0eba678caed3e8f47c17adbdfab6d1e9734bf1e80e923bb7e17aab60f096b1f6bba1dcc8cb93cf05839f45205bcb92b7d5a27d6f0a86eefb32e0c933f89e051b43e1c9034f73f23ce1bad342f2c70dcf719315d32cd86a02bf5a18fcca802d3a36ed93bd1ce8b02f697130b626cf58c8802d3a36edb70223e9b06fa36b0cb51fdd373764067819da52787d467bddc041f66aa0cedc2903754f366ce3e1efd4078c8732f6fdcd968e2957c35c215b746cda2f0023f9d83cfc8c85a132e62d46ae7e2303b6e8d8b6edf18ef8e898b53a62d6c6c4d86a31d27e1b3052fc5a879fb1305446bb5f60ea939a87da27515c9a873f66433aaf39d0e1fd5f9b83b13d79c6f0bcb6598cb4df0e8ca46b011eaeeb61547bf5c536c77d08e6335db3e8fa43f66aa04e47f540ddad703d65e8430ba5de9b629f9efc792ae4f17a36141ee673d7cc948f79ec3b9f0d92cd35bbcd375bb1c2368f7d39573f19d597933d61166661166661166661166661166661166661166661166661166661166661f69f396a5eceb59ee1783292ae003c1ce3fce13baaccb1700ee83198d7497edea290c7b97a5ac7b8c8f2b906eafc5f6680ed71c73a099c3b5f66e998d62985e712d72975c33ed9c3751bb86e8a61ed49c8b3d4e2b16d8f77c4c7c775243eadd1885aa7e553cc72a0c3f5704d4c3c5179d6e4b0dd9098edc21e9eb653c8ebf701e977ea517f62b7115cfbb6c4d2e93ea9ab7ac06f8e1c2875de19af1b544e721e17f30d6d25bfdea630687d425530f85a81f7140c6b5406cd57d3da8876cb760dd4195b15fcfbdc2c87bf7707cf5d23a4eb7458c7a6ef2c82ef7658c7aee3f337b63f6c076e2ad75abe350237d5995035e0e3e74c99e97ea680eb6703e00d2c9f68c3f519c9dfef15d78bb494c0d3063c1c6bd798ee6bf3988f49af17e9b062e5ba5fa63aed10bf0e86f8c5ad59237bc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc2ec3f33beff8258f119e982278cc3b4c6269ccfa07719e1bcd803550376b9e70069ce69b1e5333ea3fc74d500db43a68cef08703def8ee7926b6e2dea5c92bdf1c1739fd3673a97437ef7439b23661d8e982d6762b4fb0cda5f0e8c14bf0ee0e16a8fed168f6d1bfb8c364f6316d5cf72ad5f89ca33d73a8586c46c17d78b70ccebd27a11fbfa55b0628aeb244887f3e0f86e159fdfff62af5dc07e0ad76825df6f1606cd01db6b05c91eae93f886892dad9348be1f28e439af11d446694d488bc357aaf35db8ce7ddf9471ad50018ef598e3efb4c5ad49c03e35f17770e68b73fcf4ee4a3abf5d0edb2b813521dbcd683b6384ec90be06cabfad1aa84bf5281e146b62d76d84de6588ecf6f79aadefe5a04ea7c3ffee2059ffbb2c9e2e8b59e7ce8f20cf1e837b3dae3ea93322468b20465407ef79b9ae5ff69a6d7bad32f6a3a3ad3af4dd1aa8f324f451a5bc2b8aeb7e21ea1a80f70bf67561286bc72b7d3de0bfa0bf487a3de0bf20875cf7a574fcc5707ce21a1d445f5ba8ceff5ad75186f57a437aef95ebb71ff1e27a43aaf32cf45579b32e37ea778ceb390baedf0d51cf7d903dbca72ac577ec1792be36623e220be6f2bfafd126d6948f1d11dccb1cdfcd467c976245ebcbf177b21d3f1d874ef84e77227128f6375d962fd4a63ac117aa530fbef0dc3315ef3f93f775f0fd10f541ad0e5fa9ce347817dc0c53cec279c2bef254c7df698bbbffa4f8699f87fb9dea68db8777aa2fa81ea86bbf1b9d625dea3bd5dbadeff9f84ef5d99067a7c2b3165c7df5ca88182d8618511d7cd6d1fefd1f758d399eef25b5fb4dbc4e0e279b3d7eebba3fa13a780f4d75daa09fcd3aeadae3d2740d49727d3a3e0fb414ece2f3404b99e2990b06c733677170daaeb36cd70da3ed7acb76fd30da96984bcc7d8a39c3ff3d51f6ff8581ff6745550a18ab53c0589302c6512960ac4d01e3e814308e4901e3d814308e4b016316188fe7b59d213e05cffebfa7d87b0db4cdf03e8730168dc1d063d1c4cb137bef83b619dea152f2ff37c0fc7f613597fb7f61e5e07b9352c03839058c5352c03835058cd352c0383d058c3352c03833058cb352c0383b058c7352c03837058cf352c0383f058c0d29603c21058c27a680f1a414309e9c02c65352c0b8401813615cc2cb58f0edff71ce0683d79a3d1f0ff3bb47c37728bade73caf17fe396ea3bf37b879bcb7d4f1faeb1e0fdbf1effb3770972aca128f55d8271ff3f361363a15c46aeb5e4b88e7a283cf81caaebf91606c642b98c5ccfa0e0339143e171fd5fbdbccf041563560e23d79ab152d734e2b382ed8e98313016ca65e47aee009f891c0a8febd9c5665ec642b98c5ceb73b36063283c9d10b3e58e98313016ca65647abe2c8c5967093cf81c56a723660c8c85721935cf0aa6987595c0b30262d6e588994f8cc893f43bd1bb1cb6389edb2bd5776240c6b129601c9702465c27c1d17fc5ad93e8e28d4fa1dcf8709dafb87512689be139913016f85cc0f3c562152f4fec3a09b4bd9a2916f8dcc6f3c56235f0703c4792051b43e121861c7c6f520a1827a780714a0a18a7a680715a0a18a7a78071460a1867a68071560a1867a780714e0a18e7a680715e0a18e7a780117fab32dc2bc6fe7e593dc26d47fd5619e9b6a37e978c74db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e4b94fb6d330c62f8c238f11791a92e3c9a3ef68abdb03dfbb1d3c1926dfd1d65a0f7c2786b431ae4901e38a14304a1c8b6b10cb61d43ca731f1ac2d81e734e0399d89e7b412784e079e3392e70973eaf41278882107df5b9102c635296094384a1c7d629438564e1c8551188551188f07631afa70614c453e16ca65d43ceb92e709637646093ceb2066f4bd665ec642b98c9a677df23c61ccd695c0b31e62b6ce113306c642b98c9a6743f23c61ccd697c0b30162b6de113306c642b98c9a6763f23c61cc3694c0b31162b6c1113306c642b98c9a6753f23c61cc3696c0b30962b6d1113306c642b98c9a6773f23c61cc3695c0b31962b6c9113306c642b98c9a674bf23c61cc3697c0b30562b6d9113306c642b98c9a676bf23c61ccb694c0b31562b6c5113306c642b98c9a675bf23c61ccb696c0b30d62b6d511335f1957a480714d0a1899e358289751f36c67e2d95602cf76e0399389677b093c6702cf0b92e70973eacc1278882107df5b9102c635296094384a1c7d629438564e1c85511885b134c6ee1430cab916465f19197e5fc53e4373e608b75d67d9aeab10db51cfd08c74db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e47925d8963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e47925d8963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9efb647b47f2b60ba53ec3ba0378389ea965f233af8f7b9639d6b309c64fc7ea6c2b56675ab1ca419db3207e6733c42f0376e9d8b44ff64a653ed5036626db8509ea1863c17fb2b1c68a87b67f0e93ef517dfd3923dc76545f3fd26d47f5f523ddb6e4b9e47925d8963c973caf04db92e792e7bed8c6f2a860e0be9ddeafa48f712efc3d63b1eaad06eaac1a5dfcac0ba40d71d8963624d78a4ab02d792e795e09b625cf25cf2bc1b6e4b99f797e5ef2b6c3b931fc7da1b7b8b9b1f380e75c865830f999d73e9d6ff9748ee5530eeae03b6bcf67f0330376e9d8b47f3e9c87b4316b9ed5a64cac59a8b7da1346d29dcbcb13b6afd5c1e02dae7d9d0f3c0ceda099c9cfb07d5d60f9b4da1177aa83b97a01839faeb643fb17c079481bb3e6596bcac49a857a6b3d6124dd79bc3c61fb5a1b0cdee2dad705c0c3d1ff30f919b6af0b2d9fd63ae24e7530572f64f0d3d57668ff42380f6963d63ca79932b166a1de699e3092ee7c5e9ed62cf84c5b5cfbba107838fa1f263fc3f6b5d3f2e93447dca90ee6ea4e063f5d6d87f677c27910666176316b1efa3fe589350bf54ef784917417b0f2b4e6b3e0336d71fdd84ee0e1e8e799e21ef66317593e9dee883bd5c15cbd88c14f57dba1fd8be03c94c2bc2685cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc12e7f29835cf19a64cac59a87786278ca4bb9097277c7ee78c60f096b1f6bba17c11f0ec64880f939fe1baf78b2d9fce70c49dea60fbba98c14f57dba1fd8be13c94c2bc2685cc12e7f29835cf3a5326d62cd45be70923e976f2f284fdd8ba60f016d78f5d0c3c1cfd3c939f613f7689e5d33a47dca90eb6af4b18fc74b51ddabf04ce83300bb38b59f3ac376562cd42bdf59e3092ee22569e42f81ce2fa60f016d78f5d023c1cfd3c53dcc37eec52cba7f58eb8531dccd54b19fc74b51ddabf14ce4329cc6b52c82c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c2b27ce9a678329136b16ea6df084917417b3f2b484f30e1b82c15bdcbcc3a5c0c3312fc314f770dee132cba70d8eb8531d6c5f9731f8e96a3bb47f199c8791cebc2685cc921bc3c32cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc5ec436e689e8da64cac59a8b7d11346d25dc2cb13bef7606330788b5bb77319f05cca101f263fc3753bbb2c9f363ae24e75b07ded62f0d3d576687f179c875dc22ccc0e66cdb3c99489350bf53679c248ba4b7979c27e6c5330788bebc776010f473fcfe467d88ff5583e6d72c49dea60aef630f8e96a3bb44ff6845998a39835cf665326d62cd4dbec0923e92ee3e509fbb1cdc1e02dae1feb019e5d0cf161f233ecc7765b3e6d76c49dea60aeee66f0d3d576687f379c0761166617b3e6d962cac49a857a5b3c6124dd2e5e9e42167ca62dae1fdb0d3c1cfd3c939f613fb6c7f2698b23ee540773750f839faeb643fb7be03ca48d59f36c356562cd42bdad9e3092ae8797276c5f5b83c15b5cfbda033c1cfd0f939f61fbda6bf9b4d51177aa83b9ba97c14f57dba1fdbd701ed2c6ac79b69932b166a1de364f1849b79b97276c5fdb82c15b5cfbda0b3c1cfd0f939f61fbeab57cdae6883bd5c15ced65f0d3d57668bf17ce43da9835cf765326d62cd4dbee0923e9b09fa2ad0a18b7333106166360c50779e679c6b3c3339e199ef14cf28c67ac673c8b3ce3a9f68c67b9673c6d9ef1143ce399ef19cf4ccf78267bc633ce339ea59ef1d478c6b3c0339ec59ef1ccf28c678a673c59cf781a3de319e5194f97673c9d9ef12cf48ca7dd339e16cf789679c633db339ea99ef12cf18c67bc673c39cf789a3ce3a9f58c67a5673c733ce399e619cf04cf78ea3ce319ed19cf2acf783a3ce369f58c27ef19cf5ccf78a67bc633d1339e7acf78c678c693f180271b3c771d4316febe037455d677f5f565f79481bfd3bc71157c679f29573b8edd0b3a9a67dee7f82ec6896b2e1c6d75c33ed91b0f1cfb3ce119e3194fbd673c133de399ee19cf5ccf78f29ef1b47ac6d3e119cf2acf78467bc653e719cf04cf78a679c633c7339e959ef1d47ac6d3e4194fce339ef19ef12cf18c67aa673cb33de359e6194f8b673ced9ef12cf48ca7d3339e2ecf784679c6d3e8194fd6339e299ef1ccf28c67b1673c0b3ce3a9f18c67a9673ce33ce399ec19cf4ccf78e67bc653f08ca7cd339ee59ef1547bc6b3c8339eb19ef14cf28c6786673c3b3ce399e7194f95836707134fd4b3cd3b3cb1cd701ef2fab89733f974853956ad392ef193bd1aa873921978d4f31ff85de2b2e7ffb1ed5c0131e27aaf44cee2a1fdbd23dc769d65bbae426cd75bb6eb2bc4b6e4b9e47925d8963c973caf04db92e792e73eda7e3639db6df27ea9a1f3c8fb9ce279e47d4ef13cf23ea7781e799f533c8fbccf299e47dee714cf23ef738ae759e0198fbccf299e47dee714cfd3e819cf28cf78e47d4ef13c0b3de391f739c5f3c8fb9ce279e47d4ef13ce33de391f739c5f3d47ac6e3dbfb9c7c7b1fbcbc5f2a9e6782673cf27ea9781e79bf543c8fbc5f2a9e47de2f15cf23ef978ae719e3194fc6039ee77bbf14be17ea0a53de0b3a5a5f1af71eaa2c1ce70ad0d1782e1d435faf0e4d792e43157c67bf83eb72873db2b3dff1dde1883bdaea867db287efabdaef09cf18cf78ea3de399e819cf74cf78e67ac693f78ca7d5339e0ecf785679c633da339e3acf782678c633cd339e399ef1ecf08c67a5673cb59ef13479c693f38c67bc673c4b3ce399ea19cf6ccf789679c6d3e2194fbb673c0b3de3e9f48ca7cb339e519ef1347ac693f58c678a673cb33ce359ec19cf02cf786a3ce359ea19cf38cf78267bc633d3339ef99ef1143ce369f38c67b9673cd59ef12cf28c67ac673c933ce399e119cf3ccf78aa1c3c5cef8c8a7abe7e38de57f57cb6f5fe52888bdeb2f0f7e1788e6b87c548fbb8ee0179896729134fd47b01967a605bfb4fbf452798cf2cfc1d9fc3e1caa9a51623edbb720ad7353632f144bdcfa0d103db3a164da64c6b00b2f0f72660e4caa9468b91f65d3955cfcbd39a059f698b5b6b846d8ee31c32f999c7f697e03b34f23a56dbad583559b1ca419de158971ed51f903d6116e62866cd437329c48ad7b3e178ce6c288caeeb2b034fd83f2e0b066f71fde376e0e1b87e30f919f663072c9f9639e24e7530570f30f8e96a3bb47fc061bb21483616570e2116573a78ae1ce65890bd529977a490d987386b1e5a8b48acb8be39ef0923e996f2f284fd633e18bcc5f58f57020fc7f583c9cfb04f3868f99477c49dea60fb3ac8e0a7abedd0fe41380fa5301f4821b3c4b93c66cd437310c49a857a054f1849b79d95a790cf82cfb4c5f563078187a39f678a7bd88f1db27c2a38e24e75b07d1d62f0d3d57668ff109c0761166661166661166661166661166661166661166661166661166661166661f69b59f3d0b3b1c49a857a2d9e3092ee4a569ee2bc434b30788b9b7738043c1cf3324c710fe71d0e5b3eb538e24e7530570f33f8e96a3bb47f18ce83300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb330fbcdac79e89dedc49a857aad9e3092ee202f4ff8dc566b30788b9b77380c3c8718e2c3e46738efd067f9d4ea883bd5c15ced63f0d3d57668bf0fce83300bb38b59f3d0bbda88350bf5da3c6124dd21569ee2fc695b30788bebc7fa8087a39f678a7bd88f1db17c6a73c49dea60ae1e61f0d3d57668ff089c8752980fa49059e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296380f0fb30f71d63cf47f08126b16eab57bc248bac3ac3c2de1bc437b30788b9b7738023c1cf3324c710fe71daeb27c6a77c49dea60fbba8ac14f57dba1fdabe03c8c74e603296496dc181e66c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e628661f7243f3749832b166a15e87278ca4ebe3e509df7bd0110cdee2d6ed5c053c4718e2c3e467b86ee7a8e5538723ee5407dbd751063f5d6d87f68fc27910666176316b9ee5a64cac59a8b7dc1346d21de1e52964c167dae2fab1a3c0c3d1cf33f919f663c72c9f963be24e7530578f31f8e96a3bb47f0cce43da98354fa729136b16ea757ac2483abc2e7732f1e42c9e9c2316c7cbb6deef32e5f1e6330b7fef0246aefeb0d362a47dcc71e4259e2e269e3a8ba7ce118be3655bfbbfd2942798cf2cfc7d253072e55497c548fbae9caa039e954c3cf5164fbd2316c7cbb68ec52a539e683eb3f0f755c0c895532b2d46da77e5543df0ac62e289ea93560d83eda8f6351cb6a37265386c4bcca363ced0eec2f18155c1e02deebe1aaf2d1c7d15939f79d7f57b95e5135ebff11ef5785d9f845998a39899ee735bb3966d8a4f60f1d076943916c3f93bbbcbf2290dbfb3e3980fa49059e25c1eb3b6dd9fbcedd6ac659be213583cb4f533c782c9cfb03fb83a70c798ece5a00ee6e9d50c7e66c02e1d9bf6af86f3500af38114324b9ccb63d6b6af49dc76f1fdc3689be213583cb45dc31c0b1e3f8bfdc1b5813bc6642f0775304faf65f0330376e9d8b47f2d9c0761166661166661166661166661166661166661166661166661166661166661f69b59dbbe2e71dbc5f17bb44df1092c1edaae638e058f9fc5f1fbeb03778cc95e0eeae039bf9ec1cf0cd8a563d3fef5701e84599885599885599885599885599885599885599885599885599885599885d96f666dfb86e46d87cfe3a06d8a4f60f1d07603732c98fc0cc7ef6f0cdc31267b39a883e7fc46063f3360978e4dfb37c27910666176316bdb37256ebb389f87b6293e81c543db4dccb1e0f1b3d81fdc1cb8634cf6725007cff9cd0c7e66c02e1d9bf66f86f3500af38114324b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc12e7ca89b3b67d4be2b65bc2f17bb44df1092c1eda6e618e058f9fc5f1fb5b03778cc95e0eea609edecae06706ecd2b169ff56380f239df9400a992537868759724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398ad987dcd0b66f4bde76f83c3bdaa6f804160f6db731c782c9cf70fdcbed813bc6642f0775304f6f67f0330376e9d8b44ff6845998a398b5ed3b92b75dc85ab6293e81c543db1dccb160f233ec0fee0cdc31267b39a883e7fc4e063f3360978e4dfb77c279481b339ebf4c72b6c3759b64a3ca7c6add5da65c0dba179a720de85e64caa340f76253ae05dddda63c1a742f01df48f752535e02ba7b4c7915e85e66ca2b41f77253ee02dd2b4cb91374f79af251d0bdd2948f81ee55a6dc0fbafb4cf96ad0bdda94af01dd6b4cf95ad0bdd694af03ddeb4cf97ad0bdde946f00dd1b4cf946d0bdd1946f02dd9b4cf966d0bdd9946f01dd5b4cf956d0dd6fca0b40f75687ee0153be0d740f9af2eda07b9b29ef00dddb4d792ce81e32e571a07b0794e9f39da63c1e74ef32e51ce8de6dca1340f7b029d781ee3da63c1174ef35e57ad0bdcf942781eefda63c19741f30e529a07bc494a782ee83a63c0d741f32e5e9a0fbb029cf00dd474c7926e83e6acab340f731539e0dba8f9bf21cd07dc294e782ee93a63c0f749f32e5f9a07bd494f1fc7eda94ef001df52b77828efa95bb4047fdca0b4147fdca8b4047fdca8b4147fdcadda0a37ee525a0a3bc7b29e828efee011de5ddcb404779f772d051debd02749477f7828ef2ee95a0a3bc7b15e828efee031de5ddab414779f71ad051debd16749477af031de5ddeb414779f706d051debd117494776f021de5dd9b414779f716d051dedd0f3acabbb7828ef2ee01d051de3d08ba06537e1be84e30e5b783ee44537e0874279932f633279bf23b41778a29bf0b74d417be1b74a79af2c3a05b68caef01dd22537e2fe8169bf2fb40b7c494df0fbaa5a6fc01d0359af223a06b32e50f826e99297f08747953fe30e89a4df923a02b98f24741d762ca1f035dab297f1c746da6fc09d0b59bf22741d761ca9f02dd72537e1474741da77e46b767dd2e290e1423ad239f9b1cbe906e0cf8d21d247b4f47b6e8d8b4df028c740e0ac3cf58182a63b3c5a879da18628679455bdc6fa636e06965e061f233fccdd46ef9d462f994833aa7829fed0c7e66c02e1d9bf6dbc136c739c758d49ae32eb4625103755acd454e5f4fe3e248c7d0f95b70f8c215c7668ba7d961bb93398e746cea133b87c17687653b6fd9c66b016d716dbb0398973330ebe376257fdcb06daf30c7a27c263b79f06925c420299fd076c608d9217d0d94b74c19a84bf5281e74ed2476dd8ee85c22bbfdbd36eb7b39a8d3e9f0bf3b48d6ff2e8ba7cb62d6bf27baa70c7030b48730073a2d0edacf43ecba2262d709b1a33a78ed6d648add728b87f61b8187eeafda4147f729c48ff7784dc3c06df77bed0e6ed2750063a383b1903c63789fd56831d27e011849b71c783a9862669feb85567cf09e60b45587be5b037576c17539eba8abdb5d4366c02ffafdff6c906c9f5ecb102f1c9b08203e811543da88614c30307e9124cfb860607ce2587fdfd19ecb7bcfeaedd99b01b41a0b133f330e37aa4087e56a872e08060fc3e070300dc3e070709515161cfea1fafa679c768b863a7a0fedef3ff770efe13d47af3fd2dfbb776bdfe5483dcaa247d2280f901475b48d0906068cba836427826a2d5b71c933063e4727cfd3cce46778d11b6bf9546bf994833aa3e06f6319fccc805d3a36ed8f75d84eb0230a63316e08b118e7e01937ccb1c04177d2614ba5bfe3c44d95e50bb668f4c9cef3441d22830be0f81903a7ffa61bfb28e3cce860e06453efa9ef68f549d0a3b5faaaa54763f5e8abee82f4e8aabea0e9d1533d5aaa4747f568a81efdd4a39d7a74538f66ead14b3d5aa947271b82e2e8a31e6dd4a38b7a34f11460fb36f0ea5ff4fa0aa94703f5e89f1eedd37756fa0e40df8de8bb6f7da7a87f3dea3b04fdab568f70e8abadbe93d157697d65d5778afa0e51dfd1eb3b5c3d43b65ac91a13ebb54a4e5372ba923394ac53b25ec906251b956c52b259c916255b956c53b25dc9994a5e101447f6cf5272b69273949cabe43c25e72bb940c9854a762ab948c9c54a2e5172a992cb94ec52d2a364b7923d4af62ae955b24fc9e54aae50b23f28ae0aba52c9412587941c56d2a7e48892ab82e22c9d9e95d3b3707ad64dcfb2e959353d8ba667cdf42c999e15d3b3607ad64bcf72e959addb82e26c949e89d0330f7aa641cf2ce899043d737077509c19d03301f704c5917e3db2af47f2f5c8bd1ea9d723f37a245e8fbceb91763db2ae47d2f5c8b91e29d723e37a245c8f7ceb916e3db2ad47b2f5c8f5834171645a8f44eb91673dd2ac4796f548b21e397e38288e0ceb91603df2ab477af5c8ae1ec9d523b77aa4568fccea91583df2aa475af5c8aa1e49d523a77aa4548f8cea91d0cf28f9ac92cf29f9bc922f28f9a2922f29f9b292af28f9aa92af29f9ba926f28f9a6926f05c5bcfc8e92ef2af99e92ef2bf981921f2af991921f2bf989929f2af999929f2bf985925f2af995925f2bf98d92df2a794cc9ef94fc5ec91f943caee48f4afea4e409254f2af9b392bf28f9ab92a794fc4dc9df953cade41f4afea9e499606066053b9131a6e7a151fe9efefede4347fa1bfafb1a0e5d7db07fff9183d7375cbbbfff8a86be6b7a8fee3bd8772d7ef9ebe6cb3485b1f6e8d19eeb1bf61fdedb7b5d43dfd5fd0d7dfb1a76f75d7d78ef31fcd213e64b739e6bb167efde6863fff59f90fe4f9946479b3e91268736c5fb36aeba8c804c2ce74badd5e539b4d25c75e8d7fbd9c5bbdd866307fbfa1bf20d87d5bf3d07d5777af73635e0df8ea9201feb6f38d6df73b4bf61dfd1be430dcd4d78dc13c797e144cb9432be74d994a17b1efc3f390dd8cbf1d90300", "isInternal": false } ], - "packedBytecode": "0x000000028df71de500000046871f8b08000000000000ffed9d07741d45b6ae5bb61ce0481893b3450e06a3e49c64724ec6608c31b62c0b1b0739623298e81cc8c10639e78c718e18c3cc30393381811926dd3b7367ddf5e6be77df7a8f75bbcea9bdf4ab5c7daca3e992ff2355af5552f53ed5bdbffa7b7775aaeefa47100439416a6a1ea60b82c327f9bd4cff2ffcd7a6a218d755e89233274b389b650967f32ce1cccd12ce1659c2d9324b385b650967eb2ce13c26464ec5d62ca83dc5cd7bac035de3664c6499a67959a0697e96697a5c1668da26c88e36eaf82ce16c9b259c276409e78959c2795296709e9c259ca76409e7a959c2795a96709e9e259c676409e79959c2795696709e9d259ce7640967bb2ce12cc812ce73b384f3bc2ce13c3f4b382fc812ce0bb384f3a21839db03e7c5faff25faffa5faff65fabf94bd5cffbf42ffefa0eb98abe7af545c61520f698a8ddf4ac2541aa68e61ea64fcd6394c5dc2d4354cddf46f05fab7ee61ea11a69e61ea15a6de5a833e61ba2a4c5787e99a305d1ba6ebc2747d986e08d38d61ba294c3787e99630dd1aa6dbc2747b98ee08d39d61ba2b4c7dc3747798fa85e99e30dd1ba6fe61ba2f4c030c96fbc334304c0f846950981e0cd3e0300d095379988686a9224cc3c25419a687c2343c4c23c2f4709846866954984687694c98aac234364ce3c2343e4c13c234314c93c2f448982687e9d1303d16a6c70dcd9e08d393617a2a4c4f1b9ccf84e9d9304d09d373617a3e4c2f84e9c530bd14a697c334354cd3c2343d4c33c234334cb3c2343b4c73c234374cf3c2f44a985e0dd36b617a3d4c6f84e9cd30bd15a6b7c3f44e98de0dd3fc302d08d37b9a457684f7c3541da685615a14a6c5615a12a6a5615a16a6e5615a11a695615a15a6d5615a13a6b5615a17a6f561da10a68d61da14a6cd61fa204c5bc2f46198b686695b98b68769479876866957987687694f98f686695f98f687e940983e0ad3c1307d1ca64361fa244c9f86e95b61fa7698be13a6cfc2f4dd307dcfd0fcfb61fa41987e18a61f69db8ff5ff9fe8b272ffeea761fa99ceff5cffff85feff4bfdff7363995f85e9d786ed3761faad61fb224cbfd3f92ff5ffaff4ffdfebff7fd0ffbfd6ffffa8ffff49ffffb3feff17fdffaffaffbfe9ffffaeffff4dffffbbfeff1ffaff3fc2f440412adf3aa899ca8298daa8d2cae4b31f11ffe2a0f6a4b468ae7f93ff05da9eabe7e5bf68d742cfb730ec2df57c4b633dadf57c6bc3de56cfb735ec27eaf9130dfbc97afe64c37eaa9e3fd5b05fa0e72f007b22807bc3daae6ccdb529076c12afcdc0d642db9a83ada5ac0e6cadb4ad05d864fbb604db31dad60a6cc76a5b6bb025b4ed18d1324c79da5616c4152b8543d47af3e35eaf7e5e765cfcbc43d57adb38e23d3e7ede616abd6d1df0aaf83841afeb78889b13b5ad2dd84ed2b613c076b2b69d08b653b4ed24b09daa6d2783ed346d3b056ca76bdba9603b43db4e03db99da763ad8ced2b633c076b6b69d09b673b4ed2cb0b5d3b6b3c156a06de780ed5c6d6b07b6f3b4ad006ce76bdbb960bb40dbce03db85da763ed82ed2b60bc026edef856093f3c58bb44db51dc7e4c032da2eed56721969b3c176a9b4d760bb4cda6ab0b597761a6c97836fb15d016d8dd83a689bb45beab76e3a5f16c4b59f1457aaf5768f7bbde19ad57a7bc6bfdee433c75e418dae65e0a73b68d55be763ecd75484be7374123f62cf85fc4d5056ca891e72ec1176758ce9a1f3bdd32cd7cd582e1fcaf4b0d4bf2c88b7fe3d0d9e9e06730bc8bb89d992121fb3759e328ed9fe50d68c3d390f6a8c317b2b703888d9ce3e66eb3c651cb39550d68c3d39176e8c317b3f703888d97237315b5ce8633675df2c08ecb127d7438d3166470047fc31dbd1c76cdda78c63f639286bc69e5c1337c6989d0c1cf1c76ce7727f6e50e729e3989d0b65cdd893fb338d31665f040e07315be9dbd93a4f19c7ec7b50d68c3db957d81863f655e0883f66bb3a8ad9121fb341ea196810d8634fee5b37c6985d081cf1c7ec507f7fb6ee53c631bb03ca9ab127cf501a63ccaed779f59ce1c7fa39c35960fb89b69d0dbcf1c776454747b15dec633bd5372408ec312acff31a636cefd57915c73f87fe0862fb85b69d0bb65f6adb7960fb5cdbce877a39d807cafd3e50e729e37de0d750d68c6579b6dc18f7811f02878398adf0315be729e398fd2b9435634ffa3934c698fd02381cc46ca58fd93a4f19c7ecff81b266ec5da2f38d3166a5afa93a5ff8529f2f5c06b6afb4ad3dd87eaf6d9783ed0fda7605d8bed6b60e60fba3b65d09b63f695b21d8feac6d4560fb8bb61583edafda5602b67fd3b652b0fdbbb67504dbdfb4ad13d8feae6d9dc1f61fdad6056cffd0b6aedaa69e7749df2b396f6d0dac65417cdb3601bac89463cc9741bed82d4f613ef0a0afd2f87d95a8ba970475af7b29f0747450f704f8a80b4f47e0e9143f4fb22f6ae7f8d79bdcc62586a609f05502f5eae2a05e39e04bd62df3e22f1f6cb89f77b130768d9fb138077cc9ba65be2b308a0ddb1d79ff47f61fd5369f9b53c3eb605f4a1e9fd15f197088bf5c28f3cf7635652fd46c79f03bb6c19d0c9ba3b84cc685f89275cbbcf8cb83fa746a78c6e2ba327634185db51139e04bd66dface837c915b7dd2f27426f1ede0bcdbdaa689e6dd1bc07757c377a9e11bdb4e99d21ddbba0273ecd73ffad8d623fef516e2b9b25ca7881f3c7fc0eb89b8ea84bee53a45fc883d17f237e4d4949572a287b4c3c2aef661d996c86e2ed7c5582e1fca74b7d4bf2c88b7fe3d0c9e1e06b33adef48463a183fd211903dd0d0e992f05ed7a4468d71db493329780760ece3d93da75337864be23f048fb8ded595103f31411f8c67358bc9693dff13cc0d5f62a321865deb6bdba0263470ba38373c2e274c7c35260145b37e02971a459d4762d21f1ede2ba32077cc8b9b9796d930b656e6f5e53b622c7295b319e3bcb54d76bdef8b7537121ee1f75e171bc0f15398ac742bc7ff34d106fac99ed92d9de44dde371d59697183c322ffe3cb367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed933f3332b1e799e80fdb6a45c271246b3ff9babfbfcc96ff1e975e133a07f3aed0f565c88cffea41fc465469d73a1cc89cd6ad8fe1bfa83997d89a2b6a58bbeb1e9b6a5f8c3fe600df10cb1d4e0317de759f4c1e7d2a899ab3e50669b21f3d83f4df42b021e57fb63b1c163fac636a38454b3a876d6559fbea838b3f5272c88cd77f15057cf75d577cfd4b743cde3572743d3e437490d9b6a93ee6a5e536f17cf79337dee8cc70dc9c7f91c17fb65a0aff8dbd9e25afd139a05b58f1518ebaefa6ac97e257d23ba1bbe73a1ccb9cd6ab60df6a92b0b0e3f36601f2f59b72c73192cdbc358771b77f54ddb0fa53b704bbea551b7cec02d652e8263f74f75ded131b038d37724f0981cfff125d55fa424031e3cdeb9386771741c2dc4788cbbbf88d90fd276be2c65b00fa983febb698fc5e2cf337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d333fb3e2319fa1e3b3df5212c606ea63937c9e21df67c3e7625b9bd5f875fd0c509e39b537ea8cef28e7c23bca3b351bf67dc0ef4ad9b6a5ab676b51db52fcb1f57dc8b3e8a334eb61d1ccc1771dd37eb303bf9128faf5001e57fb63d4b73b6c6d4611a96651edac8bbe0be9e2ccd64fa12036dfa9fe222e9eeb4a7f11f3f8657ed708fb49880d9f83477d2facd8b01ded36c0d6af4df2f8cd051763dc603c9b7d05c51ff693f8426b2bfd24e26f078a0b5d1e23641f953e212596ba4a993f34ab29fb479dc7be42a5b0ae7f5a7e97295d9f046c531d7c3f36b97d655db27d6ddfaeed03ac31f92ec275e5e8d4c7d02017f2ffab594d59292765456b6157fb887c570ad9cde53a1acbe543995e96fa9705f1d6dffc96706f8359c5ce5f20cefe09e77aaedaa45e111a5d061a49193ce775d5afd66c23cd3ed3d827b2955106cf4fa5ccff87362aaa4fbaad4fa5abf385a8fe9c78be603ba731eb68f61d6feafd01f3f575888bfe80b2ee3641ed3e7981b1fef6b07ee16a15441f5ba44c5b58ffd1fcee95edda4f78b1bfa1943905aefd6ed0f94caefd8ed675bcedda0f978baa3bb60b711f1b311e91056359ca1418f1d82382bbab65d9f3239615adcc6f1fe275299e23c4ffddc8547bd3dba88bec53f87d7f2973a9b1dfc47fce943aff74f58d4c5997b441c596ba4a990eb0af15ea7c02b613be53d4dbf2bb4ce9ce3f453f55e7abe2af7372fb5eadd725dbf72a8bef6b803526df45e85bce3fc58fd87321df0b8e27524ef410ad855ded23720e87ece672dd8de5f2a14c1f4bfdcb8278eb7f95c17395c1ac62a704e2ac37bc6be1aaadee13a1517bd048cae0bd6bdb778d6df73a1aea3cd5fc5e7a7e70f8b77bf138e9e69ccdfeae9c79ffd6767ed2dee0c7f3935ba19d4d58ca9af7a565b938fba7e3fb40785e88ef03b9ba46ca0f6aeb996f70b8f4ddc6f0dda6017db7357cb76d40df5e73af3993e64c63fee073c866c0e8e25887c7d5ba30da8e7fcd81d1d53b9b251930e237aff178278c2ebe135edf3185f05ca70530ba78df38d3fbd59d8011bf31208c2eded1cef43bd5f8deb62cd70a185d8c6b846328d585d136d6516bf8ef605ca3a2fa8e0382631d1d038c2ec6064904b5c733391263376094e58e054617cf911241edfb6a4762c4e795b25cc23163ba63bbe3be3fc599de8368887e0551e71ae8dbc1fdff62ec9b50172d7abae5497bee83be1ddcff4a6a8163591e490b7c3ee7626ccd4450fb59d89178f019a22c770230963962ec9d01631930ca722702631f478c651930f60146b19f048c0eee432619fb64c088f7eb64b99381f16a478c5765c0783530ca72a700a38b7b8a09f05b17c66b8051963b1518af75c4784d068cd702a32c771a305ee788f1da0c18af034659ee7460bcde11e37519305e0f8cb2dc19c0788323c6eb3360bc011865b93381f146478c3764c0782330ca726701e34d8e186fcc80f1266094e5ce06c69b1d31de9401e3cdc028cb9d038cb73862bc3903c65b8051966b078cb73a62bc2503c65b8151962b00c6db1c31de9a01e36dc028cb9d0b8cb73b62bc2d03c6db8151963b0f18ef70c4787b068c7700a32c773e30dee988f18e0c18ef044659ee0260bccb11e39d1930de058cb2dc85c0d8d711e35d1930f6054659ee2260bcdb1163df0c18ef06c6be16c67e8e18efce80b11f30ca729703e33df13326afa5fb65c0780ff0dc1b3f4f52b37b32e0b9d72d4ff21b8af7587cdd17bfafe4b6e81fd4bdeef701cf80f87992dbe2be0c7884211f9643cdee8f9f31a9d9800c18ef079e81f1f32435bb3f039e81a0d9fd16cd1e889f31a9d9c00c181f009e41f1f324357b20039e41a0d90316cd1e8c9f31a9d9a00c181f049ec1f1f324357b30039ec1418d660f5a341b123f6352b3c119300e019ef2f879929a0dc980a71c341b62d16c68fc8c49cdca33601c0a3c15f1f324351b9a014f056836d4a2d9b0f819939a5564c0380c782ae3e7496a362c039e4ad06c9845b387e2674c6a569901e343c0333c7e9ea4660f65c0331c347bc8a2d988f819939a0dcf807104f03c1c3f4f52b31119f03c0c9a8db06836d211e3c319308eb4f0c4fd4df4872dbe463baafba8a0ee7517867c580efb498c71c4383a03c631c028cb613f892a478c633260ac0246592ee198315d3f892af03d367edfc976a92aa8bb3e63ddf2a4ed2781bec739d2626c50772dc6b9e549db4f027d8f77a4c5b8a0ee5a8c079e090eb448808fbaf008433e2c87fd24263a629c9001e3446094e5b09fc424478c1333609c048cb21cf69378c411e3a40c181f0146590efb494c76c4f848068c93815196c37e128f3a629c9c01e3a3c028cb613f89c71c313e9a01e363c028cb613f89c71d313e9601e3e3c028cb613f89271c313e9e01e313c028cb613f89271d313e9101e393c028cb613f89a71c313e9901e353c028cb613f89a71d313e9501e3d3c028cb613f89671c313e9d01e333c028cb613f89671d313e9301e3b3c028cb613f89298e189fcd80710a30ca72231d33a6bb7e99d2c87d475dab3476df51d7258dddb78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74cbe9f73e03b013e64ca31e6cb202f0cf9b0dc48cfd8a81991a7203e9e42ac3bfa7a9ea0eecf5b78721cd51d7dbd40507761c836c6e7b280716416307a1d537d10ebc3a8785e74c4f342063c2f02cf4b8e785ecc80e725e079397e9e644cbd94018f30e4c37223b380f1b92c60f43a7a1d9918bd8e4d4747cfe8193da3673c1a8cd9d0867bc6ac88c7e2fa322a9ea9f1f324357b39039ea9a0992c77af5bc6e2fa322a9e69f1f324359b9a01cf34d06caa4533078cc5f565543cd3e3e7496a362d039ee9a0d9348b660e188bebcba87866c4cf93d46c7a063c3340b3e916cd1c3016d79751f1cc8c9f27a9d98c0c78668266332c9a39602cae2fa3e299153f4f52b39919f0cc02cd665a3473c0585c5f46c5333b7e9ea466b332e0990d9acdb268e680b1b8be8c8a674efc3c49cd6667c03307349b6dd1cc0163717d1915cfdcf879929acdc980672e6836c7a2192be3c82c607c2e0b181deb585c5f46c533cf11cfdc0c78e601cf2b8e78e665c0f30af0bc1a3f4f32a65ec9804718f261b99159c0f85c16307a1dbd8e4c8c5ec7a6a3a367f48c9e3133c6e7b380d16f6bcfc8cae8e0fa2aed3b34af3472df51efd03476df51efd03476df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c33f97e2d7edfc599bec3fa1af0b878a7d6513d0bd57a5fd7ebfa2646fd94566f185abd6268950f655e07fdde70a05f0ef89575cbbcf8cb94f962026647be8b8f0bd7710cd45f7c3c67e8a1fcbfe9a8ee516dfd9b8ddc77545bdfd87d47b5f58dddb78f731fe74dc1b78f731fe74dc1b78f731fe72cbe319f1bd49cb7cbf795d43aded2f9167a5eca3f0fcb49997ead52ffdb047e1f72e1dbef43fe58d1147cfb38f771de147cfb38f771de147cfb38e78b738c87ab1b8027307882343c4f92f17426e3194bc633948ce71e329e9bc8787a91f14c26e32926e39949c6f33019cf4b643c83c878ee24e3b9968ce70a329ea7c978ba92f18c27e31946c6731f19cf2d643c65643c8f91f19492f1cc22e3194dc6f33219cf60329ebe643c2f90f15c4fc6f32c194f77329e39643c9792f14c24e3b9848ce721329e42329efbc9788e23e36943c6731b19cf55643c4f90f17422e3994dc65345c633958ca79c8ca71f19cf95643c3792f1f424e39947c6f308194f1119cf08329e07c878ee20e3694ec6730d19cf53643c5dc878c691f1b427e3a920e39946c6d39f8ce766329ede643c8f92f19490f18c22e379908ce72e329e86f81e47263c53c878ae23e379868ca71b19cf04329ee9643c1793f15492f10c20e3c923e3c927e3e940c6732b194f1f329ec7c9783a92f18c21e31942c6733719cf8b643c3790f1f420e3994bc633898c670619cf70329e81643c9791f11c4fc6d3968ce776329e1c029e4470f8379213f0fb6b606b662cab3e2bd5ada0e6f7b7b5bd192cf38ece37b7acfb6db0c9b7aadeb12c8b3abd0d7529d3f9c27f6d4aea84beca605efce501c73b243cb793f1b425e3399e8ce732329e81643cc3c9786690f14c22e3994bc6d3838ce706329e17c978ee26e31942c633868ca72319cfe3643c7dc8786e25e3e940c6934fc69347c633808ca7928ce762329ee9643c13c878ba91f13c43c6731d19cf14329ed7c878ee22e379908c6714194f0919cfa3643cbdc9786e26e3e94fc6338d8ca7828ca73d19cf38329e2e643c4f91f15c43c6d39c8ce70e329e07c8784690f11491f13c42c6338f8ca72719cf8d643c5792f1f423e32927e3994ac65345c6339b8ca71319cf13643c5791f1dc46c6d3868ce738329efbc9780ac9781e22e3b9848c672219cfa5643c73c878ba93f13c4bc6733d19cf0b643c7dc9780693f1bc4cc6339a8c6716194f2919cf63643c65643cb790f1dc47c6338c8c673c194f57329ea7c978ae20e3b9968ce74e329e41643c2f91f13c4cc633938ca7988c6732194f2f329e9bc878ee21e3194ac633968ca73319cf93643c575b785e73c423efbbcbba65fe3512df0eb643a15aefbb8eea345fafaba55eaff08bbf5c2853746ceabf7a3e84cb0a97f97d02ecfb3d1f347acb515dcc313165fead46eebb8de1bb4d13f1ddd6f0ddb689f8f671eee39cc9f7fcf87d17e3b76d64ca31e6cb208fc71717df047254cf5ac7f66f62d44f69b5c0d0ea2d43ab7c28f32ee8b7c0817eb6f30599177f99325f4cc08c715110c41b17efc55fa762d597e618d0f53d435facd7fb8e348d3a86bcdfc87d471d431abbefa8634863f7ede3dcc77953f0ede3dcc77953f0ede3dcc73993ef6a9d8ff1bab1107da87bbf723d500d7e17e97c4e8c7ed5ba16ea75b5d0eb168e45c023655e817bd17e9ff7fb7c5cbefdb1cdc77953f0cd1ce7665e9e215e026cae9ef146c562433c5f3e9abea362b1b1fb8e8ac5c6eedbc7b98f7326df8be3f79d7c86f85a507b4af70c7131f02c74a085a37a26af9d9618757acda8533e94a9867a2e7150cf1cf02beb96f925b01db28d59f14cd1791cdf45ca4d216114db42b73cc9fd6b4a507b4ab77f2d011e07fb4191a37a26f7afa5469da658749732d550cfa50eea69db77647e296c876c63563cf2eeaeb026a0dc0b248c625bec9627b97fbd10d49ed2ed5f4b81c745fbe3a89ec9fd6b9951a7172cba4b996aa8e73207f5b4ed3b32bf0cb643b6312b1e19cb44581350ee451246b12d71cb539a803acb946eff5a063c2eda1f47f54cee5fcb8d3abd68d15dca54433d973ba8a76ddf91f9e5b01d3cb367b6312b1e796752581350ee251246b12d75ca535a98803acb94ae1d5b0e3c2eda7947ba27dbb115469d5eb2e82e65aaa19e2b1cd4d3b6efc8fc0ad80e9930cfcf42e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b991974563c2febbcb026a0dccb248c625be69627f9fececb41ed29c7982f83fc0ae059ee401f47f54cf67b5f69d4e9658bee52a61aeab9d2413d6dfb8eccaf84ed9009f3fc2c64aece4266069d15cf549d17d604949b4ac228b6e56e7992edd8d4a0f694ae1d5b093c2eda7947f54cb663ab8c3a4db5e82e65aaa19eab1cd4d3b6efc8fc2ad80e9ed933db9815cf349d17d604949b46c228b6154e798a93ef214e0b6a4fe9dab155c0e3a29d77a47bb21d5b6dd4699a457729530df55ceda09eb67d47e657c376c884797e1632576721b3d7d9eb1cc55c9d85cc5e67af7314737516327b9dbdce51ccd559c8ec75f63a4731576721b3d7d9eb1cc55c9d85cc5e67af7314737516327b9dbdce51ccd559c8cca0b3e299aef3c29a8072d34918c5b6d2294f49f2b9c3f4a0f694eeb9c36ae071f15cc691eec9e70e6b8c3a4db7e82e65aaa19e6b1cd4d3b6efc8fc1ad80e8d9d797e1632577be60661f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e6286686d8503c33745e5813506e0609a3d856b9e5497ef76046507b4ad76f670df0ac76a08fa37a26fbedac35ea34c3a2bb94a9867aae75504fdbbe23f36b613b7866cf6c63563c33755e5813506e2609a3d856bbe549b6633383da53ba766c2df0b868e71dd533d98ead33ea34d3a2bb94a9867aae73504fdbbe23f3eb603b7866cf6c63563cb3745e5813506e1609a3d8d6b8e549b663b382da53ba766c1df0b868e71dd533d98ead37ea34cba2bb94a9867aae77504fdbbe23f3eb613b7866cf6c63563cb3755e5813506e3609a3d8d6bae5294e409d654ad78ead071e17edbca37a26dbb10d469d665b749732d550cf0d0eea69db77647e036c876c63563c73745e5813506e0e09a3d8d6b9e549ee5f7382da53bafd6b03f0b8687f1cd533b97f6d34ea34c7a2bb94a9867a6e74504fdbbe23f31b613b641bb3e299abf3c29a8072734918c5b6de2d4f72ff9a1bd49ed2ed5f1b81c745fbe3a89ec9fd6b9351a7b916dda54c35d47393837adaf61d99df04db21db9815cf3c9d17d604949b47c228b60d8e7912506799d2ed5f9b80c745fbe3a89ec9fd6bb351a77916dda5ccfb50cfcd0eea69db77647e33f0c87435f0b88acbc0e0092cfac8f424194f67329eb1643c43c978ee21e3b9898ca71719cf64329e62329e87c9780691f1dc49c6732d19cf15643c4f93f17425e3194fc6338c8ce73e329e5bc878cac8781e23e32925e3194dc633988ca72f19cff5643ccf92f17427e3b9948c672219cf43643c85643cf793f1bc4fc6731c194f1b329edbc878ae22e379828ca713194f15194f39194f3f329e2bc9786e24e3e949c6f308194f1119cf08329e07c878ee20e3694ec6730d19cf53643c5dc878c691f1b427e3a920e3e94fc6b3808ce766329ede643c8f92f19490f18c22e379908ce72e329eebc8789e21e3e946c633818ce762329e4a329e01643c79643cf9643c1dc8786e25e3e943c6f338194f47329e31643c43c878ee26e3b9818ca70719cf24329ee1643c03c9782e23e3399e8ca72d19cfed643c39043c89e0f077f112f0fb02b0c93b63f3c0f681ce6f045b338b0f7916b1196cb93a2feb6815a66b0b0e5f37eae4ea3d39f45506f3e22f0f383e20e1b99d8ca72d19cff1643c9791f10c24e3194ec633898ca70719cf0d643c7793f10c21e31943c6d3918ce771329e3e643cb792f17420e3c927e3c923e31940c65349c6733119cf04329e6e643ccf90f15c47c6731719cf83643ca3c8784ac8781e25e3e94dc6733319cf02329efe643c15643cedc978c691f17421e3798a8ce71a329ee6643c7790f13c40c633828ca7888ce711329e9e643c3792f15c49c6d38f8ca79c8ca78a8ca71319cf13643c5791f1dc46c6d3868ce738329ef7c978ee27e32924e379888c672219cfa5643cddc9789e25e3b99e8ca72f19cf60329ed1643ca5643c8f91f19491f1dc42c6731f19cf30329ef1643c5dc9789e26e3b9828ce75a329e3bc9780691f13c4cc6534cc633998ca71719cf4d643cf790f10c25e3194bc6d3998ce749329eab2d3c0b1cf198e326c8fc0202df6abe3be8a2a604fc8edf597fdf11e3028351e6df0746e475ad591b83a78da1d9d1f4adea2fefeac83d70dc5ef8de39c3f66ad3009ab53578da1a9a1d4ddf4a0b79b62def0ce2f6c2efd4326c2f7cafda41fb5c9a3078d49463cc97417eb3637d1cd5b310dfbbfe26c6f52aadb6185a2d30b4ca87329b40bf2d0ef4cb01bfb26e99177f9ed93347312b1ee94b62fb1e403f1246b1e1b8181fc6cf539a3078d494ae7dfcd0b13e8eea996cc7b60676dd3f04dda50cc6ea5607f5cc01bfb26e99df6af15d10c4abc5b63a68b1cdc2b3ad81b5107f99326fca4266069d158fbc6b20ac0928d79f84516c5b80677bfc3ca50983474de9dac7ed8ef57154cf649bb023b0ebbe1d749732b87fed7050cf1cf02beb96f91db01d3261de9a85cc5ee7fa312b1e79475b5813506e0009a3d8b601cfced8798a0b13068f9ad2b5633b1debe3a69ea9766c5760d77d27e82e6570ffdae5a09e39e057d62df3bb603b7866cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367e666563c03755e5813506e2009a3d87600cfeed87952cf1d90474de99e3bec76ac8f9b7aa69e3bec09ecbaef06dda50cc6ea1e07f5cc01bfb26e99df03dbc1337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d3337b3e219a4f3c29a8072834818c5b60b78f6c6cf539a3078d494eeb9c35ec7fa38aa67f2b9c3bec0aefb5ed05dca60acee7350cf1cf02beb96f97db01df67966cf6c61563c83755e5813506e3009a3d8f600cffed87952cf4f91474de9dab1fd8ef57153cf543b7620b0ebbe1f74973218ab071cd43307fccaba65fe006c874c98b76621b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec756e3a3a2b9e729d17d604942b276114db3ee0f928769e92c284c1a3a61c63be0cf21f39d6c74d3d53cf1d0e0676dd3f02dda50cee5f071dd43307fccaba65fe206c87c6cebc350b997d6c340cb38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c333473133c486e2a9d079614d40b90a1246b11d009e8fe3e7294d183c6aca31e6cb20ffb1637d1cd533d96fe75060d7fd63d05dcae0fe75c8413d73c0afac5be60fc176f0cc9ed9c6ac782a755e581350ae9284516c0781e793f8798a13068f9ad2b5639f38d6c7513d93edd8a7815df74f40772983b1faa9837ae6805f59b7cc7f0adb21db9815cf709d17d604941b4ec228b643c0e320ee923cf9068fcc7f42e05bcd57e97c9efe8fdbab0a1819b6577e0368d6c6e069636876347dabfa8fd5f9e3f47fdc5e638191617bb56900cdda1a3c6d0dcd8ea66fa5c5389d3f5effc7ed350e1819b6575bb73cc50983474de9ce373e059e6fc7cf93bc8efb34039e6f03cfb7e2e7297254cf42b5deef007b5ceb555a7d6668f5a9a1553e944186cf1ce897037e65dd322ffe3cb3678e62c6b650581350ee131246b17d0b785cb41baaee57e875c9fa5b84e90727d6f875717f0def2db4d4eb150ef1970b65ce6e57c3f613cd9607bfcb7653f53968d81cbdf35664bbcf2bf3e22f2fb05febbbba871a75efe120f01cb46876c0a2d97e478c070c4699df0f8cb6fbbc071cf144dd77167fd8661c24d50cdf03fe08785c9d1747c599eb7d2ed3f3cb8f2c3cdfc4c75388b181be5cc42ab66d75a9bb6ddf89b1ee45f80c0b7d39d80792c7a90e7a5db27e752cf8af139d6a5e8aed831ca73a1875ce8532ff7d4e0ddbff4d739c6a161c7e5fb840dba58cfcfe8db69beb28d0eb96f9eefa3fc689d8fc31b0f673c4ee86966c9ae1bef5b145c71e16ee1e04dc188f0db1ada3ee7de0b6ee61e8c8a6196eeb4f2c3af6b470f724e066dcaf7b1a3ab26976a4fdba9f85bb1f0137e37eddcfd0914db323edd7fd2ddcfd09b819f7ebfe868e6c9a1d69bf1e60e11e40c0cdb85f0f307464d3ec48fbf5400bf740026ec6fd7aa0a1239b6647daaf0759b807117033eed7830c1dd9343bd27e3dd8c23d98809b71bf1e1cd4d6914db323edd7e516ee72026ec6fdbadcd0914db323edd71516ee0a026ec6fdbac2d0914db323edd79516ee4a026ec6fdbad2d0914db323edd7c32ddcc309b819f7ebe1868e6c9a1d69bfaeb27057117033eed755868e6c9a1d69bf1e6be11e4bc0cdb85f8f357464d3ec48fbf5380bf738026ec6fd7a9ca1239b66b6fdda51ffb28cfb217fec549fd4f8b399bc87857d495cc494a3382874d4d724d90f79bfa1d5c78656f85dff03a09fab3e5951fdc6c49f67f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b667e667ccf139faf48b9867807b82e8c62c367522eeef3abba5fa9d725eb6f11a6db4faef11bff738be2e47300d15fdec7bcd2a8732e94d971760d5b5fcd86cf17f1b9a86d5b1e88bd0e757be71cdfd3c7674147f379e74716cdf65b34dbe788d16c33647e1f308a7efb81c7d5fe78c0e0317ddbde0d67d32caa9d7515f7517166f35d109befe2a16ebe85505ca8bed1764c70787b2275c07dd7451c66fa4d00dc2f1c3c772f72f5febfaad33ea34e078d3ae543998ba19efb1cd4b3aefb964c57038fabf6283078028b3e323523e379928ca73319cf58329ea1643c1790f1dc43c6731a19cf4d643cc790f1f422e3994cc6534cc6f33019cf20329e76643c7792f19c48c6732d194f2e19cf15643c4f93f17425e3194fc6338c8ce722329e43643c9793f1dc47c6730619cf2d643c09329e32329ec7c8784ac9784693f10c26e339978ca72f19cfc9643cd793f1b424e379968ca73b19cf44329e4bc9781e22e3b9848ca7908ce77e329eb3c8786e23e3398e8ca70d19cf55643c4f90f17422e3a922e32927e3399f8ca71f19cfa9643c5792f1dc48c6d39a8ca72719cf23643c45643c23c8781e20e339878ce70e329e13c878ae21e3694ec6f314194f17329e71643cedc9782ac8782e24e3e94fc6733a19cfcd643cc792f1f426e379948ca7848c671419cf83643c05643c7791f19c44c6731d194f0b321ed7ef0166caf30c194f37329e09643c95643c1793f10c20e339938ce756329e3c329e7c329e0e643c7dc8781e27e3e948c633868c670819cf79643c7793f19c42c67303194f2b329e1e643c93c8788693f10c24e3399b8ce732329edbc9788e27e3694bc69343c093080eff16137effeb20d8f6e93c7e5bb099657df25c58caabe3d0ad0587afbb9965ddfb2d0ca8d3dea0a62e653a5ff8af4d499dd05719cc8bbf3ce0d84fc2d3968ce778329edbc9782e23e3399b8c672019cf70329e49643c3dc8785a91f1dc40c6730a19cfdd643ce791f10c21e31943c6d3918ce771329e3e643c1dc878f2c978f2c8786e25e339938c670019cfc5643c95643c13c878ba91f13c43c6f311194f0b329eebc8784e22e3b98b8ca7808ce741329e51643c25643c8f92f1f426e339968ce766329ed3c978fa93f15c48c65341c6d39e8c671c194f17329ea7c8789a93f15c43c6730219cf1d643ce790f13c40c633828ca7888ce711329e9e643cadc9786e24e3b9928ce754329e7e643ce793f19493f15491f17422e379828ce72a329e36643cc791f1dc46c6731619cffd643c85643c9790f13c44c6732919cf44329eee643ccf92f1b424e3b99e8ce764329ebe643ce792f10c26e3194dc6534ac6f318194f19194f828ce716329e33c878ee23e3b99c8ce71019cf45643cc3c878c693f17425e3799a8ce70a329e5c329e6bc9784e24e3b9938ca71d19cf20329e87c9788ac9782693f1f422e339868ce726329ed3c878ee21e3b9808c672819cf58329ece643c4f92f13423e3b9dae0c1dfd5b9b5bc1fb60f6cf2fbb3baf16aa3d72565e49988bab7b4c7b0a9faee7654df3d41cd5406f3bba1bec2be0778f638e2d96bf098bef320df0334db65d814e34e478cbb0c4699df098ca2df2ee0d9e58867b7c163face837c4fd06c8761538cdb1d31ee3018657e3b308a7e3b806787239e9d068fe93b0ff2fd40b36d864d316e75c4b8cd6094f9adc028fa6d039e6d8e78b61b3ca6ef3cc8f707cd3e346c8a718b23c60f0d4699df028ca2df87c0f3a1239ead068fe93b0ff20340b30f0c9b62dcec88f1038351e63703a3e8f701f07ce088678bc163face83fc40d06c9361538c1b1d316e3218657e23308a7e9b806793239ecd068fe93b0ff28340b30d864d31ae77c4b8c16094f9f5c028fa6d009e0d8e78361a3ca6ef3cc80f06cdd61936c5b8d611e33a8351e6d702a3e8b70e78d639e2596ff098bef3205f0e9aad316c8a71b523c63506a3ccaf0646d16f0df0ac71c4b3d6e0317de741be02345b65d814e34a478cab0c46995f098ca2df2ae059e58867b5c163face837c2568b6c2b029c6e58e1857188c32bf1c1845bf15c0b3c211cf4a83c7f49d07f9e1a0d932c3a618973a625c6630cafc526014fd9601cf32473ccb0d1ed3771ee4ab40b325864d312e76c4b8c46094f9c5c028fa2d019e258e78961a3ca6ef3cc88f05cd161936c5b8d011e3228351e61702a3e8b708781639e2596cf098bef3203f0e34ab366c8af17d478cd506a3ccbf0f8ca25f35f0543be25968f098bef320df176cc25b04b6f774be186c0b74be046cf375be146cefea7c47b0bda3f39dc0f6b6ce7706db5b3adf056c6fea7c57b0bda1f3ddc0f6bacef702db6b3adf1b6cafea7c19d85ed1f93e609ba7f357816daece5f0db6393a7f0dd866ebfcb5609ba5f3d7816da6ce5f0fb6193a7f03d8a6ebfc8d609ba6f337816daacedf0cb69775fe16b0bda4f3b782ed459dbf0d6c2fe8fced607b5ee7ef00db733a7f27d8a6e8fc5d601ba9f37783ed5e9dbf076c9feafc7d60fb96cedf0fb66febfc0360fb8ece3f08b6cf747e08d8beabf343c1f63d9d1f06b6efebfc4360fb81ce8f00db0f75fe61b0fd48e74781edc73a3f1a6c3fd1f93160fba9ce8f07dbcf747e02d87eaef313c1f60b9d9f04b65feafc2360fb5ce72783ed573aff28d87eadf38f81ed373aff38d87eabf34f80ed0b9d7f126cbfd3f9a7c0f6a5ce3f0db6af74fe19b0fd5ee79f05db1f745eda35d5cefe51e70b8278dbd9af839aa9007c8b3f55e64f3adfca2823cbe6429952fd411ff58c437dcb54da616997954ddae1f7c026edf002b0493b3c1f6cd20ebf0b366987df019bb4c36f834ddae1b7c026edf09b609376f80db0493bfc3ad8a41d7e0d6c653aff2ad8a41d7e056cd20ecf039bb4c373c126edf01cb0493b3c1b6cd20ecf029bb4c333c126edf00cb0493b3c1d6cd20e4f039bb4c353c126edf0cb609376f825b0493bfc22d8a41d7e016cd20e3f0f3669879f039bb4c353c026fbcbd76093b67924d8a46dbe176cd2367f0a36699bbf0536699bbf0d36699bbf0336699b3f039bb4cddf059bb4cddf039bb4cddf079bb4cd3f009bb4cd3f049bb4cd3f02db689dff31d8a46dfe09d8a46dfe29d8a46dfe19d8a46dfe39d8a46dfe05d8a46dfe25d8a46dfe1c6cd236ff0a6cd236ff1a6cd236ff066cd236ff166cd2367f0136699b7f0736699bbf049bb4cd5f81ed599d97b6ba35d8e459b19a0affc509c7e16906be84a92c88b7edc7a90cf2cf40dd659a46c633968ce775329e0bc8785690f12c27e3398d8ce703329ecd643cc790f1ec23e3d94bc6339b8ce71d329e41643cedc8784e24e3c925e3b9828ca79a8ce755329e8bc8780e91f15c4ec6730619cf26329e8d643ccbc8789692f124c878f690f1ec26e3799f8c672619cf5b643c83c978ce25e339998ca725194f77329e4bc978e691f15c42c6b3848c6731194f2119cf59643c1bc878d693f12c20e3398e8ca70d19cf2e329e9d643cd3c978be26e3a922e379838ca79c8ce77c329e7e643ca792f15c49c6d39a8ca72719cf1c329e45643c0bc978de25e339878c671d19cf5a329e13c8787690f16c27e3694ec633958c671c19cf6b643cedc9782ac8782e24e3e94fc6733a19cfb1643c53c8786691f1bc4dc6f37b329e02329e35643cabc9784e22e3d946c6b3958ca70519cf47643caf90f15492f1bc47c633808ce74c329e3c329e7c329e0e643c23c9786690f1bc49c6731e19cf2a329e95643ca790f17c48c6b3858ca795fecfc2d3838c672e19cf70329ef9643c03c978ce26e3b98c8ce778329eb6643c39043c09e008c026bf3707db573a7f086cf2bd9e8fc0f6a5ce5783ed773aff2cd89eb2d89a59f884e12bb0c9bbd64f834deecf7c09367987e3776093e3a2f857f37d0b0ee76f06cb889fe6167ef4f73b0b97e4717bcb326541bcdb1b7d9505877f4f290f389e26e1694bc6733c19cf65643c6793f10c24e3994fc6339c8c672e194f0f329e56643c5bc8783e24e339858c672519cf2a329ef3c878de24e39941c633928ca703194f3e194f1e19cf99643c03c878de23e3a924e379858ce723329e16643c5bc978b691f19c44c6b39a8c670d194f0119cfefc978de26e39945c633858ce758329ed3c978fa93f15c48c65341c6d39e8ce735329e71643c53c9789a93f16c27e3d941c6730219cf5a329e75643ce790f1bc4bc6b3908c671119cf1c329e9e643cadc978ae24e339958ca71f19cff9643ce5643c6f90f15491f17c4dc6339d8c672719cf2e329e36643cc791f12c20e3594fc6b3818ce72c329e42329ec5643c4bc8782e21e39947c67329194f77329e96643c2793f19c4bc633988ce72d329e99643cef93f1ec26e3d943c69320e3594ac6b38c8c672319cf26329e33c8782e27e33944c6731119cfab643cd5643c5790f1e492f19c48c6d38e8c671019cf3b643cb3c978f692f1ec23e339868c673319cf07643ca791f12c27e35941c6730119cfeb643c63c978a691f134b3f01c72c423c74a59b7cc1f22f0addec3957bf1fbf4ff04fc8ee337573b623c6430ca7c35308a6d2ff07477c4b3dbe0d96dd1e268f9565ac8b73ff6e8ff09f81dbf57e82aa6ba1b8c326f8ba9ddc0d3c311cf4e8367a7458ba3e55b69217d1fa50f49027ec7f1f05cc5540f8351e66d3185e3b9f674c4b3dde0d96ed1e268f9565a485f43e9c39f80df71fc4b5731d5d36094795b4ce1785dfd1cf16c3578b65ab4385abe9516f2ee99bcb39c80df713c215731d5cf6094795b4ce1f810fd1df16c3178b658b4385abe9516f22d09f92652027ec7effbbb8aa9fe06a3ccdb620abf8f3cc011cf668367b3458ba3e55b6921dfaa936bf604fc8edfb7751553030c4699b7c5d466e019e88867a3c1b3d1a2c5d1f2adb418a4f3f20c2e01bf0f0246573135d06094795b4c6d049e418e78d61b3ceb2d5a1c2ddf4a8bc13a2f7d3213f0fb6060741553830c4699b7c5d47ae019ec8867adc1b3d6a2c5d1f2adb428d77979673001bf9703a3ab981a6c30cabc2da670fcdd72473cab0d9ed5162d8e966fa585bc7bbf46ff4fc0ef381ee760478ce506a3cc0f0646b1e1786f158e78561a3c2b2d5a1c2ddf4a0bf996967c833101bfe3f858ae62aac26094795b4ce17827958e78961b3ccb2d5a1c2ddf4a8be13abf42ff4fc0efc381d1554c551a8c326f8ba9e5c0b3dc11cf52836729916fa585bc0b277dd812f07b1530ae70c41815532b80516c4b8167a9239ec506cf6222df4a0b799623ef5c24e0f7b1c0b8cc1163544c2d0346b12d069eb18e78161a3c0b2d5a1c2ddf4a0bf976cc22fd3f01bfe378ed8b1d318e3518657e31308a6d21f02c74c413750faf217c47dd8f6a08df51f7561ac277d47d8286f01d758fbd217c475dbf3584efa86b9186f01d759fa1217c479dd33784efa8e7db0de13bea596d43f88e7aeed8d8f76f7f2c695ac792a3d9ae35d563896fcf39dbf371f1fb2e4e04b5af69d49463cc97411eaf5f1639d0c2513d0bf19af09b18d76bbb865f6868950f65f01ad5d5f5df388347e6c55f3632635ce4c4e7bb30013ee41d6565937b2def814dee712c009bdc03990f36b987f62ed8e47ed63b6093fb5d6f836db8ce8f049bdcbbc4fe48726f733bd8ca751efbc10cd6f9ad6093e744d8ff429ef56d019b3cafc5e7fef2cc7d33d8a4df043e6f96be2f1bc126fd97f039a7f4415b0f36e94788cfd7aa757e2dd8644c097caef3a5ceaf06db573a8fcf1364acce95607b52e7a780ed0b9dff1a6c4fe8fc42b0fd56e7f19ecfe33a3f166cbfd1f9b7c0f66b9d7f136c8fe9fc1b607b54e7f781ed573abf176c93751efb877eaef3bbc1f688ce63bfc45feafc4eb0fd42e75f07db249d7f0d6c1375fe55b0fd5ce75f01db049d9f07b69fe9fc5cb08dd7f93960fba9cecf06db4f747e16d8c6e8fc4cb0fd58e767806db4ce4f07db289d9f06b61fe9fc54b03dacf3bf07db0f757e1cd89ae9fc62b0c9f793f19eaebcb3b8146c324e09deab976f9554814dc6df5b0eb6d63a8fcf65e4bda4e160936fdb57824ddeffaf009b8c91540e3619c76930d8e45b6083c026df2b1b083619b37400d8645cd5fe60936f17f7039bbc4fd9136c3246480fb0c97754ba834dc6bec33181e57b97d560937782709c60f9eefe97609377cbbf029b8cdf846302cb37ae9e049b8c4bfa05d8ced1f927c026ef6bfe166c053aff38d8ced5f9df80ed3c9dff35d8e4fb958f814ddea979146cf21dfd5f814ddecd9e0cb68b75fe73b05da2f38f804dbe43f44bb0c958b1bf005b7b9d9f043679677e22d8aed0f99f834dc63a9b0036f9beeacfc026dff81a0fb6229dff29d88a75fe27602bd1f931602bd5f91f83ada3ce8f065b279d1f05b6ce3aff23b075d1f987c1d655e7a59d51fbb3dacf0feaf9b220bef332e5efe3a0f694eeda40189027ce73ed7ce0415f0762af7b71f2bc5ef6fb667abd124307c0f7bed87da7ae29f6eb75b5d0ebdd67f8ce85329fea46442db7077e2f833ac872788d2deb9665ae8465f71aeb6ea3ebbbdf517df7194cc2bd1f98a4cc6767d7947d423796ad619918d992d7c7126b0168885319e485c18d56c58578de5b179efdc013ff7e92ba5e771113b86fc57dbd6ede6332632d1fcaec03fdf63ad00ff77559b7cc8b3fcfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccfccc8a479e27e0736529779084516c0780677ffc3c85f81c56d6af9eeb3c00cf750ec4eeb7f6f3bd967abd85469d73a1ccaa736ad886e87c1efc2edb2d6a5bee8bbd0ee9b7a5f8cb83faec071e07db32c973c0e0317de759f4519aedb568b6c711a3d966c8fc1e60dca7f37b81c7d5feb8cfe0317d639bb19f54b3a876d645bf84747166eb8350109befe2a1ae9eebaa3e53aa2f8779fc3a68688a7d20c486cfc1f360994ff4ff04e8f309e87334db00b35f02b6531f03e3bed8198b6b3d0396b6ff4a4353ec03f1a2d656fa40c4df0e1417ba3c46c83e6af6adc0ba4a99e9709c9ba9f3d80fe820aceb5dcbef32e518f36590c7367557fc754e6e5fe9bf2adb7797c5f70e608dc977ad77397274123f62cf85fc3be7d4949572a287682dec386e15b29bcb7d6c2c970f65765bea5f16c45bff5d06cf2e8359c5ce1c88b377e15ccf559bb43b42a32b41232983e7bc0efa1459db48e1107faa8c6cff5646193c3f95328ba18d527591765eea89fd98f018e0ea7ce1a0513f99c7f305db398d5947151fb79f5cc3ebfa5aa05960d79aa5afdf66682fe2eeebb71962c8765e2aeb2f84f50b57ab20fad82265b61ac75117d793b82d4d3df7039394d909edd07fd6e3baee685da3475dd7ed76c083d71a32a53bbee331c645fbe2a89e85b663d75ea34ef950e662a8a783f398b4efa4ee02df2eb6396a21e750fb0c2d72a1cc778db6234a475907de07705b9762ebf960a1a52e52e6c7463bb5d30193cbed86e7596abd072c759532bf80f6ef73389fdfa77fc7b6f42f96df654ad71ee037e5b7c55fe7e4f695f71b65fb6eb3f8fe105863f25deb9b1472be2f7ec49e0bf93fc3f15bca891ea2b5b0ab7d44deef447673b97dc672f95066bba5fe6541bcf5df66f06c339855ecfc06e2ec2f70beefaadddc1ea15121682465f0598179bf05ef9de071bfa1ae0b64fe236014db2ed0f73f9dde2f4fb17d64b099f7cb6de78385063f9e0ffe6f68671396b2ee9f03a4ce6db05e528fc0a86b60d4d5d1f96b698ea16719f8e900f67d3a2f3acb6f788e2b6572daa5febbbb7f55fb3eb6704b3df079dd1e837bafa12bde8b6a09dc2aeecd6b0b3c4f777c4d5b8ae762e6f9105e8749993c60b79dc71db2d4c53c4e370b0ebf16fcc6288bd7d9e99633f31f19cbe03d830316265bdb17db7b3945858526bfaddd3b6830db7495fd00634ed665ee2b783e2465ce84ed96b094556dd27f9d58a38f6c47bcd76ebbcfe2ea7811759f45fc2946db3b932e9e6134c577d35ac7b6deaee5b6e76cecfd195a1bf9787c1757e0b1229d167b2c3caeee694669b1c7e23b3e2d3a0db5b573362d765b785c5d634669b1dbe23b462d2a6df7166c5aecb2f0b8bad688d26297c5777c5a74ae755f239d163b2d3cf1dfd348af053e13cb84793701736b231f8fefd272dbb33b9b163b2c3cae9edd4569b1c3e23b3e2d8a3ad9aed96d5a6cb7f06c6f602db65b7cc7a74597aeb67b2a362db659781cdc5f4babc5368bef18e36218de5f4ba7c5560bcfd606d662abc5778ce7879dd2dd33442d3eb4f0b8baf717a5c58716df316a3144f9de52072db65878b634b0165b2cbee3d3a2bca3f2fd411db4f8c0c2f341036bf181c5777c5a0ce9a27c6fae83169b2d3c9b1b588bcd16df315e4325e362531db4d864e1d9d4c05a6cb2f88e4f8b8ae4b9d6c63a68b1d1c2b3b181b5d868f11d9f1685c963ea863a68b1c1c2b3a181b5d860f11d635c24af27d7d7418bf5169ef50dacc57a8bef188f23c9b85857072dd65978d635b016eb2cbee3d3a23279ff696d1db4586be159dbc05aacb5f88ef19e4b322ed6d4418b35169e350dacc51a8beff8b428491e5357d7418bd5169ed50dacc56a8beff8b418967c26b6aa0e5aacb2f0ac6a602d56597cc778de996c2f56d6418b95169e950dacc54a8bef18cf3b93f72f56d4418b15169e150dacc50a8bef18dbcee479e7f23a68b1dcc2e36a8cc8282d6ce353c678de99d462591db45866e17135b6619416cb2cbe633cef4c1e4796d6418ba5161e5763514669611b0733c6b848b69d4beaa0c5120bcf9206d66289c5778cf7b5926de7e23a68b1d8c2e36a6c8e282d165b7cc7783d92bcc7b7a80e5a2cb2f02c6a602d16597cc7f8ac28790ebeb00e5a2cb4f02c6c602d1682effdb1fb4ef5e7161fd217eb0a438b5c28f36da32f56948eb20e7c8716eb521d7b5d52fdcade8fa84b35d445cafcc0e8cbf7be032647754dc6cc7b7a5dd237fd634b5da5cc4fdbd594fdb9ce27609b1c8275fdd1f2bb4c39c67c19e4453f55e7f9f1d73919ab320e906cdff916dfef006b4cbe8bd0778e4ee247ecb990ffba5d4d5929277a88d6c2aef691053a8fece6720b8de5f2a1cc024bfdcb8278eb3fdfe0996f3027df7b8038933872d376a5981644687405682465b0cfde21473c1f1b3cc221fe7282c3df459532b22cbe8bfa77a3dfaef483947a46f5917ccf51fda2fa488abfa87751cd3aaaf8f801f4fd94714164cc10659331404a603d9d0d9baa6b174775155fb26e99ef028c322649e786672cae2b63278351f17473a0198eb32253bae34537e0e9ea80c7513d93c7a1ee469dba1875ca8732f86e637707f5cc01bfb26e99ef0ebe5d6c73d4428ec9971a5ae44299bc82d47f397f8cd251d6a1e2b7b3a52eae74ec64f074b2f8eee5584759b7b489bd1ac0770fc37747c3b7dab731c6d4946edfee01cc3d1d30abf5f68e7fbd8578ce28f12c7e3a429dfa800671d509d725e7987d0c6d73217f7e414d59292765e5d829ec6a3f926d89ece672dd8ce5f2a14c2f4bfdcb8278ebdfdbe0e96d30abf386d30a6a381cec0fc918e86570c87c47d0ae778476bd403b2983c7de4e8eb4eb69f0c87c27e091f3abee6093f314e14fc0ef250dc06db67bdd2ddc62c3f1083b59183bc6cf589ceeb8d01118c5d613787a38d2ccdcd6971afae039412ba38c2c9b0b65ba14a4fecbbb5a6659b5df9d9b5353afe6da1edb7b6bba4d6fe9402f1c0f34007d0243439984a175503366689c3cc7063563824e9858357ec843c3ee1a967aec2968b90626fecfb154a319d830dfdc620b82da439fe6824d863e6d01b666862c38e4aa9497a1135dc8857ac8ba730dced6c012a76f1c3656a674a1d30a785c84b20a1d193a5687cebde3474c1c86f1d1c2e0ac4feca8df9aa72917b52e89835c0775472659b7cc8b3fa54fbece8f1d3274649ff10f4d1a3d6cccc409086bee5c98cf314430ffdb96c120c19d49d6d3c210e7d8f8c529c5318a4dbe00fcc9240cad839a718c63e44906aa8c353c74c8a851774c2a1f3562e87593c60c9d38a26a0c2adada502e4a6df9bd25d86c4d1d965513eebeb86c2b8bcd36e1a8ceadc1262df83160139e63c1d61cf252dedc324ef6918b61fd12d6ea37254e0b5df156414d08c86149b52f6a1f529f5155a7036a68693594b4da9cea8e9d1a1a5a7d454e0dfdac867a56433baba19cd5d0cd6aa8663534f3d9416ae86575f7b220480da57c5e901a2af982203514f245c0f76d60be24489d7ea8a18cdb07a9a18ad5ed43f5fab8fad49a7abf5d9dc6aacb6375eaa72e75d469983afd52a7d9ea1682ba9da44e6dd469a33a2552a731eab4bcb7d6ba4f98ae0ad3d561ba264cd786e9ba305d1fa61bc27463986e0ad3cd61ba254cb786e9b630dd1ea63bc2746798ee0a53df30dd1da486d3be274cf706a9e1b6ef0b524371df1fa486e97e20480de1fd60901ade7b48901afa7b68901a167c58901a32fca120359cf888203554f1c82035b4f1e820353cb21aa67c6c901a125d0db5ac8665564338aba19dd5d0d06a186935e4b41a8a5a0d65fd44901a22fba9303d1da486d07e364c53c2f45c989e0fd30b617a314c2f85e9e520352cbb1aae5d0de33e23480dfb3e2b480d13af868f57c3caabe1e6d530f46a787a356cbd1acefe8d30bd19a6b7c2f476907a2ca01e87a8c704ea16bcba45ac1ed35407a9dbd78b82d46366f5d85d754350dd325437951541aa1b93ead6a5bab9a96e7faa1ba4ea16aabac9aa6ec3aa1bb5ea56aebad9abd70ed46b18eab514f59a8e7a6d49bdc6a55e6b53aff9a95735d5ab8fea555ef56af3be20756bfa40907a5ca96e57abdbd2ea16bdba85fe6998be15a462f23b61fa2c4cdf0dd3f7c2f4fd30fd20480d19ad869756c353aba1acd510d76a386c3574b61a7a5b0dc9fd79901aea5b0d15fe9b2035dcf81761fa5d901af2fcab2035dcfd1fc2f47598fe18a63f85e9cf61fa4b98fe1aa67f0bd3bf87e96f61fa7b98fe234cff086a8635c786a440b73ee7eaf92113270e1b3d7662c1c4aa82d193464d1c3176d4630593474c1c5e50f5c8b0f195a3aa26e3c2bfd50bcb98ec7dc68f1ff258c1883115c31e2da89a34b1a0aab2a0bc6ad2988a5a07d2ffa7173aeb708f432a2aa29de535ff17488f6f5e3fa7edf47232dafd8de9eb765ef37a0872497d16baa59e15ba5b1fc1e492af6fea7cb060c2a8aa8905850563c2bfe181b76af2b08a0e05f8db8450e409130b264c1c327e6241e5f8aad105451d70bd85c7d6a312f38e750353727afdc4f9e4ecd4ff7a85d80be7d4438145e7d48f74d339ff02e987f574fa597d6af8a3fa2cf45ff5240cda45ca326152f9c4f143864e8c5eb8c5bfb270a25d3daa7946bbfa55f35bf571f6fdfa2cf4b77a12260aeae1ac7341dd9d05ff035566efd0b00206009b2d6c6f000000275e1f8b08000000000000ffed9d67701cc7b1c7f700100cc72308e64c28514c000f8744800994c41c642a8b4a0449502245121409e51c6ccb966dd9720eb264cb414e720e72ce39e724dbb225dbb265ebcb73bdf7ea55a9deccdeb4f1c76876853b6f83b3b8deaae6cd36e6b67fdddb33bb3733bb7c2608824c50dcaa959c143c77a3bf779bcffc7fb6352778ac3c276726259c5529e1ac4e09674d4a3847a584b336259ca353c23926259c6313e4d46c55c1e02d69de710c714d9a319bb2988e4f414c73298be98414c4b42e48471f3531259cf529e19c9412cec929e19c9212cea929e19c9612cee929e19c9112ce9929e19c9512ced929e19c9312ceb929e19c9712cef929e16c4809e70929e13c31259c27a584f3e494709e9220e712e05c603e4f359f0bcde722f3b9d87cd277969acf46e3638dd96f52b24cb32969b6fe5650d2a2a455499bf5b776251d4a962be9347f6b307feb52b242c94a25ab94ac56b2c6c461ad92d3949caee40c25eb94ac57b241c946259b946c56b245c95625db946c5772a6921728d9a1e42c25672b3947c9b94ace5372be920b945c68b1ec547291928b955ca2e452259729d9a5a447c96e257b94ec55d2ab649f92cb955ca164bf92034aae547250c921258795f42939a2e42a2547951c53d2afe46a25d728b956c9754aaeb7627683921b95dca4e4668bf31625b72ab94dc9ed4aee5072a792bb94bc50c98b94bc58c9dd4a5ea2e4a54aee51f232252f57f20a25f72a79a5925729b94fc9ab95bc46c96b95bc4ec9eb95bc41c91b95bc49c99b95bc45c9fd86851ac25b953ca0e441256f53f276250f29798792772a799792772b7958c97b94bc57c9fb94bc5fc907943ca2e4834a3ea4e4c34a3ea2e4a34a3ea6e4e34a3ea1e4934a3ea5e451259f56f219259f55f239259f57f205255f54f225255f56f215255f55f235255f57f20d25df54f22d25df56f21d25df55f23d2be6df57f203253f54f223a3fbb1f9fc89a94be3623f55f23353feb9f9fc85f9fca5f9fc95f59d5f2bf98da5fbad92c72cddef94fcde94ff603e1f379f7f349f7f329f4f98cf27cde79fcde75fcce75fcde753e6f36fe6f3efe6f369f3f90ff3f94ff3f98c92dba714cb638281ad3b48a88f6add97d7732a14fc05c1e04dc7a2dafc8d3e1b8cbec6ecd327c56e94d91f65e96bcd7ead759c31667f8ca5af37fbf5967eb2d99f6ce9a79afda9967ebad99f6ee94f36fb27833e1bc098abd16b5db551654047f95a05ba5146570dba5a3a1ce8461bdd28d0d1f9ad05dd58a31b0dba714637067459a31b4bb15432dee8ba83a47225dfa38f9b4bfab8661e6a42f2bc7bf471eb98782726cfdbab8f5bcfc0abf3639239d644c89bc946570f3ad3dd04934037d5e826836e9ad14d01dd74a39b0aba1946370d74338d6e3ae86619dd0cd0cd36ba99a09b6374b34037d7e866836e9ed1cd01dd7ca39b0bba06a39b07ba138c6e3ee84e34ba06d0d11a97134077b2d19d08ba538cee24d0515f7b32e8e8def014a3d3fdc4980c7cc7e8a98f0abf43fd33e81652df0cba45d42f836e31f5c9a05b02b649b714fa15d2351a1df551fa6f5da6dc1d24d5260a619b5891f471d591f57157257fdc70de6e753010d76eb0b30262b5c694135c1bd48cb63346c80ee96ba0bc09ea523d8a075d67885d5f4f569af29a98ef7559dfcb419d950effbb8364fd5f65f1acb2984781ff3c39db52909c1df25672ce9e0f75eddca37b9e9198b35b81832167db256787bc959cb3bd50d7ce3dbaef1d8939bb13381872b68727670b79c9d9e2185910b8738f7efb8cc49cbd023892cfd936c9d9a16f25e7eced50d7ce3dfafd3b1273f61ae0483e673b7ae4de60c85bc9397b2fd4b5738fc6624662cede051c0c39db2bfdec90b79273f67ea86be71e8d0b8ec49cbd0f3892cfd94ea69c6d919c0d8af39d41e0ce3d1aa31e8939fb2070249fb37b647c76e85bc939fb28d4b5738fe64b4662ce3e62ca7a9ee1c7669e610ee87e6274738137f9dcdedbca94db05c9ede23a902070e728cddd8dc4dcfebc29eb3cfe39ac3d20dd2f8cee04d0fdd2e84e04ddaf8cee24f08ba10df4481b18f256721bf80dd4b57399e69147621bf8217030e4ec1ec9d9216f25e7ec5350d7ce3d5ad3301273f677c0c190b3bd92b343de4aced9ff86ba76ee2d34e59198b3b4ae54df2ffcc1dc2f2c06dde346b704747f34baa5a0fb93d13582ee09a36b02dd9346b70c747f36ba3ce8fe6274cda0fbabd11540f794d1b580ee6f46d70ababf1b5d1be89e36ba76d0fdc3e83a40f74fa35b0eba678caed3e8f47c17adbdfab6d1e9734bf1e80e923bb7e17aab60f096b1f6bba1dcc8cb93cf05839f45205bcb92b7d5a27d6f0a86eefb32e0c933f89e051b43e1c9034f73f23ce1bad342f2c70dcf719315d32cd86a02bf5a18fcca802d3a36ed93bd1ce8b02f697130b626cf58c8802d3a36edb70223e9b06fa36b0cb51fdd373764067819da52787d467bddc041f66aa0cedc2903754f366ce3e1efd4078c8732f6fdcd968e2957c35c215b746cda2f0023f9d83cfc8c85a132e62d46ae7e2303b6e8d8b6edf18ef8e898b53a62d6c6c4d86a31d27e1b3052fc5a879fb1305446bb5f60ea939a87da27515c9a873f66433aaf39d0e1fd5f9b83b13d79c6f0bcb6598cb4df0e8ca46b011eaeeb61547bf5c536c77d08e6335db3e8fa43f66aa04e47f540ddad703d65e8430ba5de9b629f9efc792ae4f17a36141ee673d7cc948f79ec3b9f0d92cd35bbcd375bb1c2368f7d39573f19d597933d61166661166661166661166661166661166661166661166661166661166661f69f396a5eceb59ee1783292ae003c1ce3fce13baaccb1700ee83198d7497edea290c7b97a5ac7b8c8f2b906eafc5f6680ed71c73a099c3b5f66e998d62985e712d72975c33ed9c3751bb86e8a61ed49c8b3d4e2b16d8f77c4c7c775243eadd1885aa7e553cc72a0c3f5704d4c3c5179d6e4b0dd9098edc21e9eb653c8ebf701e977ea517f62b7115cfbb6c4d2e93ea9ab7ac06f8e1c2875de19af1b544e721e17f30d6d25bfdea630687d425530f85a81f7140c6b5406cd57d3da8876cb760dd4195b15fcfbdc2c87bf7707cf5d23a4eb7458c7a6ef2c82ef7658c7aee3f337b63f6c076e2ad75abe350237d5995035e0e3e74c99e97ea680eb6703e00d2c9f68c3f519c9dfef15d78bb494c0d3063c1c6bd798ee6bf3988f49af17e9b062e5ba5fa63aed10bf0e86f8c5ad59237bc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc2ec3f33beff8258f119e982278cc3b4c6269ccfa07719e1bcd803550376b9e70069ce69b1e5333ea3fc74d500db43a68cef08703def8ee7926b6e2dea5c92bdf1c1739fd3673a97437ef7439b23661d8e982d6762b4fb0cda5f0e8c14bf0ee0e16a8fed168f6d1bfb8c364f6316d5cf72ad5f89ca33d73a8586c46c17d78b70ccebd27a11fbfa55b0628aeb244887f3e0f86e159fdfff62af5dc07e0ad76825df6f1606cd01db6b05c91eae93f886892dad9348be1f28e439af11d446694d488bc357aaf35db8ce7ddf9471ad50018ef598e3efb4c5ad49c03e35f17770e68b73fcf4ee4a3abf5d0edb2b813521dbcd683b6384ec90be06cabfad1aa84bf5281e146b62d76d84de6588ecf6f79aadefe5a04ea7c3ffee2059ffbb2c9e2e8b59e7ce8f20cf1e837b3dae3ea93322468b20465407ef79b9ae5ff69a6d7bad32f6a3a3ad3af4dd1aa8f324f451a5bc2b8aeb7e21ea1a80f70bf67561286bc72b7d3de0bfa0bf487a3de0bf20875cf7a574fcc5707ce21a1d445f5ba8ceff5ad75186f57a437aef95ebb71ff1e27a43aaf32cf45579b32e37ea778ceb390baedf0d51cf7d903dbca72ac577ec1792be36623e220be6f2bfafd126d6948f1d11dccb1cdfcd467c976245ebcbf177b21d3f1d874ef84e77227128f6375d962fd4a63ac117aa530fbef0dc3315ef3f93f775f0fd10f541ad0e5fa9ce347817dc0c53cec279c2bef254c7df698bbbffa4f8699f87fb9dea68db8777aa2fa81ea86bbf1b9d625dea3bd5dbadeff9f84ef5d99067a7c2b3165c7df5ca88182d8618511d7cd6d1fefd1f758d399eef25b5fb4dbc4e0e279b3d7eebba3fa13a780f4d75daa09fcd3aeadae3d2740d49727d3a3e0fb414ece2f3404b99e2990b06c733677170daaeb36cd70da3ed7acb76fd30da96984bcc7d8a39c3ff3d51f6ff8581ff6745550a18ab53c0589302c6512960ac4d01e3e814308e4901e3d814308e4b016316188fe7b59d213e05cffebfa7d87b0db4cdf03e8730168dc1d063d1c4cb137bef83b619dea152f2ff37c0fc7f613597fb7f61e5e07b9352c03839058c5352c03835058cd352c0383d058c3352c03833058cb352c0383b058c7352c03837058cf352c0383f058c0d29603c21058c27a680f1a414309e9c02c65352c0b8401813615cc2cb58f0edff71ce0683d79a3d1f0ff3bb47c37728bade73caf17fe396ea3bf37b879bcb7d4f1faeb1e0fdbf1effb3770972aca128f55d8271ff3f361363a15c46aeb5e4b88e7a283cf81caaebf91606c642b98c5ccfa0e0339143e171fd5fbdbccf041563560e23d79ab152d734e2b382ed8e98313016ca65e47aee009f891c0a8febd9c5665ec642b98c5ceb73b36063283c9d10b3e58e98313016ca65647abe2c8c5967093cf81c56a723660c8c85721935cf0aa6987595c0b30262d6e588994f8cc893f43bd1bb1cb6389edb2bd5776240c6b129601c9702465c27c1d17fc5ad93e8e28d4fa1dcf8709dafb87512689be139913016f85cc0f3c562152f4fec3a09b4bd9a2916f8dcc6f3c56235f0703c4792051b43e121861c7c6f520a1827a780714a0a18a7a680715a0a18a7a78071460a1867a68071560a1867a780714e0a18e7a680715e0a18e7a780117fab32dc2bc6fe7e593dc26d47fd5619e9b6a37e978c74db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e4b94fb6d330c62f8c238f11791a92e3c9a3ef68abdb03dfbb1d3c1926dfd1d65a0f7c2786b431ae4901e38a14304a1c8b6b10cb61d43ca731f1ac2d81e734e0399d89e7b412784e079e3392e70973eaf41278882107df5b9102c635296094384a1c7d629438564e1c8551188551188f07631afa70614c453e16ca65d43ceb92e709637646093ceb2066f4bd665ec642b98c9a677df23c61ccd695c0b31e62b6ce113306c642b98c9a6743f23c61ccd697c0b30162b6de113306c642b98c9a6763f23c61cc3694c0b31162b6c1113306c642b98c9a6753f23c61cc3696c0b30962b6d1113306c642b98c9a6773f23c61cc3695c0b31962b6c9113306c642b98c9a674bf23c61cc3697c0b30562b6d9113306c642b98c9a676bf23c61ccb694c0b31562b6c5113306c642b98c9a675bf23c61ccb696c0b30d62b6d511335f1957a480714d0a1899e358289751f36c67e2d95602cf76e0399389677b093c6702cf0b92e70973eacc1278882107df5b9102c635296094384a1c7d629438564e1c85511885b134c6ee1430cab916465f19197e5fc53e4373e608b75d67d9aeab10db51cfd08c74db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e47925d8963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e47925d8963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9efb647b47f2b60ba53ec3ba0378389ea965f233af8f7b9639d6b309c64fc7ea6c2b56675ab1ca419db3207e6733c42f0376e9d8b44ff64a653ed5036626db8509ea1863c17fb2b1c68a87b67f0e93ef517dfd3923dc76545f3fd26d47f5f523ddb6e4b9e47925d8963c973caf04db92e792e7bed8c6724d3070df4eef57d2c738d79447997d64a5ef519d55a38b9f7581b4210edbd286e45a5109b625cf25cf2bc1b6e4b9e47925d8963cf733cfcf4bde76383786bf2ff4163737761ef09ccb100b263ff3daa7f32d9fceb17cca411d7c67edf90c7e66c02e1d9bf6cf87f3903666cdb3da9489350bf5567bc248ba737979c2f6b53a18bcc5b5aff38187a11d3433f919b6af0b2c9f563be24e7530572f60f0d3d57668ff02380f6963d63c6b4d9958b3506fad278ca43b8f97276c5f6b83c15b5cfbba007838fa1f263fc3f675a1e5d35a47dca90ee6ea850c7ebada0eed5f08e7216dcc9ae7345326d62cd43bcd1346d29dcfcbd39a059f698b6b5f17020f47ffc3e467d8be765a3e9de6883bd5c15cddc9e0a7abedd0fe4e380fc22ccc2e66cd43ffa73cb166a1dee99e3092ee02569ed67c167ca62dae1fdb093c1cfd3c53dcc37eec22cba7d31d71a73a98ab1731f8e96a3bb47f119c875298d7a49059e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e25c1eb3e639c39489350bf5cef084917417f2f284cfef9c110cde32d67e37942f029e9d0cf161f2335cf77eb1e5d3198eb8531d6c5f1733f8e96a3bb47f319c875298d7a49059e25c1eb3e65967cac49a857aeb3c6124dd4e5e9eb01f5b170cdee2fab18b8187a39f67f233ecc72eb17c5ae7883bd5c1f67509839faeb643fb97c07910666176316b9ef5a64cac59a8b7de1346d25dc4ca53089f435c1f0cdee2fab14b8087a39f678a7bd88f5d6af9b4de1177aa83b97a29839faeb643fb97c2792885794d0a9925ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e728668973e5c459f36c306562cd42bd0d9e3092ee62569e9670de614330788b9b77b8147838e66598e21ece3b5c66f9b4c11177aa83edeb32063f5d6d87f62f83f330d299d7a4905972637898253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a3987dc80dcdb3d19489350bf5367ac248ba4b7879c2f71e6c0c066f71eb762e039e4b19e2c3e467b86e6797e5d34647dca90eb6af5d0c7ebada0eedef82f3b04b9885d9c1ac79369932b166a1de264f184977292f4fd88f6d0a066f71fdd82ee0e1e8e799fc0cfbb11ecba74d8eb8531dccd51e063f5d6d87f6c99e300b7314b3e6d96ccac49a857a9b3d6124dd65bc3c613fb63918bcc5f5633dc0b38b213e4c7e86fdd86ecba7cd8eb8531dccd5dd0c7ebada0eedef86f320ccc2ec62d63c5b4c9958b3506f8b278ca4dbc5cb53c882cfb4c5f563bb8187a39f67f233ecc7f6583e6d71c49dea60aeee61f0d3d576687f0f9c87b4316b9eada64cac59a8b7d51346d2f5f0f284ed6b6b30788b6b5f7b8087a3ff61f2336c5f7b2d9fb63ae24e753057f732f8e96a3bb4bf17ce43da9835cf365326d62cd4dbe60923e976f3f284ed6b5b30788b6b5f7b8187a3ff61f2336c5fbd964fdb1c71a73a98abbd0c7ebada0eedf7c279481bb3e6d96ecac49a857adb3d61241df653b45501e37626c6c0620cacf820cf3ccf787678c633c3339e499ef18cf58c6791673cd59ef12cf78ca7cd339e82673cf33de399e919cf64cf78c679c6b3d4339e1acf781678c6b3d8339e599ef14cf18c27eb194fa3673ca33ce3e9f28ca7d3339e859ef1b47bc6d3e219cf32cf78667bc633d5339e259ef18cf78c27e7194f93673cb59ef1acf48c678e673cd33ce399e0194f9d673ca33de359e5194f87673cad9ef1e43de399eb19cf74cf78267ac653ef19cf18cf78321ef06483e7ae63c8c2df7780aecafaaebebeec9e32f0779a37ae82efec33e56ac7b17b4147f3ccfb1cdfc53871cd85a3ad6ed8277be381639f273c633ce3a9f78c67a2673cd33de399eb194fde339e56cf783a3ce359e519cf68cf78ea3ce399e019cf34cf78e678c6b3d2339e5acf789a3ce3c979c633de339e259ef14cf58c67b6673ccb3ce369f18ca7dd339e859ef1747ac6d3e519cf28cf781a3de3c97ac633c5339e599ef12cf68c6781673c359ef12cf58c679c673c933de399e919cf7ccf780a9ef1b479c6b3dc339e6acf781679c633d6339e499ef1ccf08c6787673cf33ce3a972f0ec60e2897ab6798727b619ce435e1ff772269fae30c7aa35c7257eb25703754e32038f7afe03bf4b5cf6fc3fb69d2b20465cef95c8593cb4bf7784dbaeb36cd75588ed7acb767d85d8963c973caf04db92e792e795605bf25cf2dc47dbcf2667bb4dde2f35741e799f533c8fbccf299e47dee714cf23ef738ae791f739c5f3c8fb9ce279e47d4ef13c0b3ce391f739c5f3c8fb9ce2791a3de319e5198fbccf299e67a1673cf23ea7781e799f533c8fbccf299e67bc673cf23ea7789e5acf787c7b9f936fef8397f74bc5f34cf08c47de2f15cf23ef978ae791f74bc5f3c8fba5e279e4fd52f13c633ce3c978c0f37cef97c2f7425d61ca7b4147eb4be3de439585e35c013a1acfa563e8ebd5a129cf65a882efec77705deeb04776f63bbe3b1c71475bddb04ff6f07d55fb3de119e3194fbd673c133de399ee19cf5ccf78f29ef1b47ac6d3e119cf2acf78467bc653e719cf04cf78a679c633c7339e1d9ef1acf48ca7d6339e26cf78729ef18cf78c6789673c533de399ed19cf32cf785a3ce369f78c67a1673c9d9ef17479c633ca339e46cf78b29ef14cf18c6796673c8b3de359e0194f8d673c4b3de319e719cf64cf78667ac633df339e82673c6d9ef12cf78ca7da339e459ef18cf58c6792673c333ce399e7194f958387eb9d5151cfd70fc7fbaa9ecfb6de5f0a71d15b16fe3e1ccf71edb018691fd73d202ff12c65e2897a2fc0520f6c6bffe9b7e804f39985bfe373385c39b5d462a47d574ee1bac646269ea8f719347a605bc7a2c994690d4016fede048c5c39d56831d2be2ba7ea79795ab3e0336d716b8db0cd719c43263ff3d8fe127c87465ec76abb15ab262b5639a8331cebd2a3fa03b227ccc21cc5ac79682e8558f17a361ccf990d85d1757d65e009fbc765c1e02dae7fdc0e3c1cd70f263fc37eec80e5d33247dca90ee6ea01063f5d6d87f60f386c3704c9c6e2ca21c4e24a07cf95c31c0bb2572af38e1432fb1067cd436b118915d737e73d6124dd525e9eb07fcc0783b7b8fef14ae0e1b87e30f919f609072d9ff28eb8531d6c5f0719fc74b51dda3f08e7a114e6032964963897c7ac79680e8258b350afe00923e9b6b3f214f259f099b6b87eec20f070f4f34c710ffbb143964f0547dca90eb6af430c7ebada0eed1f82f320ccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22ccc7e336b1e7a369658b350afc51346d25dc9ca539c776809066f71f30e878087635e8629eee1bcc361cba71647dca90ee6ea61063f5d6d87f60fc3791066611666611666611666611666611666611666611666611666611666611666bf99350fbdb39d58b350afd51346d21de4e5099fdb6a0d066f71f30e8781e710437c98fc0ce71dfa2c9f5a1d71a73a98ab7d0c7ebada0eedf7c17910666176316b1e7a571bb166a15e9b278ca43bc4ca539c3f6d0b066f71fd581ff070f4f34c710ffbb123964f6d8eb8531dccd5230c7ebada0eed1f81f3500af38114324b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc12e7e161f621ce9a87fe0f4162cd42bd764f1849779895a7259c77680f066f71f30e478087635e8629eee1bcc355964fed8eb8531d6c5f5731f8e96a3bb47f159c8791ce7c2085cc921bc3c32cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc5ec436e689e0e5326d62cd4ebf08491747dbc3ce17b0f3a82c15bdcba9dab80e708437c98fc0cd7ed1cb57cea70c49dea60fb3acae0a7abedd0fe51380fc22ccc2e66cdb3dc9489350bf5967bc248ba23bc3c852cf84c5b5c3f76147838fa79263fc37eec98e5d37247dca90ee6ea31063f5d6d87f68fc179481bb3e6e9346562cd42bd4e4f184987d7e54e269e9cc59373c4e278d9d6fb5da63cde7c66e1ef5dc0c8d51f765a8cb48f398ebcc4d3c5c45367f1d4396271bc6c6bff579af204f39985bfaf0446ae9ceab21869df955375c0b39289a7dee2a977c4e278d9d6b15865ca13cd6716febe0a18b9726aa5c548fbae9caa079e554c3c517dd2aa61b01dd5be86c37654ae0c876d897974cc19da5d383eb02a18bcc5dd57e3b585a3af62f233efba7eafb27cc2eb37dea31eafeb93300b731433d37d6e6bd6b24df1092c1eda8e32c762387f6777593ea5e177761cf38114324b9ccb63d6b6fb93b7dd9ab56c537c028b87b67ee65830f919f6075707ee1893bd1cd4c13cbd9ac1cf0cd8a563d3fed5701e4a613e904266897379ccdaf63589db2ebe7f186d537c028b87b66b9863c1e367b13fb83670c798ece5a00ee6e9b50c7e66c02e1d9bf6af85f320ccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22ccc7e336bdbd7256ebb387e8fb6293e81c543db75ccb1e0f1b3387e7f7de08e31d9cb411d3ce7d733f89901bb746cdabf1ece83300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb330fbcdac6ddf90bcedf0791cb44df1092c1eda6e608e05939fe1f8fd8d813bc6642f0775f09cdfc8e06706ecd2b169ff46380fc22ccc2e666dfba6c46d17e7f3d036c527b07868bb8939163c7e16fb839b03778cc95e0eeae039bf99c1cf0cd8a563d3fecd701e4a613e90426689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e25c3971d6b66f49dc764b387e8fb6293e81c543db2dccb1e0f1b3387e7f6be08e31d9cb411dccd35b19fccc805d3a36eddf0ae761a4331f4821b3e4c6f0304b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e486304731fb901bdaf66dc9db0e9f6747db149fc0e2a1ed36e65830f919ae7fb93d70c798ece5a00ee6e9ed0c7e66c02e1d9bf6c99e300b7314b3b67d47f2b60b59cb36c527b07868bb8339164c7e86fdc19d813bc6642f0775f09cdfc9e06706ecd2b169ff4e380f6963c6f39749ce76b86e936c54994fadbbcb94ab41f74253ae01dd8b4c7914e85e6ccab5a0bbdb944783ee25e01be95e6aca4b40778f29af02ddcb4c7925e85e6eca5da07b85297782ee5e533e0aba579af231d0bdca94fb41779f295f0dba579bf235a07b8d295f0bbad79af275a07b9d295f0fbad79bf20da07b8329df08ba379af24da07b9329df0cba379bf22da07b8b29df0abafb4d7901e8deead03d60cab781ee4153be1d746f33e51da07bbb298f05dd43a63c0e74ef80327dbed394c783ee5da69c03ddbb4d7902e81e36e53ad0bdc7942782eebda65c0fbaf799f224d0bddf942783ee03a63c05748f98f254d07dd094a781ee43a63c1d741f36e519a0fb8829cf04dd474d7916e83e66cab341f771539e03ba4f98f25cd07dd294e781ee53a63c1f748f9a329edf4f9bf21da0a37ee54ed051bf7217e8a85f7921e8a85f7911e8a85f7931e8a85fb91b74d4afbc047494772f051de5dd3da0a3bc7b19e828ef5e0e3acabb57808ef2ee5ed051debd12749477af021de5dd7da0a3bc7b35e828ef5e033acabbd7828ef2ee75a0a3bc7b3de828efde003acabb37828ef2ee4da0a3bc7b33e828efde023acabbfb414779f756d051de3d003acabb0741d760ca6f03dd09a6fc76d09d68ca0f81ee2453c67ee664537e27e84e31e577818efac27783ee54537e18740b4df93da05b64caef05dd62537e1fe89698f2fb41b7d4943f00ba46537e04744da6fc41d02d33e50f812e6fca1f065db3297f04740553fe28e85a4cf963a06b35e58f83aecd943f01ba7653fe24e83a4cf953a05b6eca8f828eaee3d4cfe8f6acdb25c58162a475e47393c317d28d015fba8364efe9c8161d9bf65b8091ce4161f8190b43656cb618354f1b43cc30af688bfbcdd4063cad0c3c4c7e86bf99da2d9f5a2c9f7250e754f0b39dc1cf0cd8a563d37e3bd8e638e7188b5a73dc85562c6aa04eabb9c8e9eb695c1ce9183a7f0b0e5fb8e2d86cf1343b6c7732c7918e4d7d62e730d8eeb06ce72ddb782da02dae6d7700f37206667ddcaee48f1bb6ed15e65894cf64270f3ead841824e513dace18213ba4af81f296290375a91ec583ae9dc4aedb119d4b64b7bfd7667d2f07753a1dfe7707c9fadf65f17459ccfaf744f794010e86f610e640a7c541fb79885d5744ec3a21765407afbd8d4cb15b6ef1d07e23f0d0fd553be8e83e85f8f11eaf6918b8ed7eafddc14dba0e606c74301692670cefb31a2d46da2f0023e996034f0753ccec73bdd08a0fde138cb6ead0776ba0ce2eb82e671d7575bb6bc80cf845bfff9f0d92edd36b19e285631301c427b062481b318c0906c62f92e419170c8c4f1cebef3bda7379ef59bd3d7b3380566361e267c6e14615e8b05cedd005c1e061181c0ea661181c0eaeb2c282c33f545fff8cd36ed15047efa1fdfde71eee3dbce7e8f547fa7bf76eedbb1ca94759f4481ae50192a28eb631c1c080517790ec4450ad652b2e79c6c0e7e8e4799a99fc0c2f7a632d9f6a2d9f72506714fc6d2c839f19b04bc7a6fdb10edb097644612cc60d2116e31c3ce386391638e84e3a6ca9f4779cb8a9b27cc1168d3ed9799ea8436470011c3f63e0f4df74631f659c191d0c9c6cea3df51dad3e097ab4565fb5f468ac1e7dd55d901e5dd517343d7aaa474bf5e8a81e0dd5a39f7ab4538f6eead14c3d7aa9472bf5e86443501c7dd4a38d7a74518f269e026cdf065efd8b5e5f21f568a01efdd3a37dface4adf01e8bb117df7adef14f5af477d87a07fd5ea110e7db5d57732fa2aadafacfa4e51df21ea3b7a7d87ab67c8562b596362bd56c9694a4e57728692754ad62bd9a064a3924d4a362bd9a264ab926d4ab62b3953c90b82e2c8fe594ace56728e9273959ca7e47c251728b950c94e251729b958c9254a2e557299925d4a7a94ec56b247c95e25bd4af629b95cc9154af607c55541572a39a8e49092c34afa941c517255509ca5d3b3727a164ecfbae959363daba667d1f4ac999e25d3b3627a164ccf7ae9592e3dab755b509c8dd233117ae641cf34e899053d93a0670eee0e8a33037a26e09ea038d2af47f6f548be1eb9d723f57a645e8fc4eb91773dd2ae47d6f548ba1e39d723e57a645c8f84eb916f3dd2ad47b6f548b61eb97e30288e4ceb91683df2ac479af5c8b21e49d623c70f07c591613d12ac477ef548af1ed9d523b97ae4568fd4ea91593d12ab475ef548ab1e59d523a97ae4548f94ea91513d12fa19259f55f239259f57f205255f54f225255f56f215255f55f235255f57f20d25df54f2ada09897df51f25d25df53f27d253f50f243253f52f263253f51f253253f53f27325bf50f24b25bf52f26b25bf51f25b258f29f99d92df2bf98392c795fc51c99f943ca1e449257f56f217257f55f29492bf29f9bb92a795fc43c93f953c130cccac602732c6f43c34cadfd3dfdf7be8487f437f5fc3a1ab0ff6ef3f72f0fa866bf7f75fd1d0774defd17d07fbaec52f7fdd7c99a630d61e3dda737dc3fec37b7baf6be8bbbabfa16f5fc3eebeab0fef3d865f7ac27c69ce732df6ecdd1b6decbffe13d2ff29d3e868d327d2e4d0a678dfc65597119089e57ca9b5ba3c87569aab0efd7a3fbb78b7db70ec605f7f43bee1b0fab7e7a0fa4eefdea606fcdb3115e463fd0dc7fa7b8ef637ec3bda77a8a1b9098f7be2f8329c689952c6972e9b3274cf83ff07e76a99f7f1d90300", + "packedBytecode": "0x000000028df71de500000046871f8b08000000000000ffed9d07741d45b6ae5bb61ce0481893b3450e06a3e49c64724ec6608c31b62c0b1b073962323643700ee460839c73c638478c6166983b393181811926dd3b7367bdf5e6be77df7a8ff5bacea9bdf4ab5c7daca3e992ff2355af5552f53ed5bdbffa7b7775aaeefa47100439416a6a1ea68b822327f9bd4cff2ffcd7a6a218d755e89233274b389b650967f32ce1cccd12ce1659c2d9324b385b650967eb2ce13c2e464ec5d62ca83dc5cd7bbc035de3664c6499a67959a0697e96697a421668da26c88e36eac42ce16c9b259c276509e7c959c2794a96709e9a259ca76509e7e959c2794696709e99259c676509e7d959c2794e96709e9b259ce7650967bb2ce12cc812cef3b384f3822ce1bc304b382fca12ce8bb384f3921839db03e7a5faff65faffe5faff15fabf94bd52ffbf4affefa0eb98abe7af565c61520f698a8ddf4ac2541aa68e61ea64fcd6394c5dc2d4354cddf46f05fab7ee61ea11a69e61ea15a6de5a833e61ba264cd786e9ba305d1fa61bc27463986e0ad3cd61ba254cb786e9b630dd1ea63bc2746798ee0ad3dd61ba274c7dc3746f98fa85e9be30dd1fa6fe617a204c030c9607c334304c0f856950981e0ed3e0300d095379988686a9224cc3c25419a647c2343c4c23c2f4689846866954984687694c98aac234364ce3c2343e4c13c234314c93c2f458982687e9f1303d11a6270dcd9e0ad3d3617a264ccf1a9ccf85694a98a686e9f9307d2b4c2f84e9c530bd14a697c3342d4cd3c334234c33c3342b4cb3c334274c73c3342f4cf3c3f44a985e0dd36b617a3d4c6f84e9cd30bd15a6b7c3f44e98de0dd382302d0cd37b9a457684f7c3541da645615a1ca625615a1aa665615a1ea615615a19a655615a1da635615a1ba675615a1fa60d61da18a64d61da1ca62d61fa204c5bc3f46198b685697b9876846967987685697798f684696f98f685697f980e84e960983e0ad3a1307d1ca6c361fa244c9f86e9db61fa4e98be1ba6cfc2f4bd30fd9ba1f9f7c3f48330fd304c3fd2b61febff3fd165e5fedd4fc3f4339dffb9feff0bfdff97faffe7c632bf0ad3af0ddb6fc2f45bc3f645987ea7f35feaff5fe9ffbfd7ffffa0ff7fadffff51ffff93feff67fdff2ffaff5ff5ff7fd7ffff43ffff9bfeff77fdff3ff5ff7f84e9a18254be755033950531b551a595c9673f22fea541ed4969d15cff26ff0bb43d57cfcb7fd1ae859e6f61d85beaf996c67a5aebf9d686bdad9e6f6bd84fd6f3271bf653f5fca986fd743d7fba61bf48cf5f04f64400f786b55dd99a6b530ed8245e9b81ad85b635075b4b591dd85a695b0bb0c9f66d09b6e3b4ad15d88ed7b6d6604b68db71a26598f2b4ad2c882b560a87a8f5e6c7bd5efdbcec84f87987aaf5b671c47b62fcbcc3d47adb3ae055f171925ed7891037276b5b5bb09da26d2781ed546d3b196ca769db29603b5ddb4e05db19da761ad8ced4b6d3c17696b69d01b6b3b5ed4cb09da36d6781ed5c6d3b1b6ce769db39606ba76de782ad40dbce03dbf9dad60e6c17685b01d82ed4b6f3c17691b65d00b68bb5ed42b05da26d17814ddadf8bc126e78b97689b6a3b8ecb8165b45ddaade432d26683ed7269afc17685b4d5606b2fed34d8ae04df62bb0ada1ab175d03669b7d46fdd74be2c886b3f29ae54ebed1ef77ac335abf5f68c7fbdc9678ebd821a5dcbc04f77d0aab7cec7d8afa9087de7e8247ec49e0bf95ba0ac94133de4d823ecea18d343e77ba759ae9bb15c3e94e961a97f59106ffd7b1a3c3d0de616907713b325253e66eb3c651cb3fda1ac197b721ed41863f676e07010b39d7dccd679ca38662ba1ac197b722edc1863f641e07010b3e56e62b6b8d0c76ceabe5910d8634fae871a63cc8e008ef863b6a38fd9ba4f19c7ecf350d68c3db9266e8c313b1938e28fd9cee5fedca0ce53c6313b0fca9ab127f7671a63ccbe081c0e62b6d2b7b3759e328ed9f7a0ac197b72afb031c6ecabc0117fcc767514b3253e6683d433d020b0c79edcb76e8c31bb0838e28fd9a1fefe6cdda78c6376279435634f9ea134c698dda0f3ea39c38ff5738673c0f6136d3b1778e38fed8a8e8e62bbd8c776aa6f4810d863549ee735c6d8dea7f32a8e7f0efd11c4f60b6d3b1f6cbfd4b60bc0f6b9b65d08f572b00f94fb7da0ce53c6fbc0afa1ac19cbf26cb931ee033f040e07315be163b6ce53c631fb57286bc69ef473688c31fb05703888d94a1fb3759e328ed9ff0d65cdd8bb4ce71b63cc4a5f5375bef0a53e5fb8026c5f695b7bb0fd5edbae04db1fb4ed2ab07dad6d1dc0f6476dbb1a6c7fd2b642b0fd59db8ac0f6176d2b06db5fb5ad046cffae6da560fb0f6deb08b6bf695b27b0fd5ddb3a83ed3fb5ad0bd8fea16d5db54d3def92be5772deda1a58cb82f8b66d02749129c7982f837cb15b9ec27ce0415fa5f1fb2a51752f09ea5ef752e0e9e8a0ee09f051179e8ec0d3297e9e645fd4cef1af37b98d4b0c4d13e0ab04ead5c541bd72c097ac5be6c55f3ed8703fef6261ec1a3f63710ef89275cb7c5760141bb63bf2fe8fec3faa6d3e3fa786d7c1be943c3ea3bf32e0107fb950e69fed6aca5eacd9f2e0776c833b19364771998c0bf125eb9679f19707f5e9d4f08cc57565ec6830ba6a2372c097acdbf49d07f922b7faa4e5e94ce2dbc179b7b54d13cdbb3780efae86ef52c337b69d32a53bb67505e6d8af7ff4b1ad47fceb2dc47365b94e113f78fe80d71371d5097dcb758af8117b2ee46fcaa9292be5440f6987855dedc3b22d91dd5cae8bb15c3e94e96ea97f59106ffd7b183c3d0c6675bce909c74207fb433206ba1b1c325f0adaf588d0ae3b6827652e03ed1c9c7b26b5eb66f0c87c47e091f61bdbb3a206e62922f08de7b0782d27bfe37980abed556430cabc6d7b7505c68e164607e784c5e98e87a5c028b66ec053e248b3a8ed5a42e2dbc575650ef8907373f3da2617cadcd9bca66c458e53b6623c7796a9aed7bcf16fa7e242dc3feac2e3781f2a72148f8578ffe69b20de5833db25b3bd89bac7e3aa2d2f3178645efc7966cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367e667563cf23c01fb6d49b94e248c66ff3757f7f993dfe2d3ebc26740ff74da1facb8109ffd493f882b8c3ae74299939bd5b0fd37f40733fb12456d4b177d63d36d4bf187fdc11ae21962a9c163faceb3e883cfa55133577da0cc3643e6b17f9ae857043caef6c76283c7f48d6d4609a96651edacab3e7d517166eb4f58109befe2a1ae9eebaaef9ea96f879ac7af4e86a6c96f921a36d526ddd3bca6de2e9ef366fadc198f1b928ff3392ef6cb405ff1b7b3c5b5fa27340b6a1f2b30d65df5d592fd4afa4674377ce74299f39bd56c1bec5357161c796cc03e5eb26e59e60a58b687b1ee36eeea9bb61f4a77e0967c4ba36e9d815bca5c02c7ee9feabca3636071a6ef48e03139fee34baabf4849063c78bc7371cee2e8385a88f118777f11b31fa4ed7c59ca601f5207fd77d31e8bc59f67f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b667e66c5633e43c767bfa5248c0dd4c726f93c43becf86cfc5b635abf1ebfa19a03c736a6fd419df51ce857794776936ecfb80df95b26d4b57cfd6a2b6a5f863ebfb9067d14769d6c3a29983ef3aa6fd66077e2351f4eb013caef6c7a86f77d8da8c2252cda2da59177d17d2c599ad9f42416cbe53fd455c3cd795fe22e6f1cbfcae11f693101b3e078ffa5e58b1613bd66d80ad5f9be4f19b0b2ec6b8c17836fb0a8a3fec27f185d656fa49c4df0e1417ba3c46c83e2a7d424a2c7595327f685653f68f3a8f7d854a615dffb4fc2e53ba3e09d8a63af87e6c72fbcaba64fbdabe5ddb075863f25d84ebcad1a98fa1412ee4ff67b39ab2524eca8ad6c2aef611f9ae14b29bcb753496cb8732bd2cf52f0be2adbff92de1de06b38a9dbf409cfd13cef55cb549bd2234ba0234923278ceebaa5fadd9469a7da6b14f642ba30c9e9f4a99ff076d54549f745b9f4a57e70b51fd39f17cc1764e63d6d1ec3bded4fb03e6ebeb1017fd0165dd6d82da7df20263fded61fdc2d52a883eb64899b6b0fe63f9dd2bdbb59ff0627f4329731a5cfbdda4f3995cfb1dabeb78dbb51f2e1755776c17e23e36623c220bc6b2942930e2b147047757cbb217462c2b5a99df3ec4eb523c4788ffbb91a9f6a6b75117d9a7f0fbfe52e67263bf89ff9c2975fee9ea1b99b22e69838a2d7595321d605f2bd4f9046c277ca7a8b7e57799d29d7f8a7eaaced7c45fe7e4f6bd56af4bb6ef3516dfd7016b4cbe8bd0b79c7f8a1fb1e742be171c4fa49ce8215a0bbbda47e41c0ed9cde5ba1bcbe543993e96fa9705f1d6ff1a83e71a8359c54e09c4596f78d7c2555bdd2742a3f6a09194c17bd7b6ef1adbee7534d479aaf9bdf4fce0c86ff7e271d2cd399bfd5d39f3feadedfca4bdc18fe727b7433b9bb09435ef4bcb7271f64fc7f781f0bc10df0772758d941fd4d633dfe070e9bb8de1bb4d03fa6e6bf86edb80bebde65e7326cd99c6fcc1e790cd80d1c5b10e8fab7561b41dff9a03a3ab77364b3260c46f5ee3f14e185d7c27bcbe630ae1b94e0b6074f1be71a6f7ab3b01237e6340185dbca39de977aaf1bd6d59ae1530ba18d708c750aa0ba36daca3d6f0dfc1b84645f51d0704c73a3a0e185d8c0d92086a8f677234c66ec028cb1d0f8c2e9e232582daf7d58ec688cf2b65b98463c674c776c77d7f8a33bd07d110fd0aa2ce35d0b783fbffc5d837a12e5af474cb93f6dc077d3bb8ff95d402c7b23c9a16f87ccec5d89a89a0f6b3b0a3f1e0334459ee24602c73c4d83b03c6326094e54e06c63e8e18cb3260ec038c623f05181ddc874c32f6c98011efd7c972a702e3b58e18afc980f15a6094e54e034617f71413e0b72e8cd701a32c773a305eef88f1ba0c18af074659ee0c60bcc111e3f51930de008cb2dc99c078a323c61b3260bc111865b9b380f126478c3766c0781330ca726703e3cd8e186fca80f1666094e5ce01c65b1c31de9c01e32dc028cb9d0b8cb73a62bc2503c65b8151963b0f186f73c4786b068cb701a32cd70e186f77c4785b068cb703a32c57008c773862bc3d03c63b8051963b1f18ef74c47847068c7702a32c770130dee588f1ce0c18ef024659ee4260bcdb11e35d1930de0d8cb2dc45c0788f23c6bb3360bc071865b98b81b1af23c67b3260ec0b8cb2dc25c078af23c6be1930de0b8c7d2d8cfd1c31de9b01633f6094e5ae04c6fbe2674c5e4bf7cb80f13ee0b93f7e9ea466f765c073bf5b9ee43714efb3f87a207e5fc96dd13fa87bdd1f009e01f1f324b7c50319f008433e2c879a3d183f6352b30119303e083c03e3e7496af660063c0341b3072d9a3d143f6352b38119303e043c83e2e7496af650063c8340b3872c9a3d1c3f6352b34119303e0c3c83e3e7496af670063c83831acd1eb66836247ec6a4668333601c023ce5f1f324351b92014f396836c4a2d9d0f819939a9567c03814782ae2e7496a3634039e0ad06ca845b361f1332635abc8807118f054c6cf93d46c58063c95a0d9308b668fc4cf98d4ac3203c647806778fc3c49cd1ec980673868f68845b311f13326351b9e01e308e079347e9ea4662332e07914341b61d16ca423c64733601c69e189fb9be88f5a7c8d7654f75141ddeb2e0cf9b01cf69318e3887174068c63805196c37e12558e18c764c058058cb25cc23163ba7e1255e07b6cfcbe93ed525550777dc6bae549db4f027d8f73a4c5d8a0ee5a8c73cb93b69f04fa1eef488b7141ddb5180f3c131c6891001f75e111867c580efb494c74c4382103c689c028cb613f89498e182766c03809186539ec27f19823c64919303e068cb21cf69398ec88f1b10c182703a32c87fd241e77c4383903c6c7815196c37e124f38627c3c03c627805196c37e124f3a627c2203c627815196c37e124f39627c3203c6a7805196c37e124f3b627c2a03c6a7815196c37e12cf38627c3a03c667805196c37e12cf3a627c2603c667815196c37e12cf39627c3603c6e7805196c37e12531c313e9701e3146094e5b09fc454478c5332609c0a8cb2dc48c78ce9ae5fa63672df51d72a8ddd77d4754963f7ede3dcc77953f0ede3dcc77953f0ede3dcc77953f0ede3dcc77953f0ede3dcc77953f0ede3dcc77953f0ede3dcc73993efe71df84e800f99728cf932c80b433e2c37d233366a46e429888fa710eb8ebebe4550f76f5978721cd51d7dbd40507761c836c6e7b380716416307a1d537d10ebc3a8785e74c4f342063c2f02cf4b8e785ecc80e725e079397e9e644cbd94018f30e4c37223b380f1f92c60f43a7a1d9918bd8e4d4747cfe8193da3673c168cd9d0867bc6ac88c7e2fa322a9e69f1f324357b39039e69a0992c77bf5bc6e2fa322a9ee9f1f324359b9601cf74d06c9a4533078cc5f565543c33e2e7496a363d039e19a0d9748b660e188bebcba87866c6cf93d46c46063c3341b31916cd1c3016d79751f1cc8a9f27a9d9cc0c78668166332d9a39602cae2fa3e2991d3f4f52b35919f0cc06cd66593473c0585c5f46c533277e9ea466b333e099039acdb668e680b1b8be8c8a676efc3c49cde664c03317349b63d1cc0163717d1915cfbcf879929acdcd80671e6836d7a2192be3c82c607c3e0b181deb585c5f46c533df11cfbc0c78e603cf2b8e78e667c0f30af0bc1a3f4f32a65ec9804718f261b99159c0f87c16307a1dbd8e4c8c5ec7a6a3a367f48c9e3133c66f6501a3dfd69e9195d1c1f555da77685e69e4bea3dea169ecbea3dea169ecbe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb386f0abe7d9cfb3867f2fd5afcbe8b337d87f535e071f14eada37a16aaf5beaed7f54d8cfa29adde30b47ac5d02a1fcabc0efabde140bf1cf02beb9679f19729f3a504cc8e7c179f10aee338a8bff878ded043f97fd351dda3dafa371bb9efa8b6beb1fb8e6aeb1bbb6f1fe73ece9b826f1fe73ece9b826f1fe73ece597c63be455073de2edf5752eb780b7ecf81f2f2ddb25c28d3af55ea7f9bc0ef432e7cfb7dc81f2b9a826f1fe73ece9b826f1fe73ece9b826f1fe77c718ef1706d03f004064f9086e769329ece643c63c9788692f1dc47c6730b194f2f329ec9643cc5643cb3c8781e25e379898c671019cfdd643cd793f15c45c6f32c194f57329ef1643cc3c8781e20e3b98d8ca78c8ce709329e52329ed9643ca3c9785e26e3194cc6d3978ce705329e1bc978a690f17427e3994bc6733919cf44329ecbc8781e21e32924e379908ce704329e36643c7790f15c43c6f314194f27329e39643c55643cd3c878cac978fa91f15c4dc67333194f4f329ef9643c8f91f11491f18c20e379888ce72e329ee6643cd791f13c43c6d3858c671c194f7b329e0a329ee9643cfdc9786e25e3e94dc6f338194f0919cf28329e87c978ee21e36988ef7164c233958ce706329ee7c878ba91f14c20e39941c67329194f2519cf00329e3c329e7c329e0e643cb793f1f421e379928ca72319cf18329e21643cf792f1bc48c67313194f0f329e79643c93c8786692f10c27e31948c6730519cf89643c6dc978ee24e3c921e04904477e233901bfbf06b666c6b2eab352dd0a6a7e7f5bdb9bc132efe87c73cbbadf069b7cabea1dcbb2a8d3db5097329d2ffcd7a6a44ee8ab0ce6c55f1e70bc43c27327194f5b329e13c978ae20e31948c6339c8c672619cf24329e79643c3dc8786e22e379918ce75e329e21643c63c8783a92f13c49c6d3878ce776329e0e643cf9643c79643c03c8782ac9782e25e39941c633818ca71b19cf73643c3790f14c25e3798d8ce71e329e87c9784691f19490f13c4ec6d39b8ce756329efe643cd3c9782ac878da93f18c23e3e942c6f30c19cf75643ccdc978ee22e379888c6704194f1119cf63643cf3c9787a92f1dc4cc67335194f3f329e72329e69643c55643c73c8783a91f13c45c6730d19cf1d643c6dc8784e20e379908ca7908ce711329ecbc8782692f15c4ec633978ca73b19cf14329e1bc9785e20e3e94bc633988ce765329ed1643cb3c9784ac9789e20e32923e3b98d8ce701329e61643ce3c978ba92f13c4bc6731519cff5643c7793f10c22e379898ce751329e59643cc5643c93c9787a91f1dc42c6731f19cf50329eb1643c9dc9789e26e3b9d6c2f39a231e79df5dd62df3af91f876b01d0ad57adf7554a7057a5d2df57a855ffce54299a2e353ffd5f3215c56b8ccef1360dfef05a0d15b8eea628e8929f36f3572df6d0cdf6d9a88efb686efb64dc4b78f731fe74cbe17c4efbb18bf6d23538e315f06793cbeb8f82690a37ad63ab67f13a37e4aab8586566f195ae543997741bf850ef4b39d2fc8bcf8cb94f95202668c8b8220deb8782ffe3a15abbe34c781aeef19fa62bdde77a469d431e4fd46ee3bea18d2d87d471d431abb6f1fe73ece9b826f1fe73ece9b826f1fe73ece997c57eb7c8cd78d85e8a34550733d500d7e17eb7c4e8c7ed5ba1681df1ce0107fb950e615b817edf779bfcfc7e5db1fdb7c9c3705dfcc716ee6e519e265c0e6ea196f542c36c4f3e563e93b2a161bbbefa8586cecbe7d9cfb3867f2bd247edfc96788af05b5a774cf109700cf22075a38aa67f2da69a951a7d78c3ae543996aa8e75207f5cc01bfb26e995f0adb21db9815cf549dc7f15da4dc541246b12d72cb93dcbfa606b5a774fbd752e071b01f1439aa6772ff5a66d469aa457729530df55ce6a09eb67d47e697c176c83666c523efee0a6b02cabd40c228b6256e7992fbd70b41ed29ddfeb50c785cb43f8eea99dcbf961b757ac1a2bb94a9867a2e77504fdbbe23f3cb613b641bb3e291b14c843501e55e246114db52b73ca509a8b34ce9f6afe5c0e3a2fd7154cfe4feb5c2a8d38b16dda54c35d47385837adaf61d995f01dbc1337b661bb3e2917726853501e55e226114db32a73ca58509a8b34ce9dab115c0e3a29d77a47bb21d5b69d4e9258bee52a61aeab9d2413d6dfb8eccaf84ed9009f3822c64aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390994167c5f3b2ce0b6b02cabd4cc228b6e56e7992efefbc1cd49e728cf932c8af049e150ef47154cf64bff755469d5eb6e82e65aaa19eab1cd4d3b6efc8fc2ad80e99302fc842e6ea2c6466d059f14cd379614d40b969248c625be19627d98e4d0b6a4fe9dab155c0e3a29d7754cf643bb6daa8d3348bee52a61aeab9da413d6dfb8eccaf86ede0993db38d59f14cd779614d40b9e9248c625be994a738f91ee2f4a0f694ae1d5b0d3c2eda7947ba27dbb135469da65b749732d550cf350eea69db77647e0d6c874c98176421737516327b9dbdce51ccd559c8ec75f63a4731576721b3d7d9eb1cc55c9d85cc5e67af7314737516327b9dbdce51ccd559c8ec75f63a4731576721b3d7d9eb1cc55c9d85cc0c3a2b9e193a2fac0928378384516cab9cf294249f3bcc086a4fe99e3bac011e17cf651ce99e7ceeb0d6a8d30c8bee52a61aeab9d6413d6dfb8eccaf85edd0d89917642173b5676e10661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e6266880dc53353e7853501e56692308a6db55b9ee4770f6606b5a774fd76d602cf1a07fa38aa67b2dfce3aa34e332dba4b996aa8e73a07f5b4ed3b32bf0eb68367f6cc3666c5334be7853501e56691308a6d8d5b9e643b362ba83da56bc7d6018f8b76de513d93edd87aa34eb32cba4b996aa8e77a07f5b4ed3b32bf1eb68367f6cc3666c5335be7853501e56693308a6dad5b9e643b363ba83da56bc7d6038f8b76de513d93edd806a34eb32dba4b996aa8e70607f5b4ed3b32bf01b68367f6cc3666c53347e7853501e5e690308a6d9d5b9ee204d459a674edd806e071d1ce3baa67b21ddb68d4698e457729530df5dce8a09eb67d47e637c276c83666c53357e7853501e5e692308a6dbd5b9ee4fe3537a83da5dbbf36028f8bf6c7513d93fbd726a34e732dba4b996aa8e72607f5b4ed3b32bf09b643b6312b9e793a2fac0928378f84516c1bdcf224f7af7941ed29ddfeb509785cb43f8eea99dcbf361b759a67d15dca54433d373ba8a76ddf91f9cdb01db28d59f1ccd779614d40b9f9248c62dbe8982701759629ddfeb519785cb43f8eea99dcbfb618759a6fd15dcabc0ff5dce2a09eb67d47e6b7008f4cd7028fabb80c0c9ec0a28f4c4f93f17426e3194bc633948ce73e329e5bc8787a91f14c26e32926e379948c671019cfdd643cd793f15c45c6f32c194f57329ef1643cc3c8781e20e3b98d8ca78c8ce709329e52329ed1643c83c978fa92f1dc48c633858ca73b19cfe5643c13c9781e21e32924e379908ce77d329e13c878da90f1dc41c6730d19cf53643c9dc878aac878cac978fa91f15c4dc67333194f4f329ec7c8788ac8784690f13c44c67317194f73329eebc8789e21e3e942c6338e8ca73d194f05194f7f329e85643cb792f1f426e3799c8ca7848c671419cfc3643cf790f1dc40c6f31c194f37329e09643c9792f15492f10c20e3c923e3c927e3e940c6733b194f1f329e27c9783a92f18c21e31942c6732f19cf4d643c3dc8782691f10c27e31948c6730519cf89643c6dc978ee24e3c921e0490447be8b9780df17824dde199b0fb60f747e13d89a597cc8b3882d60cbd5795947ab305d5f70e4ba512757efc9a1af3298177f79c0f10109cf9d643c6dc9784e24e3b9828c672019cf70329e49643c3dc8786e22e3b9978c670819cf18329e8e643c4f92f1f421e3b99d8ca703194f3e194f1e19cf00329e4a329e4bc9782690f17423e3798e8ce706329e7bc8781e26e31945c65342c6f338194f6f329e5bc9781692f1f427e3a920e3694fc6338e8ca70b19cf33643cd791f13427e3b98b8ce721329e11643c45643c8f91f1f424e3b9998ce76a329e7e643ce5643c55643c9dc8789e22e3b9868ce70e329e36643c2790f1bc4fc6f320194f2119cf23643c13c9782e27e3e94ec633858ce746329ebe643c83c9784693f19492f13c41c65346c6731b19cf03643cc3c878c693f17425e379968ce72a329eebc978ee26e31944c6f328194f3119cf64329e5e643cb790f1dc47c633948c672c194f67329ea7c978aeb5f02c74c4638e9b20f30b097cabf9eea08b9a12f03b7e67fd7d478c0b0d46997f1f1891d7b5666d0c9e368666c7d2b7aabfbcab23f7c0717be17be70cdbab4d0368d6d6e0696b68762c7d2b2de4d9b6bc3388db0bbf53cbb0bdf0bd6a07ed7369c2e051538e315f06f92d8ef57154cf427ceffa9b18d7abb4da6a68b5d0d02a1fca6c06fdb63ad02f07fccaba655efc7966cf1cc5ac78a42f89ed7b00fd4818c586e3627c183f4f69c2e05153baf6f143c7fa38aa67b21ddb16d875ff1074973218abdb1cd43307fccaba657e9bc5774110af16dbeba0c5760bcff606d642fc65cabc390b991974563cf2ae81b026a05c7f1246b16d059e1df1f394260c1e35a56b1f7738d6c7513d936dc2cec0aefb0ed05dcae0feb5d3413d73c0afac5be677c276c884795b16327b9debc7ac78e41d6d614d40b901248c62db0e3cbb62e7292e4c183c6a4ad78eed72ac8f9b7aa6dab1dd815df75da0bb94c1fd6bb7837ae6805f59b7ccef86ede0993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999b59f10cd479614d40b981248c62db093c7b62e7493d77401e35a57beeb0c7b13e6eea997aeeb037b0ebbe0774973218ab7b1dd43307fccaba657e2f6c07cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccdccc8a6790ce0b6b02ca0d226114db6ee0d9173f4f69c2e05153bae70efb1cebe3a89ec9e70efb03bbeefb40772983b1badf413d73c0afac5be6f7c376d8ef993db38559f10cd679614d40b9c1248c62db0b3c0762e7493d3f451e35a56bc70e38d6c74d3d53edd8c1c0aefb01d05dca60ac1e7450cf1cf02beb96f983b01d3261de9685cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7b9e9e8ac78ca755e581350ae9c84516cfb81e7a3d8794a0a13068f9a728cf932c87fe4581f37f54c3d773814d875ff08749732b87f1d7250cf1cf02beb96f943b01d1a3bf3b62c64f6b1d130cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5cc101b8aa742e7853501e52a4818c57610783e8e9fa73461f0a829c7982f83fcc78ef57154cf64bf9dc3815df78f41772983fbd76107f5cc01bfb26e993f0cdbc1337b661bb3e2a9d479614d40b94a1246b11d029e4fe2e7294e183c6a4ad78e7de2581f47f54cb6639f0676dd3f01dda50cc6eaa70eea99037e65dd32ff296c876c63563cc3755e5813506e3809a3d80e038f83b84bf2e41b3c32ff09816f355fa5f379fa3f6eaf2a6064d85ef90da0591b83a78da1d9b1f4adea3f56e74fd0ff717b8d054686edd5a601346b6bf0b435343b96be9516e374fe44fd1fb7d7386064d85e6dddf214270c1e35a53bdff81478be133f4ff23aeed30c78be033cdf8e9fa7c8513d0bd57abf0bec71ad5769f599a1d5a78656f95006193e73a05f0ef89575cbbcf8f3cc9e398a19db42614d40b94f4818c5f66de071d16ea8ba5fa5d725eb6f11a61f9c5ce3d7c5fd35bcb7d052af5738c45f2e9439b75d0ddb4f345b1efc2edb4dd5e7906173f4ce5b91ed3eafcc8bbfbcc07eadefea1e6ad4bd8743c073c8a2d9418b66071c311e341865fe0030daeef31e74c41375df59fc619b718854337c0ff823e071755e1c1567aef7b94ccf2f3fb2f07c131f4f21c606fa7211abd8b6d5a5eeb67d27c6ba17e1332cf4e5601f481ea73ae875c9fad5b1e0bf4e76aa7929b60f729cea60d43917cafcf779356cff27cd71aa5970e47de1026d9732f2fb37da6eaea340af5be6bbebff182762f3c7c0dacf11bb1b5ab26986fbd6c7161d7b58b87b1070633c36c4b68ebaf781dbba87a1239b66b8ad3fb1e8d8d3c2dd93809b71bfee69e8c8a6d9d1f6eb7e16ee7e04dc8cfb753f434736cd8eb65ff7b770f727e066dcaffb1b3ab26976b4fd7a80857b000137e37e3dc0d0914db3a3edd7032ddc0309b819f7eb81868e6c9a1d6dbf1e64e11e44c0cdb85f0f327464d3ec68fbf5600bf760026ec6fd7a70505b4736cd8eb65f975bb8cb09b819f7eb72434736cd8eb65f5758b82b08b819f7eb0a434736cd8eb65f575ab82b09b819f7eb4a434736cd8eb65f0fb7700f27e066dcaf871b3ab26976b4fdbacac25d45c0cdb85f57193ab26976b4fd7aac857b2c0137e37e3dd6d0914db3a3edd7e32cdce308b819f7eb71868e6c9ad9f66b47fdcb32ee87fcb1537d52e3cf66f21e16f6257111538ee2a0d0515f93643fe40386561f1b5ae177fd0f827eaefa6445f51b137f9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec99f999f13d4f7cbe22e51ae21de0ba308a0d9f49b9b8cfafea7eb55e97acbf4598ee3cb5c66ffccf2d8a93cf01447f791ff36aa3ceb95066e7b9356c7d351b3e5fc4e7a2b66d7930f63ad4ed9d737c4f1f9f051dcbe79d1f59343b60d16cbf2346b3cd90f9fdc028fa1d001e57fbe34183c7f46d7b379c4db3a876d655dc47c599cd77416cbe8b87baf9164271a1fa46db71c191ed89d401f75d177198e9370170bf70f0dcbdc8d5fbffaa4efb8d3a1d32ea940f652e857aee7750cfbaee5b325d0b3caedaa3c0e0092cfac8d48c8ce769329ece643c63c9788692f15c44c6731f19cf19643cb790f11c47c6d38b8c6732194f3119cfa3643c83c878da91f1dc4dc6733219cff5643cb9643c5791f13c4bc6d3958c673c19cf30329e4bc8780e93f15c49c6f30019cf59643cb791f124c878cac8789e20e32925e3194dc633988ce77c329ebe643ca792f1dc48c6d3928c670a194f77329e89643c9793f13c42c67319194f2119cf83643ce790f1dc41c67302194f1b329e6bc8789e22e3e944c65345c6534ec67321194f3f329ed3c978ae26e3b9998ca735194f4f329ec7c8788ac8784690f13c44c6731e19cf5d643c2791f15c47c6d39c8ce719329e2e643ce3c878da93f15490f15c4cc6d39f8ce74c329e5bc9788e27e3e94dc6f338194f0919cf28329e87c9780ac878ee21e339858ce706329e16643caedf03cc94e739329e6e643c13c8782ac9782e25e31940c6733619cfed643c79643cf9643c1dc878fa90f13c49c6d3918c670c19cf10329e0bc878ee25e3398d8ce726329e56643c3dc8782691f10c27e31948c6732e19cf15643c7792f19c48c6d3968c27878027111cf92d26fcfed721b0edd779fcb66033cbfae4b9b09457c7a1db0b8e5c7733cbba0f581850a77d414d5dca74bef05f9b923aa1af3298177f79c0718084a72d19cf89643c7792f15c41c6732e19cf40329ee1643c93c8787a90f1b422e3b9898ce734329e7bc9782e20e31942c633868ca72319cf93643c7dc8783a90f1e493f1e491f1dc4ec6733619cf00329e4bc9782ac9782690f17423e3798e8ce723329e16643c3790f19c42c6730f194f0119cfc3643ca3c8784ac8781e27e3e94dc6733c19cfad643c6792f1f427e3b9988ca7828ca73d19cf38329e2e643ccf90f13427e3b98e8ce724329ebbc878ce23e379888c6704194f1119cf63643c3dc9785a93f1dc4cc6733519cfe9643cfdc8782e24e32927e3a922e3e944c6f31419cf35643c6dc8784e20e3b9838ce71c329e07c9780ac9782e23e379848ce772329e89643cddc978a690f1b424e3b9918ce754329ebe643ce793f10c26e3194dc6534ac6f304194f19194f828ce736329eb3c8781e20e3b9928ce73019cf25643cc3c878c693f17425e379968ce72a329e5c329eebc9784e26e3b99b8ca71d19cf20329e47c9788ac9782693f1f422e3398e8ce716329e33c878ee23e3b9888c672819cf58329ece643c4f93f13423e3b9d6e0c1dfd5bb58f27ed87efd3f177e9fa21baf367a5d52469e89a87b4b7b0d9baaef1e47f5dd1bd44c6530bf07ea2bec7b8167af239e7d068fe93b0ff23d40b3dd864d31ee72c4b8db6094f95dc028faed069edd8e78f6183ca6ef3cc8f704cd761a36c5b8c311e34e8351e67700a3e8b71378763ae2d965f098bef320df0f34db6ed814e336478cdb0d4699df068ca2df76e0d9ee886787c163face837c7fd0ec43c3a618b73a62fcd06094f9adc028fa7d083c1f3ae2d966f098bef3203f0034fbc0b029c62d8e183f3018657e0b308a7e1f00cf078e78b61a3ca6ef3cc80f04cd361b36c5b8c911e3668351e63701a3e8b71978363be2d962f098bef3203f0834db68d814e306478c1b0d4699df008ca2df46e0d9e8886793c163face83fc60d06cbd61538ceb1c31ae3718657e1d308a7eeb8167bd239e0d068fe93b0ff2e5a0d95ac3a618d738625c6b30cafc1a6014fdd602cf5a473ceb0c1ed3771ee42b40b3d5864d31ae72c4b8da6094f955c028faad069ed58e78d6183ca6ef3cc85782662b0d9b625ce18871a5c128f32b8051f45b093c2b1df1ac32784cdf79901f0e9a2d376c8a719923c6e506a3cc2f0346d16f39f02c77c4b3c2e0317de741be0a345b6ad814e312478c4b0d46995f028ca2df52e059ea886799c163face83fc58d06cb161538c8b1c312e3618657e11308a7e8b8167b1239e25068fe93b0ff2e340b36ac3a618df77c4586d30cafcfbc028fa55034fb5239e45068fe93b0ff27dc126bc45607b4fe78bc1b650e74bc0b640e74bc1f6aece7704db3b3adf096c6feb7c67b0bda5f35dc0f6a6ce7705db1b3adf0d6cafeb7c2fb0bda6f3bdc1f6aace9781ed159def03b6f93a7f0dd8e6e9fcb5609babf3d7816d8ece5f0fb6d93a7f03d866e9fc8d609ba9f337816d86cedf0cb6e93a7f0bd8a6e9fcad607b59e76f03db4b3a7f3bd85ed4f93bc0f682cedf09b66fe9fc5d607b5ee7ef06db549dbf076c2375fe5eb0ddaff3f781ed539d7f006cdfd6f907c1f61d9d7f086cdfd5f987c1f699ce0f01dbf7747e28d8fe4de78781edfb3aff08d87ea0f323c0f6439d7f146c3fd2f95160fbb1ce8f06db4f747e0cd87eaaf3e3c1f6339d9f00b69febfc44b0fd42e72781ed973aff18d83ed7f9c960fb95ce3f0eb65febfc1360fb8dce3f09b6dfeafc5360fb42e79f06dbef74fe19b07da9f3cf82ed2b9d7f0e6cbfd7f92960fb83ce4bbba6dad93fea7c41106f3bfb75503315806ff1a7cafc49e75b196564d95c2853aa3fe8a39e71a86f994a3b2cedb2b2493bfc1ed8a41d5e0836698717804ddae177c126edf03b609376f86db0493bfc16d8a41d7e136cd20ebf013669875f079bb4c3af81ad4ce75f059bb4c3af804ddae1f9609376781ed8a41d9e0b366987e7804ddae1d96093767816d8a41d9e0936698767804ddae1e9609376781ad8a41d7e196cd20ebf043669875f049bb4c32f804ddae16f814ddae1e7c126edf054b0c9fef235d8a46d1e0936699bef079bb4cd9f824ddae66f834ddae6ef804ddae6ef824ddae6cfc0266df3f7c0266df3bf814ddae6ef834ddae61f804ddae61f824ddae61f816db4ceff186cd236ff046cd236ff146cd236ff0c6cd236ff1c6cd236ff026cd236ff126cd2367f0e36699b7f0536699b7f0d36699b7f0336699b7f0b36699bbf009bb4cdbf039bb4cd5f824ddae6afc03645e7a5ad6e0d367956aca6c27f71c271789a812f612a0be26dfb712a83fc73507799a693f18c25e3799d8ce722329e95643c2bc878ce20e3f9808c670b19cf71643cfbc978f691f1cc21e379878c6710194f3b329e93c97872c978ae22e3a926e379958ce712329ec3643c5792f19c45c6b3998c671319cf72329e65643c09329ebd643c7bc878de27e39945c6f31619cf60329ef3c9784e25e36949c6d39d8ce772329ef9643c9791f12c25e35942c65348c6730e19cf46329e0d643c0bc9784e20e36943c6b39b8c671719cf0c329eafc978aac878de20e32927e3b9908ca71f19cfe9643c5793f1b426e3e949c633978c673119cf22329e77c978ce23e3594fc6b38e8ce724329e9d643c3bc8789a93f14c23e31947c6f31a194f7b329e0a329e8bc978fa93f19c49c6733c19cf54329ed9643c6f93f1fc9e8ca7808c672d19cf1a329e53c878b693f16c23e36941c6f31119cf2b643c95643cef91f10c20e3399b8c278f8c279f8ca70319cf48329e99643c6f92f15c40c6b39a8c671519cf69643c1f92f16c25e369a5ffb3f0f420e39947c6339c8c670119cf40329e73c978ae20e339918ca72d194f0e014f023802b0c9efcdc1f695ce1f069b7cafe723b07da9f3d560fb9dce4f01db33165b330b9f307c053679d7fa59b0c9fd992fc126ef70fc0e6c725c14ff6abe6fc191fccd6019f1d3dcc28ffe7e67e1923c6e6f59a62c88777ba3afb2e0c8ef29e501c7b3243c6dc9784e24e3b9828ce75c329e81643c0bc8788693f1cc23e3e941c6d38a8c672b19cf87643ca791f1ac22e3594dc6730119cf9b643c33c9784692f17420e3c927e3c923e3399b8c670019cf7b643c95643caf90f17c44c6d3828c671b19cf76329e53c878d690f1ac25e32920e3f93d19cfdb643cb3c978a692f11c4fc67326194f7f329e8bc9782ac878da93f1bc46c6338e8c671a194f73329e1d643c3bc9784e22e35947c6b39e8ce73c329e77c9781691f12c26e3994bc6d3938ca73519cfd5643ca793f1f423e3b9908ca79c8ce70d329e2a329eafc9786690f1ec22e3d94dc6d3868ce704329e85643c1bc8783692f19c43c65348c6b3848c672919cf65643cf3c9782e27e3e94ec6d3928ce754329ef3c9780693f1bc45c6338b8ce77d329e3d643c7bc97812643ccbc8789693f16c22e3d94cc6731619cf95643c87c9782e21e379958ca79a8ce72a329e5c329e93c978da91f10c22e379878c670e19cf3e329efd643cc791f16c21e3f9808ce70c329e15643c2bc9782e22e3799d8c672c19cf74329e66169ec38e78e45829eb96f9c304bed57bb8722f7ebffe9f80df71fce66a478c870d4699af0646b1ed039eee8e78f6183c7b2c5a1c2bdf4a0bf9f6c75efd3f01bfe3f70a5dc554778351e66d31b507787a38e2d965f0ecb26871ac7c2b2da4efa3f42149c0ef381e9eab98ea6130cabc2da6703cd79e8e7876183c3b2c5a1c2bdf4a0be96b287df813f03b8e7fe92aa67a1a8c326f8b291cafab9f239e6d06cf368b16c7cab7d242de3d93779613f03b8e27e42aa6fa198c326f8b291c1fa2bf239ead06cf568b16c7cab7d242be2521df444ac0eff87d7f5731d5df6094795b4ce1f7910738e2d962f06cb16871ac7c2b2de45b7572cd9e80dff1fbb6ae626a80c128f3b698da023c031df16c32783659b43856be951683745e9ec125e0f741c0e82aa6061a8c326f8ba94dc033c811cf06836783458b63e55b693158e7a54f66027e1f0c8cae626a90c128f3b698da003c831df1ac3378d659b43856be9516e53a2fef0c26e0f77260741553830d4699b7c5148ebf5bee88678dc1b3c6a2c5b1f2adb49077efd7eaff09f81dc7e31cec88b1dc6094f9c1c028361cefadc211cf2a836795458b63e55b6921dfd2926f3026e0771c1fcb554c55188c326f8b291cefa4d211cf0a836785458b63e55b69315ce757eaff09f87d3830ba8aa94a8351e66d31b502785638e25966f02c23f2adb49077e1a40f5b027eaf02c6958e18a3626a25308a6d19f02c73c4b3c4e05942e45b6921cf72e49d8b04fc3e1618973b628c8aa9e5c028b625c033d611cf22836791458b63e55b6921df8e59acff27e0771caf7d8923c6b106a3cc2f0146b12d029e458e78a2eee13584efa8fb510de13beade4a43f88eba4fd010bea3eeb13784efa8ebb786f01d752dd210bea3ee333484efa873fa86f01df57cbb217c473dab6d08df51cf1d1bfbfeed8f254deb58722cdbb5a67a2cf1ed39677b3e2e7edfc589a0f6358d9a728cf932c8e3f5cb62075a38aa67215e137e13e37a6dd7f08b0cadf2a10c5ea3babafe1b67f0c8bcf8cb46668c8b9cf87c1726c087bca3ac6c72afe53db0c93d8e8560937b200bc026f7d0de059bdccf7a076c72bfeb6db00dd7f99160937b97d81f49ee6dee005bb9ce633f98c13abf0d6cf29c08fb5fc8b3bead6093e7b5f8dc5f9eb96f019bf49bc0e7cdd2f76513d8a4ff123ee7943e681bc026fd08f1f95ab5ceaf039b8c2981cf75bed4f93560fb4ae7f179828cd5b90a6c4febfc54b07da1f35f83ed299d5f04b6dfea3cdef37952e7c782ed373aff16d87eadf36f82ed099d7f036c8febfc7eb0fd4ae7f7816db2ce63ffd0cf757e0fd81ed379ec97f84b9ddf05b65fe8fceb609ba4f3af816da2cebf0ab69febfc2b609ba0f3f3c1f6339d9f07b6f13a3f176c3fd5f93960fb89cecf06db189d9f05b61febfc4cb08dd6f919601ba5f3d3c1f6239d9f06b64775fef760fba1ce8f035b339d5f0236f97e32ded395771697814dc629c17bf5f2ad922ab0c9f87b2bc0d65ae7f1b98cbc97341c6cf26dfb4ab0c9fbff1560933192cac126e3380d069b7c0b6c10d8e47b6503c12663960e009b8cabda1f6cf2ede27e6093f7297b824dc608e90136f98e4a77b0c9d8773826b07cefb21a6cf24e108e132cdfddff126cf26ef9576093f19b704c60f9c6d5d360937149bf00db793aff14d8e47dcddf82ad40e79f04dbf93aff1bb05da0f3bf069b7cbff209b0c93b358f834dbea3ff2bb0c9bbd993c176a9ce7f0eb6cb74fe31b0c977887e0936192bf617606baff393c026efcc4f04db553aff73b0c9586713c026df57fd19d8e41b5fe3c156a4f33f055bb1ceff046c253a3f066ca53aff63b075d4f9d160eba4f3a3c0d659e77f04b62e3aff28d8baeabcb4336a7f56fbf9213d5f16c4775ea6fc7d1cd49ed25d1b0803f2c479ae9d0f3ce8eb60ec752f4e9ed7cb7edf4caf5762e820f8de1fbbefd435c501bdae167abdfb0ddfb950e653dd88a8e5f6c2ef655007590eafb165ddb2ccd5b0ec3e63dd6d747d0f38aaef7e8349b80f009394f9ecdc9ab24fe9c6b2352c13235bf2fa58622d000d712a83bc30b8d1aab810cf7bebc2730078e2df4f52d7eb2e6202f7adb8afd7cd7b4c66ace54399fda0df3e07fae1be2eeb9679f1e7993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999f59f1c8f3047cae2ce50e91308aed20f01c889fa7109fc3cafad5739d87e0b9cec1d8fdd67ebed752afb7d0a8732e94597d5e0ddb109dcf83df65bb456dcbfdb1d721fdb6147f79509f03c0e3605b26790e1a3ca6ef3c8b3e4ab37d16cdf63a6234db0c99df0b8cfb757e1ff0b8da1ff71b3ca66f6c330e906a16d5cebae897902ece6c7d100a62f35d3cd4d5735dd5674af5e5308f5f870c4db10f84d8f039781e2cf389fe9f007d3e017d8e651b60f64bc076ea6360dc1f3b6371ad67c0d2f65f6d688a7d205ed4da4a1f88f8db81e24297c708d947cdbe1558572933038e73b3741efb011d8275bd6bf95da61c63be0cf2d8a6ee8ebfcec9ed2bfd5765fbeeb6f8de09ac31f9aef52e478e4ee247ecb9907fe7bc9ab2524ef410ad851dc7ad427673b98f8de5f2a1cc1e4bfdcb8278ebbfdbe0d96d30abd8990b71f62e9cebb96a93f644687435682465f09cd7419f226b1b291ce24f9591eddfca2883e7a7526609b451aa2ed2ce4b3db11f131e035c9d2f1c32ea27f378be603ba731eba8e2e3ce536b785d5f0b340bec5ab3f4f5db02ed45dc7dfdb6400cd9ce4b65fd85b07ee16a15441f5ba4cc36e338eae27a12b7a5a9e701609232bba01dfa1ff5b8ae3b56d7e851d7757b1cf0e0b5864ce98eef788c71d1be38aa67a1edd8b5cfa8533e94b914eae9e03c26ed3ba9bbc1b78b6d8e5ac839d47e438b5c28f33da3ed88d251d681f701dcd6a5d87a3e5868a98b94f9b1d14eed72c0e472bbe179965aef414b5da5cc2fa0fdfb1ccee7f7ebdfb12dfd8be57799d2b507f84df9edf1d739b97de5fd46d9bedb2dbe3f04d6987cd7fa26859cef8b1fb1e742fecf70fc9672a287682dec6a1f91f73b91dd5c6ebfb15c3e94d961a97f59106ffdb71b3cdb0d66153bbf8138fb0b9cefbb6a3777446854081a49197c5660de6fc17b2778dc6fa8eb0299ff0818c5b61bf4fd1f4eef97a7d83e32d8ccfbe5b6f3c142831fcf07ff17b4b3094b59f7cf0152e736582fa94760d43530eaeae8fcb534c7d0b30cfc7400fb7e9d179de5373cc7953239ed52ffddddbfaa7d1f5bb8a51ef8bc6eafc1bdcfd015ef45b5046e15f7e6b5059ea73bbea62dc57331f37c08afc3a44c1eb0dbcee30e5bea621ea79b05475e0b7e6394c5ebec74cb99f98f8c65f09ec1410b93aded8bedbd9ca2c24293dfd6ee1d32986dbaca7e803127eb32f7153c1f923267c3764b58caaa36e9bf4eaed147b623de6bb7dd677175bc88bacf22fe14a3ed9d4917cf309ae2bb69ad635b6fd772db7336f6fe0cad8d7c3cbe8b2bf058914e8bbd161e57f734a3b4d86bf11d9f169d86dada399b167b2c3caeae31a3b4d863f11da31695b67b0b362d765b785c5d6b4469b1dbe23b3e2d3ad7baaf914e8b5d169ef8ef69a4d7029f8965c2bc8780b9b5918fc77769b9edd99d4d8b9d161e57cfeea2b4d869f11d9f16459d6cd7ec362d7658787634b0163b2cbee3d3a24b57db3d159b16db2d3c0eeeafa5d562bbc5778c71310cefafa5d3629b85675b036bb1cde23bc6f3c34ee9ee19a2161f5a785cddfb8bd2e2438bef18b518a27c6fad83165b2d3c5b1b588bad16dff16951de51f9fea00e5a7c60e1f9a081b5f8c0e23b3e2d867451beb7d4418b2d169e2d0dacc5168bef18afa19271b1b90e5a6cb6f06c6e602d365b7cc7a74545f25c6b531db4d864e1d9d4c05a6cb2f88e4f8bc2e43175631db4d868e1d9d8c05a6cb4f88e312e92d7931beaa0c5060bcf8606d66283c5778cc791645cacaf8316eb2d3ceb1b588bf516dff1695199bcffb4ae0e5aacb3f0ac6b602dd6597cc778cf2519176beba0c55a0bcfda06d662adc5777c5a94248fa96beaa0c51a0bcf9a06d6628dc5777c5a0c4b3e135b5d072d565b785637b016ab2dbe633cef4cb617abeaa0c52a0bcfaa06d66295c5778ce79dc9fb172beba0c54a0bcfca06d662a5c5778c6d67f2bc73451db45861e1713546649416b6f129633cef4c6ab1bc0e5a2cb7f0b81adb304a8be516df319e77268f23cbeaa0c5320b8fabb128a3b4b08d8319635c24dbcea575d062a9856769036bb1d4e23bc6fb5ac9b673491db45862e17135364794164b2cbe63bc1e49dee35b5c072d165b781637b0168b2dbe637c56943c075f54072d1659781635b0168bc0f781d87da7fa738b0fe98b7595a1452e94f98ed1172b4a475907be438b75a98ebd2ea97e65ef47d4a51aea22657e60f4e57bdf0193a3ba2663e63dbd2ee99bfeb1a5ae52e6a7ed6acafe5ce713b04d0ec3bafe68f95da61c63be0cf2a29faaf382f8eb9c8c55190748b6ef028bef77803526df45e83b4727f123f65cc87fddaea6ac94133d446b6157fbc8429d477673b945c672f95066a1a5fe6541bcf55f60f02c309893ef3d409c491cb969bb524c0b2334ba0a349232d867efb0239e8f0d1ee1107f39c191efa24a195916df45fdbbd16f57fa414a3da3fa48bee7a87e517d24c55fd4bba8661d557cfc00fa7ecab820326688b2c9182025b09ece864dd5b58ba3ba8a2f59b7cc7701461993a473c33316d795b193c1a878ba39d00cc7599129ddf1a21bf07475c0e3a89ec9e35077a34e5d8c3ae543197cb7b1bb837ae6805f59b7cc7707df2eb6396a21c7e4cb0d2d72a14c5e41eabf9c3f46e928eb50f1dbd95217573a7632783a597cf772aca3ac5bdac45e0de0bb87e1bba3e15beddb18636a4ab76ff700e69e0e98d57a7bc7bfde423c679478163f1da14e7d4083b8ea84eb9273cc3e86b6b990bfb0a0a6ac9493b272ec1476b51fc9b6447673b96ec672f950a697a5fe6541bcf5ef6df0f43698d579c31905351c0ef687640cf4323864be2368d73b42bb5ea09d94c1636f2747daf5347864be13f0c8f95577b0c9798af027e0f79206e036dbbdee166eb1e178849d2c8c1de3672c4e775ce8088c62eb093c3d1c69666eebcb0d7df09ca095514696cd85325d0a52ffe55d2db3acdaefcecfa9a957736d8fedbd35dda6b774a0178e071a803e81a1a14cc2d03aa81933344e9ee3839a3141274cac1a3fe49161f70c4b3df614b45c0313ffe758aad10c6c986f6eb10541eda14f73c126439fb6005b3343161c7255cacbd0892ee4423d64ddb906676b6089d3370e1b2b53bad069053c2e4259858e0c1dab43e7fef123260ec3f8686170d62776d46fcdd3948b5a97c441ae83ba2393ac5be6c59fd2275fe7c70e193ab2cff847268d1e3666e2048435772ecce7182298ff6dcb6090e0ce24eb696188737cfce294e218c5265f00fe641286d641cd38c631f2240355c61a1e3a64d4a8bb26958f1a31f4864963864e1c513506156d6d2817a5b6fcde126cb6a60ecbaa09775f5cb695c5669b7054e7d6609316fc38b009cff1606b0e79296f6e1927fbc8a5b07e096bf59b12a785ae78aba02604e4b0a4da17b50fa9cfa8aad30135b4b41a4a5a6d4e75c74e0d0dadbe22a7867e56433daba19dd550ce6ae8663554b31a9af9dc2035f4b2ba7b5910a48652be20480d957c51901a0af912e0fb0e305f16a44e3fd450c6ed83d450c5eaf6a17a7d5c7d6a4dbddfae4e63d5e5b13af553973aea344c9d7ea9d36c750b41dd4e52a736eab4519d12a9d318755ade5b6bdd274cd784e9da305d17a6ebc37443986e0cd34d61ba394cb784e9d630dd16a6dbc3744798ee0cd35d61ba3b4cf784a96f98ee0d52c369df17a6fb83d470db0f04a9a1b81f0c52c3743f14a486f07e38480def3d24480dfd3d34480d0b3e2c480d19fe48901a4e7c44901aaa7864901ada7874901a1e590d533e36480d89ae865a56c332ab219cd5d0ce6a6868358cb41a725a0d45ad86b27e2a480d91fd4c989e0d5243684f09d3d4303d1fa66f85e98530bd18a697c2f472901a965d0dd7ae86719f19a4867d9f1da4868957c3c7ab61e5d570f36a187a353cbd1ab65e0d67ff4698de0cd35b617a3b483d16508f43d46302750b5edd22568f69aa83d4edebc541ea31b37aecaeba21a86e19aa9bcaca20d58d4975eb52dddc54b73fd50d52750b55dd6455b761d58d5a752b57ddecd56b07ea350cf55a8a7a4d47bdb6a45ee352afb5a9d7fcd4ab9aead547f52aaf7ab5797f90ba357d30483dae54b7abd56d69758b5edd42ff344cdf0e5231f9dd307d16a6ef85e9dfc2f4fd30fd20480d19ad869756c353aba1acd510d76a386c3574b61a7a5b0dc9fd79901aea5b0d15fe9b2035dcf81761fa5d901af2fcab2035dcfd1fc2f47598fe18a63f85e9cf61fa4b98fe1aa67f0fd37f84e96f61fa7b98fe334cff086a8635c786a440b73ee7ebf92113270e1b3d7662c1c4aa82d193464d1c3176d4130593474c1c5e50f5d8b0f195a3aa26e3c2bfd50bcb98ec7dc68f1ff244c1883115c31e2fa89a34b1a0aab2a0bc6ad2988a5a07d2ffab173ae7488f432a2aa29de535ff17484f6c5e3fa7edf47232dafdcde9eb7641f37a0872597d16baad9e15ba571fc1e492af6fea7cb060c2a8aa8905850563c2bfe181b76af2b08a0e05f8db8450e409130b264c1c327e6241e5f8aad105451d70bd85c7d7a312f38f7703537266fdc4f9e4dcd4ff7a85d80be7d54381c5e7d58f74f379ff02e987f574fa597d6af8a3fa2cf45ff5240cda45ca326152f9c4f143864e8c5eb8c5bfb270a25d3daa7956bbfa55f3dbf571f6fdfa2cf4b77a12260aeae1ac7341dd9d05ff1f1bdedcb8b00206009b2d6c6f000000275d1f8b08000000000000ffed9d67701cc7b1c7f700100cc72308e64c28514c000f8744800994c41c642a8b4a0449502245121409e51c6ccb966dd9720eb264cb414e720e72ce39e724dbb225dbb265ebcb73bdf7ea55a9deccdeb4f1c76876853b6f83b3b8deaae6cd36e6b67fdddb33bb3733bb7c2608824c50dcaa959c143c77a3bf779bcffc7fb6352778ac3c276726259c5529e1ac4e09674d4a3847a584b336259ca353c23926259c6313e4d46c55c1e02d69de710c714d9a319bb2988e4f414c73298be98414c4b42e48471f3531259cf529e19c9412cec929e19c9212cea929e19c9612cee929e19c9112ce9929e19c9512ced929e19c9312ceb929e19c9712cef929e16c4809e70929e13c31259c27a584f3e494709e9220e712e05c603e4f359f0bcde722f3b9d87cd277969acf46e3638dd96f52b24cb32969b6fe5650d2a2a455499bf5b776251d4a962be9347f6b307feb52b242c94a25ab94ac56b2c6c461ad92d3949caee40c25eb94ac57b241c946259b946c56b245c95625db946c5772a6921728d9a1e42c25672b3947c9b94ace5372be920b945c68b1ec547291928b955ca2e452259729d9a5a447c96e257b94ec55d2ab649f92cb955ca164bf92034aae547250c921258795f42939a2e42a2547951c53d2afe46a25d728b956c9754aaeb7627683921b95dca4e4668bf31625b72ab94dc9ed4aee5072a792bb94bc50c98b94bc58c9dd4a5ea2e4a54aee51f232252f57f20a25f72a79a5925729b94fc9ab95bc46c96b95bc4ec9eb95bc41c91b95bc49c99b95bc45c9fd86851ac25b953ca0e441256f53f276250f29798792772a799792772b7958c97b94bc57c9fb94bc5fc907943ca2e4834a3ea4e4c34a3ea2e4a34a3ea6e4e34a3ea1e4934a3ea5e451259f56f219259f55f239259f57f205255f54f225255f56f215255f55f235255f57f20d25df54f22d25df56f21d25df55f23d2be6df57f203253f54f223a3fbb1f9fc89a94be3623f55f23353feb9f9fc85f9fca5f9fc95f59d5f2bf98da5fbad92c72cddef94fcde94ff603e1f379f7f349f7f329f4f98cf27cde79fcde75fcce75fcde753e6f36fe6f3efe6f369f3f90ff3f94ff3f98c92dba714cb638281ad3b48a88f6add97d7732a14fc05c1e04dc7a2dafc8d3e1b8cbec6ecd327c56e94d91f65e96bcd7ead759c31667f8ca5af37fbf5967eb2d99f6ce9a79afda9967ebad99f6ee94f36fb27833e1bc098abd16b5db551654047f95a05ba5146570dba5a3a1ce8461bdd28d0d1f9ad05dd58a31b0dba714637067459a31b4bb15432dee8ba83a47225dfa38f9b4bfab8661e6a42f2bc7bf471eb98782726cfdbab8f5bcfc0abf3639239d644c89bc946570f3ad3dd04934037d5e826836e9ad14d01dd74a39b0aba1946370d74338d6e3ae86619dd0cd0cd36ba99a09b6374b34037d7e866836e9ed1cd01dd7ca39b0bba06a39b07ba138c6e3ee84e34ba06d0d11a97134077b2d19d08ba538cee24d0515f7b32e8e8def014a3d3fdc4980c7cc7e8a98f0abf43fd33e81652df0cba45d42f836e31f5c9a05b02b649b714fa15d2351a1df551fa6f5da6dc1d24d5260a619b5891f471d591f57157257fdc70de6e753010d76eb0b30262b5c694135c1bd48cb63346c80ee96ba0bc09ea523d8a075d67885d5f4f569af29a98ef7559dfcb419d950effbb8364fd5f65f1acb2984781ff3c39db52909c1df25672ce9e0f75eddca37b9e9198b35b81832167db256787bc959cb3bd50d7ce3dbaef1d8939bb13381872b68727670b79c9d9e2185910b8738f7efb8cc49cbd023892cfd936c9d9a16f25e7eced50d7ce3dfafd3b1273f61ae0483e673b7ae4de60c85bc9397b2fd4b5738fc6624662cede051c0c39db2bfdec90b79273f67ea86be71e8d0b8ec49cbd0f3892cfd94ea69c6d919c0d8af39d41e0ce3d1aa31e8939fb2070249fb37b647c76e85bc939fb28d4b5738fe64b4662ce3e62ca7a9ee1c7669e610ee87e6274738137f9dcdedbca94db05c9ede23a902070e728cddd8dc4dcfebc29eb3cfe39ac3d20dd2f8cee04d0fdd2e84e04ddaf8cee24f08ba10df4481b18f256721bf80dd4b57399e69147621bf8217030e4ec1ec9d9216f25e7ec5350d7ce3d5ad3301273f677c0c190b3bd92b343de4aced9ff86ba76ee2d34e59198b3b4ae54df2ffcc1dc2f2c06dde346b704747f34baa5a0fb93d13582ee09a36b02dd9346b70c747f36ba3ce8fe6274cda0fbabd11540f794d1b580ee6f46d70ababf1b5d1be89e36ba76d0fdc3e83a40f74fa35b0eba678caed3e8f47c17adbdfab6d1e9734bf1e80e923bb7e17aab60f096b1f6bba1dcc8cb93cf05839f45205bcb92b7d5a27d6f0a86eefb32e0c933f89e051b43e1c9034f73f23ce1bad342f2c70dcf719315d32cd86a02bf5a18fcca802d3a36ed93bd1ce8b02f697130b626cf58c8802d3a36edb70223e9b06fa36b0cb51fdd373764067819da52787d467bddc041f66aa0cedc2903754f366ce3e1efd4078c8732f6fdcd968e2957c35c215b746cda2f0023f9d83cfc8c85a132e62d46ae7e2303b6e8d8b6edf18ef8e898b53a62d6c6c4d86a31d27e1b3052fc5a879fb1305446bb5f60ea939a87da27515c9a873f66433aaf39d0e1fd5f9b83b13d79c6f0bcb6598cb4df0e8ca46b011eaeeb61547bf5c536c77d08e6335db3e8fa43f66aa04e47f540ddad703d65e8430ba5de9b629f9efc792ae4f17a36141ee673d7cc948f79ec3b9f0d92cd35bbcd375bb1c2368f7d39573f19d597933d61166661166661166661166661166661166661166661166661166661166661f69f396a5eceb59ee1783292ae003c1ce3fce13baaccb1700ee83198d7497edea290c7b97a5ac7b8c8f2b906eafc5f6680ed71c73a099c3b5f66e998d62985e712d72975c33ed9c3751bb86e8a61ed49c8b3d4e2b16d8f77c4c7c775243eadd1885aa7e553cc72a0c3f5704d4c3c5179d6e4b0dd9098edc21e9eb653c8ebf701e977ea517f62b7115cfbb6c4d2e93ea9ab7ac06f8e1c2875de19af1b544e721e17f30d6d25bfdea630687d425530f85a81f7140c6b5406cd57d3da8876cb760dd4195b15fcfbdc2c87bf7707cf5d23a4eb7458c7a6ef2c82ef7658c7aee3f337b63f6c076e2ad75abe350237d5995035e0e3e74c99e97ea680eb6703e00d2c9f68c3f519c9dfef15d78bb494c0d3063c1c6bd798ee6bf3988f49af17e9b062e5ba5fa63aed10bf0e86f8c5ad59237bc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc2ec3f33beff8258f119e982278cc3b4c6269ccfa07719e1bcd803550376b9e70069ce69b1e5333ea3fc74d500db43a68cef08703def8ee7926b6e2dea5c92bdf1c1739fd3673a97437ef7439b23661d8e982d6762b4fb0cda5f0e8c14bf0ee0e16a8fed168f6d1bfb8c364f6316d5cf72ad5f89ca33d73a8586c46c17d78b70ccebd27a11fbfa55b0628aeb244887f3e0f86e159fdfff62af5dc07e0ad76825df6f1606cd01db6b05c91eae93f886892dad9348be1f28e439af11d446694d488bc357aaf35db8ce7ddf9471ad50018ef598e3efb4c5ad49c03e35f17770e68b73fcf4ee4a3abf5d0edb2b813521dbcd683b6384ec90be06cabfad1aa84bf5281e146b62d76d84de6588ecf6f79aadefe5a04ea7c3ffee2059ffbb2c9e2e8b59e7ce8f20cf1e837b3dae3ea93322468b20465407ef79b9ae5ff69a6d7bad32f6a3a3ad3af4dd1aa8f324f451a5bc2b8aeb7e21ea1a80f70bf67561286bc72b7d3de0bfa0bf487a3de0bf20875cf7a574fcc5707ce21a1d445f5ba8ceff5ad75186f57a437aef95ebb71ff1e27a43aaf32cf45579b32e37ea778ceb390baedf0d51cf7d903dbca72ac577ec1792be36623e220be6f2bfafd126d6948f1d11dccb1cdfcd467c976245ebcbf177b21d3f1d874ef84e77227128f6375d962fd4a63ac117aa530fbef0dc3315ef3f93f775f0fd10f541ad0e5fa9ce347817dc0c53cec279c2bef254c7df698bbbffa4f8699f87fb9dea68db8777aa2fa81ea86bbf1b9d625dea3bd5dbadeff9f84ef5d99067a7c2b3165c7df5ca88182d8618511d7cd6d1fefd1f758d399eef25b5fb4dbc4e0e279b3d7eebba3fa13a780f4d75daa09fcd3aeadae3d2740d49727d3a3e0fb414ece2f3404b99e2990b06c733677170daaeb36cd70da3ed7acb76fd30da96984bcc7d8a39c3ff3d51f6ff8581ff6745550a18ab53c0589302c6512960ac4d01e3e814308e4901e3d814308e4b016316188fe7b59d213e05cffebfa7d87b0db4cdf03e8730168dc1d063d1c4cb137bef83b619dea152f2ff37c0fc7f613597fb7f61e5e07b9352c03839058c5352c03835058cd352c0383d058c3352c03833058cb352c0383b058c7352c03837058cf352c0383f058c0d29603c21058c27a680f1a414309e9c02c65352c0b8401813615cc2cb58f0edff71ce0683d79a3d1f0ff3bb47c37728bade73caf17fe396ea3bf37b879bcb7d4f1faeb1e0fdbf1effb3770972aca128f55d8271ff3f361363a15c46aeb5e4b88e7a283cf81caaebf91606c642b98c5ccfa0e0339143e171fd5fbdbccf041563560e23d79ab152d734e2b382ed8e98313016ca65e47aee009f891c0a8febd9c5665ec642b98c5ceb73b36063283c9d10b3e58e98313016ca65647abe2c8c5967093cf81c56a723660c8c85721935cf0aa6987595c0b30262d6e588994f8cc893f43bd1bb1cb6389edb2bd5776240c6b129601c9702465c27c1d17fc5ad93e8e28d4fa1dcf8709dafb87512689be139913016f85cc0f3c562152f4fec3a09b4bd9a2916f8dcc6f3c56235f0703c4792051b43e121861c7c6f520a1827a780714a0a18a7a680715a0a18a7a78071460a1867a68071560a1867a780714e0a18e7a680715e0a18e7a780117fab32dc2bc6fe7e593dc26d47fd5619e9b6a37e978c74db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e4b94fb6d330c62f8c238f11791a92e3c9a3ef68abdb03dfbb1d3c1926dfd1d65a0f7c2786b431ae4901e38a14304a1c8b6b10cb61d43ca731f1ac2d81e734e0399d89e7b412784e079e3392e70973eaf41278882107df5b9102c635296094384a1c7d629438564e1c8551188551188f07631afa70614c453e16ca65d43ceb92e709637646093ceb2066f4bd665ec642b98c9a677df23c61ccd695c0b31e62b6ce113306c642b98c9a6743f23c61ccd697c0b30162b6de113306c642b98c9a6763f23c61cc3694c0b31162b6c1113306c642b98c9a6753f23c61cc3696c0b30962b6d1113306c642b98c9a6773f23c61cc3695c0b31962b6c9113306c642b98c9a674bf23c61cc3697c0b30562b6d9113306c642b98c9a676bf23c61ccb694c0b31562b6c5113306c642b98c9a675bf23c61ccb696c0b30d62b6d511335f1957a480714d0a1899e358289751f36c67e2d95602cf76e0399389677b093c6702cf0b92e70973eacc1278882107df5b9102c635296094384a1c7d629438564e1c85511885b134c6ee1430cab916465f19197e5fc53e4373e608b75d67d9aeab10db51cfd08c74db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e47925d8963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e47925d8963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9efb647b47f2b60ba53ec3ba0378389ea965f233af8f7b9639d6b309c64fc7ea6c2b56675ab1ca419db3207e6733c42f0376e9d8b44ff64a653ed5036626db8509ea1863c17fb2b1c68a87b67f0e93ef517dfd3923dc76545f3fd26d47f5f523ddb6e4b9e47925d8963c973caf04db92e792e7bed8c6f2a860e0be9ddeafa48f712efc3d63b1eaad06eaac1a5dfcac0ba40d71d8963624d78a4ab02d792e795e09b625cf25cf2bc1b6e4b99f797e5ef2b6c3b931fc7da1b7b8b9b1f380e75c865830f999d73e9d6ff9748ee5530eeae03b6bcf67f0330376e9d8b47f3e9c87b4316b9ed5a64cac59a8b7da1346d29dcbcb13b6afd5c1e02dae7d9d0f3c0ceda099c9cfb07d5d60f9b4da1177aa83b97a01839faeb643fb17c079481bb3e6596bcac49a857a6b3d6124dd79bc3c61fb5a1b0cdee2dad705c0c3d1ff30f919b6af0b2d9fd63ae24e7530572f64f0d3d57668ff42380f6963d63ca79932b166a1de699e3092ee7c5e9ed62cf84c5b5cfbba107838fa1f263fc3f6b5d3f2e93447dca90ee6ea4e063f5d6d87f677c27910666176316b1efa3fe589350bf54ef784917417b0f2b4e6b3e0336d71fdd84ee0e1e8e799e21ef66317593e9dee883bd5c15cbd88c14f57dba1fd8be03c94c2bc2685cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc12e7f29835cf19a64cac59a87786278ca4bb9097277c7ee78c60f096b1f6bba17c11f0ec64880f939fe1baf78b2d9fce70c49dea60fbba98c14f57dba1fd8be13c94c2bc2685cc12e7f29835cf3a5326d62cd45be70923e976f2f284fdd8ba60f016d78f5d0c3c1cfd3c939f613f7689e5d33a47dca90eb6af4b18fc74b51ddabf04ce83300bb38b59f3ac376562cd42bdf59e3092ee22569e42f81ce2fa60f016d78f5d023c1cfd3c53dcc37eec52cba7f58eb8531dccd54b19fc74b51ddabf14ce4329cc6b52c82c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c2b27ce9a678329136b16ea6df084917417b3f2b484f30e1b82c15bdcbcc3a5c0c3312fc314f770dee132cba70d8eb8531d6c5f9731f8e96a3bb47f199c8791cebc2685cc921bc3c32cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc5ec436e689e8da64cac59a8b7d11346d25dc2cb13bef7606330788b5bb77319f05cca101f263fc3753bbb2c9f363ae24e75b07ded62f0d3d576687f179c875dc22ccc0e66cdb3c99489350bf53679c248ba4b7979c27e6c5330788bebc776010f473fcfe467d88ff5583e6d72c49dea60aef630f8e96a3bb44ff6845998a39835cf665326d62cd4dbec0923e92ee3e509fbb1cdc1e02dae1feb019e5d0cf161f233ecc7765b3e6d76c49dea60aeee66f0d3d576687f379c0761166617b3e6d962cac49a857a5b3c6124dd2e5e9e42167ca62dae1fdb0d3c1cfd3c939f613fb6c7f2698b23ee540773750f839faeb643fb7be03ca48d59f36c356562cd42bdad9e3092ae8797276c5f5b83c15b5cfbda033c1cfd0f939f61fbda6bf9b4d51177aa83b9ba97c14f57dba1fdbd701ed2c6ac79b69932b166a1de364f1849b79b97276c5fdb82c15b5cfbda0b3c1cfd0f939f61fbeab57cdae6883bd5c15ced65f0d3d57668bf17ce43da9835cf765326d62cd4dbee0923e9b09fa2ad0a18b7333106166360c50779e679c6b3c3339e199ef14cf28c67ac673c8b3ce3a9f68c67b9673c6d9ef1143ce399ef19cf4ccf78267bc633ce339ea59ef1d478c6b3c0339ec59ef1ccf28c678a673c59cf781a3de319e5194f97673c9d9ef12cf48ca7dd339e16cf789679c633db339ea99ef12cf18c67bc673c39cf789a3ce3a9f58c67a5673c733ce399e619cf04cf78ea3ce319ed19cf2acf783a3ce369f58c27ef19cf5ccf78a67bc633d1339e7acf78c678c693f180271b3c771d4316febe037455d677f5f565f79481bfd3bc71157c679f29573b8edd0b3a9a67dee7f82ec6896b2e1c6d75c33ed91b0f1cfb3ce119e3194fbd673c133de399ee19cf5ccf78f29ef1b47ac6d3e119cf2acf78467bc653e719cf04cf78a679c633c7339e959ef1d47ac6d3e4194fce339ef19ef12cf18c67aa673cb33de359e6194f8b673ced9ef12cf48ca7d3339e2ecf784679c6d3e8194fd6339e299ef1ccf28c67b1673c0b3ce3a9f18c67a9673ce33ce399ec19cf4ccf78e67bc653f08ca7cd339ee59ef1547bc6b3c8339eb19ef14cf28c6786673c3b3ce399e7194f95836707134fd4b3cd3b3cb1cd701ef2fab89733f974853956ad392ef193bd1aa873921978d4f31ff85de2b2e7ffb1ed5c0131e27aaf44cee2a1fdbd23dc769d65bbae426cd75bb6eb2bc4b6e4b9e47925d8963c973caf04db92e792e73eda7e3639db6df27ea9a1f3c8fb9ce279e47d4ef13cf23ea7781e799f533c8fbccf299e47dee714cf23ef738ae759e0198fbccf299e47dee714cfd3e819cf28cf78e47d4ef13c0b3de391f739c5f3c8fb9ce279e47d4ef13ce33de391f739c5f3d47ac6e3dbfb9c7c7b1fbcbc5f2a9e6782673cf27ea9781e79bf543c8fbc5f2a9e47de2f15cf23ef978ae719e3194fc6039ee77bbf14be17ea0a53de0b3a5a5f1af71eaa2c1ce70ad0d1782e1d435faf0e4d792e43157c67bf83eb72873db2b3dff1dde1883bdaea867db287efabdaef09cf18cf78ea3de399e819cf74cf78e67ac693f78ca7d5339e0ecf785679c633da339e3acf782678c633cd339e399ef1ecf08c67a5673cb59ef13479c693f38c67bc673c4b3ce399ea19cf6ccf789679c6d3e2194fbb673c0b3de3e9f48ca7cb339e519ef1347ac693f58c678a673cb33ce359ec19cf02cf786a3ce359ea19cf38cf78267bc633d3339ef99ef1143ce369f38c67b9673cd59ef12cf28c67ac673c933ce399e119cf3ccf78aa1c3c5cef8c8a7abe7e38de57f57cb6f5fe52888bdeb2f0f7e1788e6b87c548fbb8ee0179896729134fd47b01967a605bfb4fbf452798cf2cfc1d9fc3e1caa9a51623edbb720ad7353632f144bdcfa0d103db3a164da64c6b00b2f0f72660e4caa9468b91f65d3955cfcbd39a059f698b5b6b846d8ee31c32f999c7f697e03b34f23a56dbad583559b1ca419de158971ed51f903d6116e62866cd437329c48ad7b3e178ce6c288caeeb2b034fd83f2e0b066f71fde376e0e1b87e30f919f663072c9f9639e24e7530570f30f8e96a3bb47fc061bb21483616570e2116573a78ae1ce65890bd529977a490d987386b1e5a8b48acb8be39ef0923e996f2f284fd633e18bcc5f58f57020fc7f583c9cfb04f3868f99477c49dea60fb3ac8e0a7abedd0fe41380fa5301f4821b3c4b93c66cd437310c49a857a054f1849b79d95a790cf82cfb4c5f563078187a39f678a7bd88f1db27c2a38e24e75b07d1d62f0d3d57668ff109c0761166661166661166661166661166661166661166661166661166661166661f69b59f3d0b3b1c49a857a2d9e3092ee4a569ee2bc434b30788b9b7738043c1cf3324c710fe71d0e5b3eb538e24e7530570f33f8e96a3bb47f18ce83300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb330fbcdac79e89dedc49a857aad9e3092ee202f4ff8dc566b30788b9b77380c3c8718e2c3e46738efd067f9d4ea883bd5c15ced63f0d3d57668bf0fce83300bb38b59f3d0bbda88350bf5da3c6124dd21569ee2fc695b30788bebc7fa8087a39f678a7bd88f1db17c6a73c49dea60ae1e61f0d3d57668ff089c8752980fa49059e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296380f0fb30f71d63cf47f08126b16eab57bc248bac3ac3c2de1bc437b30788b9b7738023c1cf3324c710fe71daeb27c6a77c49dea60fbba8ac14f57dba1fdabe03c8c74e603296496dc181e66c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e62866c90d618e6296dc10e628661f7243f3749832b166a15e87278ca4ebe3e509df7bd0110cdee2d6ed5c053c4718e2c3e467b86ee7a8e5538723ee5407dbd751063f5d6d87f68fc27910666176316b9ee5a64cac59a8b7dc1346d21de1e52964c167dae2fab1a3c0c3d1cf33f919f663c72c9f963be24e7530578f31f8e96a3bb47f0cce43da98354fa729136b16ea757ac2483abc2e7732f1e42c9e9c2316c7cbb6deef32e5f1e6330b7fef0246aefeb0d362a47dcc71e4259e2e269e3a8ba7ce118be3655bfbbfd2942798cf2cfc7d253072e55497c548fbae9caa039e954c3cf5164fbd2316c7cbb68ec52a539e683eb3f0f755c0c895532b2d46da77e5543df0ac62e289ea93560d83eda8f6351cb6a37265386c4bcca363ced0eec2f18155c1e02deebe1aaf2d1c7d15939f79d7f57b95e5135ebff11ef5785d9f845998a39899ee735bb3966d8a4f60f1d076943916c3f93bbbcbf2290dbfb3e3980fa49059e25c1eb3b6dd9fbcedd6ac659be213583cb4f533c782c9cfb03fb83a70c798ece5a00ee6e9d50c7e66c02e1d9bf6af86f3500af38114324b9ccb63d6b6af49dc76f1fdc3689be213583cb45dc31c0b1e3f8bfdc1b5813bc6642f0775304faf65f0330376e9d8b47f2d9c0761166661166661166661166661166661166661166661166661166661166661f69b59dbbe2e71dbc5f17bb44df1092c1edaae638e058f9fc5f1fbeb03778cc95e0eeae039bf9ec1cf0cd8a563d3fef5701e84599885599885599885599885599885599885599885599885599885599885d96f666dfb86e46d87cfe3a06d8a4f60f1d07603732c98fc0cc7ef6f0cdc31267b39a883e7fc46063f3360978e4dfb37c27910666176316bdb37256ebb389f87b6293e81c543db4dccb1e0f1b3d81fdc1cb8634cf6725007cff9cd0c7e66c02e1d9bf66f86f3500af38114324b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc12e7ca89b3b67d4be2b65bc2f17bb44df1092c1eda6e618e058f9fc5f1fb5b03778cc95e0eea609edecae06706ecd2b169ff56380f239df9400a992537868759724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398ad987dcd0b66f4bde76f83c3bdaa6f804160f6db731c782c9cf70fdcbed813bc6642f0775304f6f67f0330376e9d8b44ff6845998a398b5ed3b92b75dc85ab6293e81c543db1dccb160f233ec0fee0cdc31267b39a883e7fc4e063f3360978e4dfb77c279481b339ebf4c72b6c3759b64a3ca7c6add5da65c0dba179a720de85e64caa340f76253ae05dddda63c1a742f01df48f752535e02ba7b4c7915e85e66ca2b41f77253ee02dd2b4cb91374f79af251d0bdd2948f81ee55a6dc0fbafb4cf96ad0bdda94af01dd6b4cf95ad0bdd694af03ddeb4cf97ad0bdde946f00dd1b4cf946d0bdd1946f02dd9b4cf966d0bdd9946f01dd5b4cf956d0dd6fca0b40f75687ee0153be0d740f9af2eda07b9b29ef00dddb4d792ce81e32e571a07b0794e9f39da63c1e74ef32e51ce8de6dca1340f7b029d781ee3da63c1174ef35e57ad0bdcf942781eefda63c19741f30e529a07bc494a782ee83a63c0d741f32e5e9a0fbb029cf00dd474c7926e83e6acab340f731539e0dba8f9bf21cd07dc294e782ee93a63c0f749f32e5f9a07bd494f1fc7eda94ef001df52b77828efa95bb4047fdca0b4147fdca8b4047fdca8b4147fdcadda0a37ee525a0a3bc7b29e828efee011de5ddcb404779f772d051debd02749477f7828ef2ee95a0a3bc7b15e828efee031de5ddab414779f71ad051debd16749477af031de5ddeb414779f706d051debd117494776f021de5dd9b414779f716d051dedd0f3acabbb7828ef2ee01d051de3d08ba06537e1be84e30e5b783ee44537e0874279932f633279bf23b41778a29bf0b74d417be1b74a79af2c3a05b68caef01dd22537e2fe8169bf2fb40b7c494df0fbaa5a6fc01d0359af223a06b32e50f826e99297f08747953fe30e89a4df923a02b98f24741d762ca1f035dab297f1c746da6fc09d0b59bf22741d761ca9f02dd72537e1474741da77e46b767dd2e290e1423ad239f9b1cbe906e0cf8d21d247b4f47b6e8d8b4df028c740e0ac3cf58182a63b3c5a879da18628679455bdc6fa636e06965e061f233fccdd46ef9d462f994833aa7829fed0c7e66c02e1d9bf6dbc136c739c758d49ae32eb4625103755acd454e5f4fe3e248c7d0f95b70f8c215c7668ba7d961bb93398e746cea133b87c17687653b6fd9c66b016d716dbb0398973330ebe376257fdcb06daf30c7a27c263b79f06925c420299fd076c608d9217d0d94b74c19a84bf5281e74ed2476dd8ee85c22bbfdbd36eb7b39a8d3e9f0bf3b48d6ff2e8ba7cb62d6bf27baa70c7030b48730073a2d0edacf43ecba2262d709b1a33a78ed6d648add728b87f61b8187eeafda4147f729c48ff7784dc3c06df77bed0e6ed2750063a383b1903c63789fd56831d27e011849b71c783a9862669feb85567cf09e60b45587be5b037576c17539eba8abdb5d4366c02ffafdff6c906c9f5ecb102f1c9b08203e811543da88614c30307e9124cfb860607ce2587fdfd19ecb7bcfeaedd99b01b41a0b133f330e37aa4087e56a872e08060fc3e070300dc3e070709515161cfea1fafa679c768b863a7a0fedef3ff770efe13d47af3fd2dfbb776bdfe5483dcaa247d2280f901475b48d0906068cba836427826a2d5b71c933063e4727cfd3cce46778d11b6bf9546bf994833aa3e06f6319fccc805d3a36ed8f75d84eb0230a63316e08b118e7e01937ccb1c04177d2614ba5bfe3c44d95e50bb668f4c9cef3441d22830be0f81903a7ffa61bfb28e3cce860e06453efa9ef68f549d0a3b5faaaa54763f5e8abee82f4e8aabea0e9d1533d5aaa4747f568a81efdd4a39d7a74538f66ead14b3d5aa947271b82e2e8a31e6dd4a38b7a34f11460fb36f0ea5ff4fa0aa94703f5e89f1eedd37756fa0e40df8de8bb6f7da7a87f3dea3b04fdab568f70e8abadbe93d157697d65d5778afa0e51dfd1eb3b5c3d43b65ac91a13ebb54a4e5372ba923394ac53b25ec906251b956c52b259c916255b956c53b25dc9994a5e101447f6cf5272b69273949cabe43c25e72bb940c9854a762ab948c9c54a2e5172a992cb94ec52d2a364b7923d4af62ae955b24fc9e54aae50b23f28ae0aba52c9412587941c56d2a7e48892ab82e22c9d9e95d3b3707ad64dcfb2e959353d8ba667cdf42c999e15d3b3607ad64bcf72e959addb82e26c949e89d0330f7aa641cf2ce899043d737077509c19d03301f704c5917e3db2af47f2f5c8bd1ea9d723f37a245e8fbceb91763db2ae47d2f5c8b91e29d723e37a245c8f7ceb916e3db2ad47b2f5c8f5834171645a8f44eb91673dd2ac4796f548b21e397e38288e0ceb91603df2ab477af5c8ae1ec9d523b77aa4568fccea91583df2aa475af5c8aa1e49d523a77aa4548f8cea91d0cf28f9ac92cf29f9bc922f28f9a2922f29f9b292af28f9aa92af29f9ba926f28f9a6926f05c5bcfc8e92ef2af99e92ef2bf981921f2af991921f2bf989929f2af999929f2bf985925f2af995925f2bf98d92df2a794cc9ef94fc5ec91f943caee48f4afea4e409254f2af9b392bf28f9ab92a794fc4dc9df953cade41f4afea9e499606066053b9131a6e7a151fe9efefede4347fa1bfafb1a0e5d7db07fff9183d7375cbbbfff8a86be6b7a8fee3bd8772d7ef9ebe6cb3485b1f6e8d19eeb1bf61fdedb7b5d43dfd5fd0d7dfb1a76f75d7d78ef31fcd213e64b739e6bb167efde6863fff59f90fe4f9946479b3e91268736c5fb36aeba8c804c2ce74badd5e539b4d25c75e8d7fbd9c5bbdd866307fbfa1bf20d87d5bf3d07d5777af73635e0df8ea9201feb6f38d6df73b4bf61dfd1be430dcd4d78dc13c797e144cb9432be74d994a17b1efc3f390dd8cbf1d90300", "privateFunctions": [ { "selector": { @@ -37,8 +37,8 @@ exports[`ContractClass creates a contract class from a contract compilation arti "isInternal": false } ], - "id": "0x2e0b68846797a66afbe01df9748a70b801f95398ae0a7a578d087f2db6a4d57f", + "id": "0x2e00e9b3e778e864cfc790f18f232211f2bda1ee84aa5c4a05bf1b611d432483", "privateFunctionsRoot": "0x2dc1f38d7be98a8e72227d6f8aec393c60db813a1819c9c86b02a00cc18f6687", - "publicBytecodeCommitment": "0x00b38e2fc3eb0f8520f32355d7195aaa2a137dc2f8d2a69748830a05da2e5e5a" + "publicBytecodeCommitment": "0x008b8f64f2c814426b029f755f9fcf7320a4745cb014fdebcb30bdd6c5e64fb2" }" `; diff --git a/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap b/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap index 33361fa429d..5383e76120e 100644 --- a/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap +++ b/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap @@ -2,10 +2,10 @@ exports[`GasToken returns canonical protocol contract 1`] = ` { - "address": AztecAddress<0x1416fe0ac99c3128c1dd0f777d8dbece71e14a6a514d08ecba93844ec2d28331>, + "address": AztecAddress<0x00172847c5512e54f1299e84e95196ac398adcc39068ed534e853ae9b0487e72>, "instance": { - "address": AztecAddress<0x1416fe0ac99c3128c1dd0f777d8dbece71e14a6a514d08ecba93844ec2d28331>, - "contractClassId": Fr<0x02b558e65089476ee9a12f77979e1f823bd88fe6f11523ffaa0af6816467e371>, + "address": AztecAddress<0x00172847c5512e54f1299e84e95196ac398adcc39068ed534e853ae9b0487e72>, + "contractClassId": Fr<0x210658dedea30a0f6a675e0ad7e58d34b6c092c5248f81515391fbe3e1f38398>, "initializationHash": Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, "portalContractAddress": EthAddress<0x0000000000000000000000000000000000000000>, "publicKeysHash": Fr<0x27b1d0839a5b23baf12a8d195b18ac288fcf401afb2f70b8a4b529ede5fa9fed>, @@ -18,10 +18,10 @@ exports[`GasToken returns canonical protocol contract 1`] = ` exports[`GasToken returns canonical protocol contract 2`] = ` { "artifactHash": Fr<0x18af4bb0ca6fe07d0ae6da493b2c7b1af038ee904721dbba9b6e571e6d495726>, - "id": Fr<0x02b558e65089476ee9a12f77979e1f823bd88fe6f11523ffaa0af6816467e371>, + "id": Fr<0x210658dedea30a0f6a675e0ad7e58d34b6c092c5248f81515391fbe3e1f38398>, "privateFunctions": [], "privateFunctionsRoot": Fr<0x15d28cad4c0736decea8997cb324cf0a0e0602f4d74472cd977bce2c8dd9923f>, - "publicBytecodeCommitment": Fr<0x079241a3e691f43ee2832dedbb09a1a1780622509a2e020dba561104758f5e01>, + "publicBytecodeCommitment": Fr<0x01b2b2b29caee37af01f47a994f4182d3f456891d7f27b6f7eed0693934a05c5>, "version": 1, } `;